@f-ewald/components 1.12.0 → 1.13.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.
Files changed (52) hide show
  1. package/README.md +6 -0
  2. package/custom-elements.json +1345 -56
  3. package/dist/auto-scroll.d.ts +37 -0
  4. package/dist/auto-scroll.d.ts.map +1 -0
  5. package/dist/auto-scroll.js +100 -0
  6. package/dist/auto-scroll.js.map +1 -0
  7. package/dist/form-field.d.ts +39 -0
  8. package/dist/form-field.d.ts.map +1 -0
  9. package/dist/form-field.js +145 -0
  10. package/dist/form-field.js.map +1 -0
  11. package/dist/icons.d.ts +1 -0
  12. package/dist/icons.d.ts.map +1 -1
  13. package/dist/icons.js +1 -0
  14. package/dist/icons.js.map +1 -1
  15. package/dist/index.d.ts +6 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +6 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/load-more.d.ts +33 -0
  20. package/dist/load-more.d.ts.map +1 -0
  21. package/dist/load-more.js +82 -0
  22. package/dist/load-more.js.map +1 -0
  23. package/dist/percent-bar-chart.d.ts +32 -3
  24. package/dist/percent-bar-chart.d.ts.map +1 -1
  25. package/dist/percent-bar-chart.js +101 -36
  26. package/dist/percent-bar-chart.js.map +1 -1
  27. package/dist/scroll-to-bottom.d.ts +41 -0
  28. package/dist/scroll-to-bottom.d.ts.map +1 -0
  29. package/dist/scroll-to-bottom.js +189 -0
  30. package/dist/scroll-to-bottom.js.map +1 -0
  31. package/dist/scroll-to-top.d.ts +41 -0
  32. package/dist/scroll-to-top.d.ts.map +1 -0
  33. package/dist/scroll-to-top.js +189 -0
  34. package/dist/scroll-to-top.js.map +1 -0
  35. package/dist/ui-checkbox.d.ts +49 -0
  36. package/dist/ui-checkbox.d.ts.map +1 -0
  37. package/dist/ui-checkbox.js +228 -0
  38. package/dist/ui-checkbox.js.map +1 -0
  39. package/dist/utils/scroll.d.ts +9 -0
  40. package/dist/utils/scroll.d.ts.map +1 -0
  41. package/dist/utils/scroll.js +30 -0
  42. package/dist/utils/scroll.js.map +1 -0
  43. package/docs/auto-scroll.md +52 -0
  44. package/docs/form-field.md +63 -0
  45. package/docs/layouts/form-page.md +8 -4
  46. package/docs/load-more.md +43 -0
  47. package/docs/percent-bar-chart.md +19 -5
  48. package/docs/scroll-to-bottom.md +68 -0
  49. package/docs/scroll-to-top.md +59 -0
  50. package/docs/ui-checkbox.md +58 -0
  51. package/llms.txt +184 -6
  52. package/package.json +1 -1
@@ -1315,6 +1315,148 @@
1315
1315
  }
1316
1316
  ]
1317
1317
  },
1318
+ {
1319
+ "kind": "javascript-module",
1320
+ "path": "src/auto-scroll.ts",
1321
+ "declarations": [
1322
+ {
1323
+ "kind": "class",
1324
+ "description": "Wraps arbitrary slotted content (e.g. `timeline-container`) and keeps it\nscrolled to the bottom as new children are appended — but only while the\nuser is already scrolled near the bottom (\"stick to bottom\", a chat/log-\nviewer convention). If the user has scrolled up to read earlier content,\nnew content does not yank the scroll position back down.\n\nNew content is detected via a `MutationObserver`, so no cooperation from\nwhatever is slotted in is required. The host itself is the scrollable\nregion (`overflow-y: auto`) and needs a consumer-supplied bounded height to\nhave anything to scroll, e.g. `auto-scroll { height: 24rem; }`.",
1325
+ "name": "AutoScroll",
1326
+ "slots": [
1327
+ {
1328
+ "description": "Content to auto-scroll.",
1329
+ "name": ""
1330
+ }
1331
+ ],
1332
+ "members": [
1333
+ {
1334
+ "kind": "field",
1335
+ "name": "threshold",
1336
+ "type": {
1337
+ "text": "number"
1338
+ },
1339
+ "default": "24",
1340
+ "description": "Pixels of tolerance from the bottom edge counted as \"still at the bottom\".",
1341
+ "attribute": "threshold"
1342
+ },
1343
+ {
1344
+ "kind": "field",
1345
+ "name": "_pinned",
1346
+ "type": {
1347
+ "text": "boolean"
1348
+ },
1349
+ "privacy": "private",
1350
+ "default": "true"
1351
+ },
1352
+ {
1353
+ "kind": "field",
1354
+ "name": "#observer",
1355
+ "privacy": "private",
1356
+ "type": {
1357
+ "text": "MutationObserver | undefined"
1358
+ }
1359
+ },
1360
+ {
1361
+ "kind": "field",
1362
+ "name": "pinned",
1363
+ "type": {
1364
+ "text": "boolean"
1365
+ },
1366
+ "description": "Whether the view is currently stuck to the bottom. Read-only; see `scrollToBottom()`.",
1367
+ "readonly": true
1368
+ },
1369
+ {
1370
+ "kind": "method",
1371
+ "name": "scrollToBottom",
1372
+ "return": {
1373
+ "type": {
1374
+ "text": "void"
1375
+ }
1376
+ },
1377
+ "description": "Scrolls to the bottom immediately, regardless of the current `pinned` state."
1378
+ },
1379
+ {
1380
+ "kind": "field",
1381
+ "name": "#onScroll",
1382
+ "privacy": "private"
1383
+ },
1384
+ {
1385
+ "kind": "method",
1386
+ "name": "#onMutation",
1387
+ "privacy": "private",
1388
+ "return": {
1389
+ "type": {
1390
+ "text": "void"
1391
+ }
1392
+ }
1393
+ },
1394
+ {
1395
+ "kind": "method",
1396
+ "name": "#setPinned",
1397
+ "privacy": "private",
1398
+ "return": {
1399
+ "type": {
1400
+ "text": "void"
1401
+ }
1402
+ },
1403
+ "parameters": [
1404
+ {
1405
+ "name": "pinned",
1406
+ "type": {
1407
+ "text": "boolean"
1408
+ }
1409
+ }
1410
+ ]
1411
+ }
1412
+ ],
1413
+ "events": [
1414
+ {
1415
+ "name": "pinned-change",
1416
+ "type": {
1417
+ "text": "CustomEvent"
1418
+ },
1419
+ "description": "The stick-to-bottom state toggled; detail: `{ pinned }`."
1420
+ }
1421
+ ],
1422
+ "attributes": [
1423
+ {
1424
+ "name": "threshold",
1425
+ "type": {
1426
+ "text": "number"
1427
+ },
1428
+ "default": "24",
1429
+ "description": "Pixels of tolerance from the bottom edge counted as \"still at the bottom\".",
1430
+ "fieldName": "threshold"
1431
+ }
1432
+ ],
1433
+ "superclass": {
1434
+ "name": "LitElement",
1435
+ "package": "lit"
1436
+ },
1437
+ "tagName": "auto-scroll",
1438
+ "customElement": true
1439
+ }
1440
+ ],
1441
+ "exports": [
1442
+ {
1443
+ "kind": "js",
1444
+ "name": "AutoScroll",
1445
+ "declaration": {
1446
+ "name": "AutoScroll",
1447
+ "module": "src/auto-scroll.ts"
1448
+ }
1449
+ },
1450
+ {
1451
+ "kind": "custom-element-definition",
1452
+ "name": "auto-scroll",
1453
+ "declaration": {
1454
+ "name": "AutoScroll",
1455
+ "module": "src/auto-scroll.ts"
1456
+ }
1457
+ }
1458
+ ]
1459
+ },
1318
1460
  {
1319
1461
  "kind": "javascript-module",
1320
1462
  "path": "src/autocomplete-input.ts",
@@ -4219,6 +4361,134 @@
4219
4361
  }
4220
4362
  ]
4221
4363
  },
4364
+ {
4365
+ "kind": "javascript-module",
4366
+ "path": "src/form-field.ts",
4367
+ "declarations": [
4368
+ {
4369
+ "kind": "class",
4370
+ "description": "Per-field wrapper for a form control: label, slotted control, and an\noptional hint or error message, in one consistent unit repeated across a\nform. Purely presentational — composes whatever control is slotted\n(`form-select`, `multi-select`, `autocomplete-input`, `ui-checkbox`, etc.)\nwithout intercepting its events or value.\n\nThe label wraps the default slot for a best-effort visual/click\nassociation only: every existing value-entry control encapsulates its\nreal `<input>` inside its own shadow DOM, so there is no light-DOM `id` a\n`for` attribute could target from outside, and this component cannot set\n`aria-describedby`/`aria-invalid` on an arbitrary slotted control's\nshadow-encapsulated input for the same reason. The error message uses\n`role=\"alert\"` as the practical accessibility mitigation instead of true\n`aria-describedby` association.",
4371
+ "name": "FormField",
4372
+ "slots": [
4373
+ {
4374
+ "description": "The wrapped form control.",
4375
+ "name": ""
4376
+ }
4377
+ ],
4378
+ "members": [
4379
+ {
4380
+ "kind": "field",
4381
+ "name": "label",
4382
+ "type": {
4383
+ "text": "string"
4384
+ },
4385
+ "default": "\"\"",
4386
+ "description": "Field label text.",
4387
+ "attribute": "label"
4388
+ },
4389
+ {
4390
+ "kind": "field",
4391
+ "name": "hint",
4392
+ "type": {
4393
+ "text": "string"
4394
+ },
4395
+ "default": "\"\"",
4396
+ "description": "Optional helper text shown below the control when there's no `error`.",
4397
+ "attribute": "hint"
4398
+ },
4399
+ {
4400
+ "kind": "field",
4401
+ "name": "error",
4402
+ "type": {
4403
+ "text": "string"
4404
+ },
4405
+ "default": "\"\"",
4406
+ "description": "Optional error text; replaces the `hint` display when non-empty.",
4407
+ "attribute": "error"
4408
+ },
4409
+ {
4410
+ "kind": "field",
4411
+ "name": "required",
4412
+ "type": {
4413
+ "text": "boolean"
4414
+ },
4415
+ "default": "false",
4416
+ "description": "Shows a required indicator next to the label.",
4417
+ "attribute": "required"
4418
+ },
4419
+ {
4420
+ "kind": "field",
4421
+ "name": "#messageId",
4422
+ "privacy": "private",
4423
+ "readonly": true,
4424
+ "default": "`form-field-message-${++instanceCount}`"
4425
+ }
4426
+ ],
4427
+ "attributes": [
4428
+ {
4429
+ "name": "label",
4430
+ "type": {
4431
+ "text": "string"
4432
+ },
4433
+ "default": "\"\"",
4434
+ "description": "Field label text.",
4435
+ "fieldName": "label"
4436
+ },
4437
+ {
4438
+ "name": "hint",
4439
+ "type": {
4440
+ "text": "string"
4441
+ },
4442
+ "default": "\"\"",
4443
+ "description": "Optional helper text shown below the control when there's no `error`.",
4444
+ "fieldName": "hint"
4445
+ },
4446
+ {
4447
+ "name": "error",
4448
+ "type": {
4449
+ "text": "string"
4450
+ },
4451
+ "default": "\"\"",
4452
+ "description": "Optional error text; replaces the `hint` display when non-empty.",
4453
+ "fieldName": "error"
4454
+ },
4455
+ {
4456
+ "name": "required",
4457
+ "type": {
4458
+ "text": "boolean"
4459
+ },
4460
+ "default": "false",
4461
+ "description": "Shows a required indicator next to the label.",
4462
+ "fieldName": "required"
4463
+ }
4464
+ ],
4465
+ "superclass": {
4466
+ "name": "LitElement",
4467
+ "package": "lit"
4468
+ },
4469
+ "tagName": "form-field",
4470
+ "customElement": true
4471
+ }
4472
+ ],
4473
+ "exports": [
4474
+ {
4475
+ "kind": "js",
4476
+ "name": "FormField",
4477
+ "declaration": {
4478
+ "name": "FormField",
4479
+ "module": "src/form-field.ts"
4480
+ }
4481
+ },
4482
+ {
4483
+ "kind": "custom-element-definition",
4484
+ "name": "form-field",
4485
+ "declaration": {
4486
+ "name": "FormField",
4487
+ "module": "src/form-field.ts"
4488
+ }
4489
+ }
4490
+ ]
4491
+ },
4222
4492
  {
4223
4493
  "kind": "javascript-module",
4224
4494
  "path": "src/form-select.ts",
@@ -5226,6 +5496,16 @@
5226
5496
  }
5227
5497
  ]
5228
5498
  },
5499
+ {
5500
+ "kind": "function",
5501
+ "name": "iconChevronUp",
5502
+ "parameters": [
5503
+ {
5504
+ "name": "size",
5505
+ "default": "16"
5506
+ }
5507
+ ]
5508
+ },
5229
5509
  {
5230
5510
  "kind": "function",
5231
5511
  "name": "iconCog",
@@ -5700,6 +5980,14 @@
5700
5980
  "module": "src/icons.ts"
5701
5981
  }
5702
5982
  },
5983
+ {
5984
+ "kind": "js",
5985
+ "name": "iconChevronUp",
5986
+ "declaration": {
5987
+ "name": "iconChevronUp",
5988
+ "module": "src/icons.ts"
5989
+ }
5990
+ },
5703
5991
  {
5704
5992
  "kind": "js",
5705
5993
  "name": "iconCog",
@@ -6187,6 +6475,22 @@
6187
6475
  "module": "./toast-notification.js"
6188
6476
  }
6189
6477
  },
6478
+ {
6479
+ "kind": "js",
6480
+ "name": "ScrollToBottom",
6481
+ "declaration": {
6482
+ "name": "ScrollToBottom",
6483
+ "module": "./scroll-to-bottom.js"
6484
+ }
6485
+ },
6486
+ {
6487
+ "kind": "js",
6488
+ "name": "ScrollToTop",
6489
+ "declaration": {
6490
+ "name": "ScrollToTop",
6491
+ "module": "./scroll-to-top.js"
6492
+ }
6493
+ },
6190
6494
  {
6191
6495
  "kind": "js",
6192
6496
  "name": "SlidePanel",
@@ -6443,6 +6747,14 @@
6443
6747
  "module": "./live-timer.js"
6444
6748
  }
6445
6749
  },
6750
+ {
6751
+ "kind": "js",
6752
+ "name": "LoadMore",
6753
+ "declaration": {
6754
+ "name": "LoadMore",
6755
+ "module": "./load-more.js"
6756
+ }
6757
+ },
6446
6758
  {
6447
6759
  "kind": "js",
6448
6760
  "name": "ChatMessage",
@@ -6467,6 +6779,22 @@
6467
6779
  "module": "./chat-message.js"
6468
6780
  }
6469
6781
  },
6782
+ {
6783
+ "kind": "js",
6784
+ "name": "UiCheckbox",
6785
+ "declaration": {
6786
+ "name": "UiCheckbox",
6787
+ "module": "./ui-checkbox.js"
6788
+ }
6789
+ },
6790
+ {
6791
+ "kind": "js",
6792
+ "name": "FormField",
6793
+ "declaration": {
6794
+ "name": "FormField",
6795
+ "module": "./form-field.js"
6796
+ }
6797
+ },
6470
6798
  {
6471
6799
  "kind": "js",
6472
6800
  "name": "FormSelect",
@@ -6805,9 +7133,17 @@
6805
7133
  },
6806
7134
  {
6807
7135
  "kind": "js",
6808
- "name": "formatDuration",
7136
+ "name": "AutoScroll",
6809
7137
  "declaration": {
6810
- "name": "formatDuration",
7138
+ "name": "AutoScroll",
7139
+ "module": "./auto-scroll.js"
7140
+ }
7141
+ },
7142
+ {
7143
+ "kind": "js",
7144
+ "name": "formatDuration",
7145
+ "declaration": {
7146
+ "name": "formatDuration",
6811
7147
  "module": "./utils/duration.js"
6812
7148
  }
6813
7149
  },
@@ -8086,6 +8422,159 @@
8086
8422
  }
8087
8423
  ]
8088
8424
  },
8425
+ {
8426
+ "kind": "javascript-module",
8427
+ "path": "src/load-more.ts",
8428
+ "declarations": [
8429
+ {
8430
+ "kind": "class",
8431
+ "description": "Click-to-load button for either end of a list. Fully property-driven: the\nconsumer sets `loading` while a fetch is in flight and `exhausted` once\nthere's nothing left to load; this component never fetches or manages\nstate itself.",
8432
+ "name": "LoadMore",
8433
+ "members": [
8434
+ {
8435
+ "kind": "field",
8436
+ "name": "direction",
8437
+ "type": {
8438
+ "text": "\"top\" | \"bottom\""
8439
+ },
8440
+ "default": "\"bottom\"",
8441
+ "description": "Which end of a list this instance loads more content for.",
8442
+ "attribute": "direction"
8443
+ },
8444
+ {
8445
+ "kind": "field",
8446
+ "name": "loading",
8447
+ "type": {
8448
+ "text": "boolean"
8449
+ },
8450
+ "default": "false",
8451
+ "description": "Consumer-managed busy flag, forwarded to the internal `ui-button`'s `busy`.",
8452
+ "attribute": "loading"
8453
+ },
8454
+ {
8455
+ "kind": "field",
8456
+ "name": "exhausted",
8457
+ "type": {
8458
+ "text": "boolean"
8459
+ },
8460
+ "default": "false",
8461
+ "description": "Terminal \"no more content\" state: disables the button and swaps its label.",
8462
+ "attribute": "exhausted"
8463
+ },
8464
+ {
8465
+ "kind": "field",
8466
+ "name": "label",
8467
+ "type": {
8468
+ "text": "string"
8469
+ },
8470
+ "default": "\"Load more\"",
8471
+ "description": "Button text in the normal (loadable) state.",
8472
+ "attribute": "label"
8473
+ },
8474
+ {
8475
+ "kind": "field",
8476
+ "name": "exhaustedLabel",
8477
+ "type": {
8478
+ "text": "string"
8479
+ },
8480
+ "default": "\"No more results\"",
8481
+ "description": "Button text shown once `exhausted` is true.",
8482
+ "attribute": "exhausted-label"
8483
+ },
8484
+ {
8485
+ "kind": "method",
8486
+ "name": "#onClick",
8487
+ "privacy": "private",
8488
+ "return": {
8489
+ "type": {
8490
+ "text": "void"
8491
+ }
8492
+ }
8493
+ }
8494
+ ],
8495
+ "events": [
8496
+ {
8497
+ "name": "load-more",
8498
+ "type": {
8499
+ "text": "CustomEvent"
8500
+ },
8501
+ "description": "The button was clicked while not `loading`/`exhausted`; detail: `{ direction }`."
8502
+ }
8503
+ ],
8504
+ "attributes": [
8505
+ {
8506
+ "name": "direction",
8507
+ "type": {
8508
+ "text": "\"top\" | \"bottom\""
8509
+ },
8510
+ "default": "\"bottom\"",
8511
+ "description": "Which end of a list this instance loads more content for.",
8512
+ "fieldName": "direction"
8513
+ },
8514
+ {
8515
+ "name": "loading",
8516
+ "type": {
8517
+ "text": "boolean"
8518
+ },
8519
+ "default": "false",
8520
+ "description": "Consumer-managed busy flag, forwarded to the internal `ui-button`'s `busy`.",
8521
+ "fieldName": "loading"
8522
+ },
8523
+ {
8524
+ "name": "exhausted",
8525
+ "type": {
8526
+ "text": "boolean"
8527
+ },
8528
+ "default": "false",
8529
+ "description": "Terminal \"no more content\" state: disables the button and swaps its label.",
8530
+ "fieldName": "exhausted"
8531
+ },
8532
+ {
8533
+ "name": "label",
8534
+ "type": {
8535
+ "text": "string"
8536
+ },
8537
+ "default": "\"Load more\"",
8538
+ "description": "Button text in the normal (loadable) state.",
8539
+ "fieldName": "label"
8540
+ },
8541
+ {
8542
+ "name": "exhausted-label",
8543
+ "type": {
8544
+ "text": "string"
8545
+ },
8546
+ "default": "\"No more results\"",
8547
+ "description": "Button text shown once `exhausted` is true.",
8548
+ "fieldName": "exhaustedLabel"
8549
+ }
8550
+ ],
8551
+ "superclass": {
8552
+ "name": "LitElement",
8553
+ "package": "lit"
8554
+ },
8555
+ "tagName": "load-more",
8556
+ "customElement": true
8557
+ }
8558
+ ],
8559
+ "exports": [
8560
+ {
8561
+ "kind": "js",
8562
+ "name": "LoadMore",
8563
+ "declaration": {
8564
+ "name": "LoadMore",
8565
+ "module": "src/load-more.ts"
8566
+ }
8567
+ },
8568
+ {
8569
+ "kind": "custom-element-definition",
8570
+ "name": "load-more",
8571
+ "declaration": {
8572
+ "name": "LoadMore",
8573
+ "module": "src/load-more.ts"
8574
+ }
8575
+ }
8576
+ ]
8577
+ },
8089
8578
  {
8090
8579
  "kind": "javascript-module",
8091
8580
  "path": "src/map-circle.ts",
@@ -9691,7 +10180,7 @@
9691
10180
  "declarations": [
9692
10181
  {
9693
10182
  "kind": "class",
9694
- "description": "Horizontal bar chart for labeled percentage rows, using D3's linear scale.\nEach group gets its own labeled row; bars are proportional to percentage of 100.",
10183
+ "description": "Bar chart for labeled rows, using D3's linear scale. Horizontal (default)\nrenders stacked rows with bars growing rightward; `orientation=\"vertical\"`\nrenders side-by-side columns growing upward instead. `mode=\"percent\"`\n(default) scales `value` against a fixed 0-100 domain and labels it with a\n`%` suffix; `mode=\"value\"` scales it against `max` (or the largest `value`\npresent) and formats it with `valueFormat`.",
9695
10184
  "name": "PercentBarChart",
9696
10185
  "members": [
9697
10186
  {
@@ -9703,6 +10192,43 @@
9703
10192
  "default": "[]",
9704
10193
  "description": "Rows to render, one per group."
9705
10194
  },
10195
+ {
10196
+ "kind": "field",
10197
+ "name": "mode",
10198
+ "type": {
10199
+ "text": "PercentBarMode"
10200
+ },
10201
+ "default": "\"percent\"",
10202
+ "description": "Whether `value` is a 0-100 percentage (fixed domain) or an arbitrary number (domain from data/`max`).",
10203
+ "attribute": "mode"
10204
+ },
10205
+ {
10206
+ "kind": "field",
10207
+ "name": "orientation",
10208
+ "type": {
10209
+ "text": "PercentBarOrientation"
10210
+ },
10211
+ "default": "\"horizontal\"",
10212
+ "description": "Bar direction: stacked rows growing rightward, or columns growing upward.",
10213
+ "attribute": "orientation"
10214
+ },
10215
+ {
10216
+ "kind": "field",
10217
+ "name": "max",
10218
+ "type": {
10219
+ "text": "number | undefined"
10220
+ },
10221
+ "description": "Explicit domain max for `mode=\"value\"`; auto-computed from `groups` when unset. Ignored in `mode=\"percent\"`.",
10222
+ "attribute": "max"
10223
+ },
10224
+ {
10225
+ "kind": "field",
10226
+ "name": "valueFormat",
10227
+ "type": {
10228
+ "text": "(value: number) => string"
10229
+ },
10230
+ "description": "Formats a row's value for its label in `mode=\"value\"`. Defaults to locale-formatted number."
10231
+ },
9706
10232
  {
9707
10233
  "kind": "field",
9708
10234
  "name": "_width",
@@ -9746,6 +10272,79 @@
9746
10272
  }
9747
10273
  ],
9748
10274
  "description": "Per-row gradient id, unique across instances and rows."
10275
+ },
10276
+ {
10277
+ "kind": "method",
10278
+ "name": "_labelFor",
10279
+ "privacy": "private",
10280
+ "return": {
10281
+ "type": {
10282
+ "text": "string"
10283
+ }
10284
+ },
10285
+ "parameters": [
10286
+ {
10287
+ "name": "value",
10288
+ "type": {
10289
+ "text": "number"
10290
+ }
10291
+ }
10292
+ ],
10293
+ "description": "The row's value formatted for display, per the current `mode`."
10294
+ },
10295
+ {
10296
+ "kind": "method",
10297
+ "name": "_domainMax",
10298
+ "privacy": "private",
10299
+ "return": {
10300
+ "type": {
10301
+ "text": "number"
10302
+ }
10303
+ },
10304
+ "description": "The scale domain's upper bound for the current `mode`."
10305
+ },
10306
+ {
10307
+ "kind": "method",
10308
+ "name": "_renderGradients",
10309
+ "privacy": "private"
10310
+ },
10311
+ {
10312
+ "kind": "method",
10313
+ "name": "_renderHorizontal",
10314
+ "privacy": "private"
10315
+ },
10316
+ {
10317
+ "kind": "method",
10318
+ "name": "_renderVertical",
10319
+ "privacy": "private"
10320
+ }
10321
+ ],
10322
+ "attributes": [
10323
+ {
10324
+ "name": "mode",
10325
+ "type": {
10326
+ "text": "PercentBarMode"
10327
+ },
10328
+ "default": "\"percent\"",
10329
+ "description": "Whether `value` is a 0-100 percentage (fixed domain) or an arbitrary number (domain from data/`max`).",
10330
+ "fieldName": "mode"
10331
+ },
10332
+ {
10333
+ "name": "orientation",
10334
+ "type": {
10335
+ "text": "PercentBarOrientation"
10336
+ },
10337
+ "default": "\"horizontal\"",
10338
+ "description": "Bar direction: stacked rows growing rightward, or columns growing upward.",
10339
+ "fieldName": "orientation"
10340
+ },
10341
+ {
10342
+ "name": "max",
10343
+ "type": {
10344
+ "text": "number | undefined"
10345
+ },
10346
+ "description": "Explicit domain max for `mode=\"value\"`; auto-computed from `groups` when unset. Ignored in `mode=\"percent\"`.",
10347
+ "fieldName": "max"
9749
10348
  }
9750
10349
  ],
9751
10350
  "superclass": {
@@ -11257,67 +11856,363 @@
11257
11856
  },
11258
11857
  {
11259
11858
  "kind": "javascript-module",
11260
- "path": "src/slide-panel.ts",
11859
+ "path": "src/scroll-to-bottom.ts",
11261
11860
  "declarations": [
11262
11861
  {
11263
11862
  "kind": "class",
11264
- "description": "Generic sliding panel shell. Handles positioning, open/close animation,\nheader chrome, and a close button. Body content is provided via the\ndefault slot; the consumer controls its own padding and overflow.\n\nDesktop: fixed right-side panel that slides from the right.\nMobile (≤48rem): bottom-sheet drawer (60vh) — reserved for future use.",
11265
- "name": "SlidePanel",
11863
+ "description": "Overlay button that appears once the page (or a given `target` container)\nhas scrolled more than `threshold` pixels away from the bottom edge, and\nscrolls back to the bottom on click.\n\nWith no `target` (default), the button is `position: fixed` to the\nviewport. When `target` is set, the button switches to `position:\nabsolute` and expects to be placed as a descendant of a `position:\nrelative` (or otherwise positioned) ancestor that establishes the visual\nbounds to float within typically `target` itself, given `overflow-y:\nauto; position: relative`, so the button stays pinned to that container's\nown visible corner as its content scrolls, rather than floating over the\nwhole page.",
11864
+ "name": "ScrollToBottom",
11266
11865
  "members": [
11267
11866
  {
11268
11867
  "kind": "field",
11269
- "name": "open",
11868
+ "name": "target",
11270
11869
  "type": {
11271
- "text": "boolean"
11870
+ "text": "HTMLElement | null"
11272
11871
  },
11273
- "default": "false",
11274
- "description": "Whether the panel is currently visible.",
11275
- "attribute": "open"
11872
+ "default": "null",
11873
+ "description": "Scrollable container to control; `null` (default) scrolls `window`."
11276
11874
  },
11277
11875
  {
11278
11876
  "kind": "field",
11279
- "name": "heading",
11877
+ "name": "threshold",
11878
+ "type": {
11879
+ "text": "number"
11880
+ },
11881
+ "default": "200",
11882
+ "description": "Pixels scrolled away from the bottom before the button appears.",
11883
+ "attribute": "threshold"
11884
+ },
11885
+ {
11886
+ "kind": "field",
11887
+ "name": "label",
11280
11888
  "type": {
11281
11889
  "text": "string"
11282
11890
  },
11283
- "default": "\"\"",
11284
- "description": "Title text shown in the panel header (overridable via slot=\"title\").",
11285
- "attribute": "heading"
11891
+ "default": "\"Scroll to bottom\"",
11892
+ "description": "Visible button text, and its accessible name.",
11893
+ "attribute": "label"
11286
11894
  },
11287
11895
  {
11288
11896
  "kind": "field",
11289
- "name": "_previousFocus",
11897
+ "name": "_visible",
11290
11898
  "type": {
11291
- "text": "HTMLElement | null"
11899
+ "text": "boolean"
11292
11900
  },
11293
11901
  "privacy": "private",
11902
+ "default": "false"
11903
+ },
11904
+ {
11905
+ "kind": "field",
11906
+ "name": "#listenedTo",
11907
+ "privacy": "private",
11908
+ "type": {
11909
+ "text": "HTMLElement | Window | null"
11910
+ },
11294
11911
  "default": "null"
11295
11912
  },
11296
11913
  {
11297
11914
  "kind": "method",
11298
- "name": "_close",
11299
- "privacy": "private"
11915
+ "name": "#subscribe",
11916
+ "privacy": "private",
11917
+ "return": {
11918
+ "type": {
11919
+ "text": "void"
11920
+ }
11921
+ }
11922
+ },
11923
+ {
11924
+ "kind": "method",
11925
+ "name": "#unsubscribe",
11926
+ "privacy": "private",
11927
+ "return": {
11928
+ "type": {
11929
+ "text": "void"
11930
+ }
11931
+ }
11300
11932
  },
11301
11933
  {
11302
11934
  "kind": "field",
11303
- "name": "_onWindowKeydown",
11935
+ "name": "#onScroll",
11304
11936
  "privacy": "private"
11937
+ },
11938
+ {
11939
+ "kind": "method",
11940
+ "name": "#onClick",
11941
+ "privacy": "private",
11942
+ "return": {
11943
+ "type": {
11944
+ "text": "void"
11945
+ }
11946
+ }
11305
11947
  }
11306
11948
  ],
11307
11949
  "events": [
11308
11950
  {
11309
- "name": "panel-close",
11951
+ "name": "scroll-to-bottom-triggered",
11310
11952
  "type": {
11311
11953
  "text": "CustomEvent"
11312
11954
  },
11313
- "description": "User clicked the close (✕) button."
11955
+ "description": "The button was clicked, just before scrolling; detail: `{ target }`."
11314
11956
  }
11315
11957
  ],
11316
11958
  "attributes": [
11317
11959
  {
11318
- "name": "open",
11960
+ "name": "threshold",
11319
11961
  "type": {
11320
- "text": "boolean"
11962
+ "text": "number"
11963
+ },
11964
+ "default": "200",
11965
+ "description": "Pixels scrolled away from the bottom before the button appears.",
11966
+ "fieldName": "threshold"
11967
+ },
11968
+ {
11969
+ "name": "label",
11970
+ "type": {
11971
+ "text": "string"
11972
+ },
11973
+ "default": "\"Scroll to bottom\"",
11974
+ "description": "Visible button text, and its accessible name.",
11975
+ "fieldName": "label"
11976
+ }
11977
+ ],
11978
+ "superclass": {
11979
+ "name": "LitElement",
11980
+ "package": "lit"
11981
+ },
11982
+ "tagName": "scroll-to-bottom",
11983
+ "customElement": true
11984
+ }
11985
+ ],
11986
+ "exports": [
11987
+ {
11988
+ "kind": "js",
11989
+ "name": "ScrollToBottom",
11990
+ "declaration": {
11991
+ "name": "ScrollToBottom",
11992
+ "module": "src/scroll-to-bottom.ts"
11993
+ }
11994
+ },
11995
+ {
11996
+ "kind": "custom-element-definition",
11997
+ "name": "scroll-to-bottom",
11998
+ "declaration": {
11999
+ "name": "ScrollToBottom",
12000
+ "module": "src/scroll-to-bottom.ts"
12001
+ }
12002
+ }
12003
+ ]
12004
+ },
12005
+ {
12006
+ "kind": "javascript-module",
12007
+ "path": "src/scroll-to-top.ts",
12008
+ "declarations": [
12009
+ {
12010
+ "kind": "class",
12011
+ "description": "Overlay button that appears once the page (or a given `target` container)\nhas scrolled more than `threshold` pixels away from the top edge, and\nscrolls back to the top on click.\n\nWith no `target` (default), the button is `position: fixed` to the\nviewport. When `target` is set, the button switches to `position:\nabsolute` and expects to be placed as a descendant of a `position:\nrelative` (or otherwise positioned) ancestor that establishes the visual\nbounds to float within — typically `target` itself, given `overflow-y:\nauto; position: relative`, so the button stays pinned to that container's\nown visible corner as its content scrolls, rather than floating over the\nwhole page.",
12012
+ "name": "ScrollToTop",
12013
+ "members": [
12014
+ {
12015
+ "kind": "field",
12016
+ "name": "target",
12017
+ "type": {
12018
+ "text": "HTMLElement | null"
12019
+ },
12020
+ "default": "null",
12021
+ "description": "Scrollable container to control; `null` (default) scrolls `window`."
12022
+ },
12023
+ {
12024
+ "kind": "field",
12025
+ "name": "threshold",
12026
+ "type": {
12027
+ "text": "number"
12028
+ },
12029
+ "default": "200",
12030
+ "description": "Pixels scrolled away from the top before the button appears.",
12031
+ "attribute": "threshold"
12032
+ },
12033
+ {
12034
+ "kind": "field",
12035
+ "name": "label",
12036
+ "type": {
12037
+ "text": "string"
12038
+ },
12039
+ "default": "\"Scroll to top\"",
12040
+ "description": "Visible button text, and its accessible name.",
12041
+ "attribute": "label"
12042
+ },
12043
+ {
12044
+ "kind": "field",
12045
+ "name": "_visible",
12046
+ "type": {
12047
+ "text": "boolean"
12048
+ },
12049
+ "privacy": "private",
12050
+ "default": "false"
12051
+ },
12052
+ {
12053
+ "kind": "field",
12054
+ "name": "#listenedTo",
12055
+ "privacy": "private",
12056
+ "type": {
12057
+ "text": "HTMLElement | Window | null"
12058
+ },
12059
+ "default": "null"
12060
+ },
12061
+ {
12062
+ "kind": "method",
12063
+ "name": "#subscribe",
12064
+ "privacy": "private",
12065
+ "return": {
12066
+ "type": {
12067
+ "text": "void"
12068
+ }
12069
+ }
12070
+ },
12071
+ {
12072
+ "kind": "method",
12073
+ "name": "#unsubscribe",
12074
+ "privacy": "private",
12075
+ "return": {
12076
+ "type": {
12077
+ "text": "void"
12078
+ }
12079
+ }
12080
+ },
12081
+ {
12082
+ "kind": "field",
12083
+ "name": "#onScroll",
12084
+ "privacy": "private"
12085
+ },
12086
+ {
12087
+ "kind": "method",
12088
+ "name": "#onClick",
12089
+ "privacy": "private",
12090
+ "return": {
12091
+ "type": {
12092
+ "text": "void"
12093
+ }
12094
+ }
12095
+ }
12096
+ ],
12097
+ "events": [
12098
+ {
12099
+ "name": "scroll-to-top-triggered",
12100
+ "type": {
12101
+ "text": "CustomEvent"
12102
+ },
12103
+ "description": "The button was clicked, just before scrolling; detail: `{ target }`."
12104
+ }
12105
+ ],
12106
+ "attributes": [
12107
+ {
12108
+ "name": "threshold",
12109
+ "type": {
12110
+ "text": "number"
12111
+ },
12112
+ "default": "200",
12113
+ "description": "Pixels scrolled away from the top before the button appears.",
12114
+ "fieldName": "threshold"
12115
+ },
12116
+ {
12117
+ "name": "label",
12118
+ "type": {
12119
+ "text": "string"
12120
+ },
12121
+ "default": "\"Scroll to top\"",
12122
+ "description": "Visible button text, and its accessible name.",
12123
+ "fieldName": "label"
12124
+ }
12125
+ ],
12126
+ "superclass": {
12127
+ "name": "LitElement",
12128
+ "package": "lit"
12129
+ },
12130
+ "tagName": "scroll-to-top",
12131
+ "customElement": true
12132
+ }
12133
+ ],
12134
+ "exports": [
12135
+ {
12136
+ "kind": "js",
12137
+ "name": "ScrollToTop",
12138
+ "declaration": {
12139
+ "name": "ScrollToTop",
12140
+ "module": "src/scroll-to-top.ts"
12141
+ }
12142
+ },
12143
+ {
12144
+ "kind": "custom-element-definition",
12145
+ "name": "scroll-to-top",
12146
+ "declaration": {
12147
+ "name": "ScrollToTop",
12148
+ "module": "src/scroll-to-top.ts"
12149
+ }
12150
+ }
12151
+ ]
12152
+ },
12153
+ {
12154
+ "kind": "javascript-module",
12155
+ "path": "src/slide-panel.ts",
12156
+ "declarations": [
12157
+ {
12158
+ "kind": "class",
12159
+ "description": "Generic sliding panel shell. Handles positioning, open/close animation,\nheader chrome, and a close button. Body content is provided via the\ndefault slot; the consumer controls its own padding and overflow.\n\nDesktop: fixed right-side panel that slides from the right.\nMobile (≤48rem): bottom-sheet drawer (60vh) — reserved for future use.",
12160
+ "name": "SlidePanel",
12161
+ "members": [
12162
+ {
12163
+ "kind": "field",
12164
+ "name": "open",
12165
+ "type": {
12166
+ "text": "boolean"
12167
+ },
12168
+ "default": "false",
12169
+ "description": "Whether the panel is currently visible.",
12170
+ "attribute": "open"
12171
+ },
12172
+ {
12173
+ "kind": "field",
12174
+ "name": "heading",
12175
+ "type": {
12176
+ "text": "string"
12177
+ },
12178
+ "default": "\"\"",
12179
+ "description": "Title text shown in the panel header (overridable via slot=\"title\").",
12180
+ "attribute": "heading"
12181
+ },
12182
+ {
12183
+ "kind": "field",
12184
+ "name": "_previousFocus",
12185
+ "type": {
12186
+ "text": "HTMLElement | null"
12187
+ },
12188
+ "privacy": "private",
12189
+ "default": "null"
12190
+ },
12191
+ {
12192
+ "kind": "method",
12193
+ "name": "_close",
12194
+ "privacy": "private"
12195
+ },
12196
+ {
12197
+ "kind": "field",
12198
+ "name": "_onWindowKeydown",
12199
+ "privacy": "private"
12200
+ }
12201
+ ],
12202
+ "events": [
12203
+ {
12204
+ "name": "panel-close",
12205
+ "type": {
12206
+ "text": "CustomEvent"
12207
+ },
12208
+ "description": "User clicked the close (✕) button."
12209
+ }
12210
+ ],
12211
+ "attributes": [
12212
+ {
12213
+ "name": "open",
12214
+ "type": {
12215
+ "text": "boolean"
11321
12216
  },
11322
12217
  "default": "false",
11323
12218
  "description": "Whether the panel is currently visible.",
@@ -12750,69 +13645,371 @@
12750
13645
  },
12751
13646
  {
12752
13647
  "kind": "javascript-module",
12753
- "path": "src/user-avatar.ts",
13648
+ "path": "src/ui-checkbox.ts",
12754
13649
  "declarations": [
12755
13650
  {
12756
13651
  "kind": "class",
12757
- "description": "Circular avatar. Shows `src` when it loads successfully; falls back to the\nfirst letter of `name` (uppercased) if `src` is unset or fails to load\n(e.g. an expired OAuth profile-photo URL); falls back further to a generic\nperson icon if `name` is also unset. A broken image never leaves a blank\ncircle.",
12758
- "name": "UserAvatar",
13652
+ "description": "A form-associated boolean checkbox, usable standalone or inside a native\n`<form>`. Submits `name=on` when checked (matching native\n`<input type=\"checkbox\">` semantics) and participates fully in form\n`reset()`, ancestor `<fieldset disabled>`, and `required` validity.\n\nRenders a native `<input type=\"checkbox\">` wrapped in a `<label>`, styled\nvia `:has()` on the wrapping label (matching `radio-pills`/`radio-cards`)\nrather than styling the native input directly; the checkbox itself renders\nat `1rem`, matching the existing radio-input convention.",
13653
+ "name": "UiCheckbox",
12759
13654
  "members": [
12760
13655
  {
12761
13656
  "kind": "field",
12762
- "name": "src",
13657
+ "name": "formAssociated",
12763
13658
  "type": {
12764
- "text": "string | null"
13659
+ "text": "boolean"
12765
13660
  },
12766
- "default": "null",
12767
- "description": "Image URL to show. Falls back to initials/icon if unset or it fails to load.",
12768
- "attribute": "src"
13661
+ "static": true,
13662
+ "default": "true"
12769
13663
  },
12770
13664
  {
12771
13665
  "kind": "field",
12772
- "name": "name",
13666
+ "name": "checked",
12773
13667
  "type": {
12774
- "text": "string | null"
13668
+ "text": "boolean"
12775
13669
  },
12776
- "default": "null",
12777
- "description": "Source string for the fallback initial (e.g. a display name or email) — first character, uppercased.",
12778
- "attribute": "name"
13670
+ "default": "false",
13671
+ "description": "Whether the box is checked.",
13672
+ "attribute": "checked"
12779
13673
  },
12780
13674
  {
12781
13675
  "kind": "field",
12782
- "name": "size",
13676
+ "name": "indeterminate",
12783
13677
  "type": {
12784
- "text": "string | number"
13678
+ "text": "boolean"
12785
13679
  },
12786
- "default": "32",
12787
- "description": "Diameter in CSS pixels, or a preset name (`xs`=18, `sm`=24, `md`=32, `lg`=48).",
12788
- "attribute": "size"
13680
+ "default": "false",
13681
+ "description": "Visual \"partial selection\" state; cleared on the next user interaction.",
13682
+ "attribute": "indeterminate"
12789
13683
  },
12790
13684
  {
12791
13685
  "kind": "field",
12792
- "name": "_imgError",
13686
+ "name": "disabled",
12793
13687
  "type": {
12794
13688
  "text": "boolean"
12795
13689
  },
12796
- "privacy": "private",
12797
- "default": "false"
13690
+ "default": "false",
13691
+ "description": "Disables interaction; merged with an ancestor `<fieldset disabled>`.",
13692
+ "attribute": "disabled"
12798
13693
  },
12799
13694
  {
12800
13695
  "kind": "field",
12801
- "name": "SIZE_PRESETS",
13696
+ "name": "required",
12802
13697
  "type": {
12803
- "text": "Record<string, number>"
13698
+ "text": "boolean"
12804
13699
  },
12805
- "privacy": "private",
12806
- "static": true,
12807
- "readonly": true,
12808
- "default": "{ xs: 18, sm: 24, md: 32, lg: 48, }"
13700
+ "default": "false",
13701
+ "description": "Marks the control invalid via `ElementInternals` while unchecked.",
13702
+ "attribute": "required"
12809
13703
  },
12810
13704
  {
12811
- "kind": "method",
12812
- "name": "resolveSize",
12813
- "privacy": "private",
12814
- "return": {
12815
- "type": {
13705
+ "kind": "field",
13706
+ "name": "name",
13707
+ "type": {
13708
+ "text": "string"
13709
+ },
13710
+ "default": "\"\"",
13711
+ "description": "Form field name; submitted as `name=on` only while checked.",
13712
+ "attribute": "name"
13713
+ },
13714
+ {
13715
+ "kind": "field",
13716
+ "name": "label",
13717
+ "type": {
13718
+ "text": "string"
13719
+ },
13720
+ "default": "\"\"",
13721
+ "description": "Visible label text rendered next to the box.",
13722
+ "attribute": "label"
13723
+ },
13724
+ {
13725
+ "kind": "field",
13726
+ "name": "_formDisabled",
13727
+ "type": {
13728
+ "text": "boolean"
13729
+ },
13730
+ "privacy": "private",
13731
+ "default": "false"
13732
+ },
13733
+ {
13734
+ "kind": "field",
13735
+ "name": "#internals",
13736
+ "privacy": "private"
13737
+ },
13738
+ {
13739
+ "kind": "field",
13740
+ "name": "#defaultChecked",
13741
+ "privacy": "private",
13742
+ "type": {
13743
+ "text": "boolean"
13744
+ },
13745
+ "default": "false"
13746
+ },
13747
+ {
13748
+ "kind": "field",
13749
+ "name": "#inputEl",
13750
+ "privacy": "private",
13751
+ "type": {
13752
+ "text": "HTMLInputElement | null"
13753
+ },
13754
+ "default": "null"
13755
+ },
13756
+ {
13757
+ "kind": "field",
13758
+ "name": "#isDisabled",
13759
+ "privacy": "private",
13760
+ "type": {
13761
+ "text": "boolean"
13762
+ },
13763
+ "description": "Whether the host or an ancestor fieldset currently disables the control.",
13764
+ "readonly": true
13765
+ },
13766
+ {
13767
+ "kind": "method",
13768
+ "name": "formResetCallback",
13769
+ "return": {
13770
+ "type": {
13771
+ "text": "void"
13772
+ }
13773
+ },
13774
+ "description": "Restores the checked state captured at first render, per the form contract."
13775
+ },
13776
+ {
13777
+ "kind": "method",
13778
+ "name": "formDisabledCallback",
13779
+ "return": {
13780
+ "type": {
13781
+ "text": "void"
13782
+ }
13783
+ },
13784
+ "parameters": [
13785
+ {
13786
+ "name": "disabled",
13787
+ "type": {
13788
+ "text": "boolean"
13789
+ }
13790
+ }
13791
+ ],
13792
+ "description": "Mirrors an ancestor fieldset's disabled state."
13793
+ },
13794
+ {
13795
+ "kind": "method",
13796
+ "name": "formStateRestoreCallback",
13797
+ "return": {
13798
+ "type": {
13799
+ "text": "void"
13800
+ }
13801
+ },
13802
+ "parameters": [
13803
+ {
13804
+ "name": "state",
13805
+ "type": {
13806
+ "text": "string | File | FormData | null"
13807
+ }
13808
+ }
13809
+ ],
13810
+ "description": "Restores the checked state from saved form state (bfcache/autofill)."
13811
+ },
13812
+ {
13813
+ "kind": "method",
13814
+ "name": "#syncFormValue",
13815
+ "privacy": "private",
13816
+ "return": {
13817
+ "type": {
13818
+ "text": "void"
13819
+ }
13820
+ }
13821
+ },
13822
+ {
13823
+ "kind": "method",
13824
+ "name": "#syncValidity",
13825
+ "privacy": "private",
13826
+ "return": {
13827
+ "type": {
13828
+ "text": "void"
13829
+ }
13830
+ }
13831
+ },
13832
+ {
13833
+ "kind": "method",
13834
+ "name": "#onChange",
13835
+ "privacy": "private",
13836
+ "return": {
13837
+ "type": {
13838
+ "text": "void"
13839
+ }
13840
+ },
13841
+ "parameters": [
13842
+ {
13843
+ "name": "e",
13844
+ "type": {
13845
+ "text": "Event"
13846
+ }
13847
+ }
13848
+ ]
13849
+ },
13850
+ {
13851
+ "kind": "field",
13852
+ "name": "#onInputRef",
13853
+ "privacy": "private"
13854
+ }
13855
+ ],
13856
+ "events": [
13857
+ {
13858
+ "name": "change",
13859
+ "type": {
13860
+ "text": "CustomEvent"
13861
+ },
13862
+ "description": "The checkbox was toggled by the user, in either direction; detail: `{ checked }`. Programmatic `checked` assignments do not fire it."
13863
+ }
13864
+ ],
13865
+ "attributes": [
13866
+ {
13867
+ "name": "checked",
13868
+ "type": {
13869
+ "text": "boolean"
13870
+ },
13871
+ "default": "false",
13872
+ "description": "Whether the box is checked.",
13873
+ "fieldName": "checked"
13874
+ },
13875
+ {
13876
+ "name": "indeterminate",
13877
+ "type": {
13878
+ "text": "boolean"
13879
+ },
13880
+ "default": "false",
13881
+ "description": "Visual \"partial selection\" state; cleared on the next user interaction.",
13882
+ "fieldName": "indeterminate"
13883
+ },
13884
+ {
13885
+ "name": "disabled",
13886
+ "type": {
13887
+ "text": "boolean"
13888
+ },
13889
+ "default": "false",
13890
+ "description": "Disables interaction; merged with an ancestor `<fieldset disabled>`.",
13891
+ "fieldName": "disabled"
13892
+ },
13893
+ {
13894
+ "name": "required",
13895
+ "type": {
13896
+ "text": "boolean"
13897
+ },
13898
+ "default": "false",
13899
+ "description": "Marks the control invalid via `ElementInternals` while unchecked.",
13900
+ "fieldName": "required"
13901
+ },
13902
+ {
13903
+ "name": "name",
13904
+ "type": {
13905
+ "text": "string"
13906
+ },
13907
+ "default": "\"\"",
13908
+ "description": "Form field name; submitted as `name=on` only while checked.",
13909
+ "fieldName": "name"
13910
+ },
13911
+ {
13912
+ "name": "label",
13913
+ "type": {
13914
+ "text": "string"
13915
+ },
13916
+ "default": "\"\"",
13917
+ "description": "Visible label text rendered next to the box.",
13918
+ "fieldName": "label"
13919
+ }
13920
+ ],
13921
+ "superclass": {
13922
+ "name": "LitElement",
13923
+ "package": "lit"
13924
+ },
13925
+ "tagName": "ui-checkbox",
13926
+ "customElement": true
13927
+ }
13928
+ ],
13929
+ "exports": [
13930
+ {
13931
+ "kind": "js",
13932
+ "name": "UiCheckbox",
13933
+ "declaration": {
13934
+ "name": "UiCheckbox",
13935
+ "module": "src/ui-checkbox.ts"
13936
+ }
13937
+ },
13938
+ {
13939
+ "kind": "custom-element-definition",
13940
+ "name": "ui-checkbox",
13941
+ "declaration": {
13942
+ "name": "UiCheckbox",
13943
+ "module": "src/ui-checkbox.ts"
13944
+ }
13945
+ }
13946
+ ]
13947
+ },
13948
+ {
13949
+ "kind": "javascript-module",
13950
+ "path": "src/user-avatar.ts",
13951
+ "declarations": [
13952
+ {
13953
+ "kind": "class",
13954
+ "description": "Circular avatar. Shows `src` when it loads successfully; falls back to the\nfirst letter of `name` (uppercased) if `src` is unset or fails to load\n(e.g. an expired OAuth profile-photo URL); falls back further to a generic\nperson icon if `name` is also unset. A broken image never leaves a blank\ncircle.",
13955
+ "name": "UserAvatar",
13956
+ "members": [
13957
+ {
13958
+ "kind": "field",
13959
+ "name": "src",
13960
+ "type": {
13961
+ "text": "string | null"
13962
+ },
13963
+ "default": "null",
13964
+ "description": "Image URL to show. Falls back to initials/icon if unset or it fails to load.",
13965
+ "attribute": "src"
13966
+ },
13967
+ {
13968
+ "kind": "field",
13969
+ "name": "name",
13970
+ "type": {
13971
+ "text": "string | null"
13972
+ },
13973
+ "default": "null",
13974
+ "description": "Source string for the fallback initial (e.g. a display name or email) — first character, uppercased.",
13975
+ "attribute": "name"
13976
+ },
13977
+ {
13978
+ "kind": "field",
13979
+ "name": "size",
13980
+ "type": {
13981
+ "text": "string | number"
13982
+ },
13983
+ "default": "32",
13984
+ "description": "Diameter in CSS pixels, or a preset name (`xs`=18, `sm`=24, `md`=32, `lg`=48).",
13985
+ "attribute": "size"
13986
+ },
13987
+ {
13988
+ "kind": "field",
13989
+ "name": "_imgError",
13990
+ "type": {
13991
+ "text": "boolean"
13992
+ },
13993
+ "privacy": "private",
13994
+ "default": "false"
13995
+ },
13996
+ {
13997
+ "kind": "field",
13998
+ "name": "SIZE_PRESETS",
13999
+ "type": {
14000
+ "text": "Record<string, number>"
14001
+ },
14002
+ "privacy": "private",
14003
+ "static": true,
14004
+ "readonly": true,
14005
+ "default": "{ xs: 18, sm: 24, md: 32, lg: 48, }"
14006
+ },
14007
+ {
14008
+ "kind": "method",
14009
+ "name": "resolveSize",
14010
+ "privacy": "private",
14011
+ "return": {
14012
+ "type": {
12816
14013
  "text": "number"
12817
14014
  }
12818
14015
  },
@@ -13513,6 +14710,98 @@
13513
14710
  }
13514
14711
  ]
13515
14712
  },
14713
+ {
14714
+ "kind": "javascript-module",
14715
+ "path": "src/utils/scroll.ts",
14716
+ "declarations": [
14717
+ {
14718
+ "kind": "function",
14719
+ "name": "distanceFromTop",
14720
+ "return": {
14721
+ "type": {
14722
+ "text": "number"
14723
+ }
14724
+ },
14725
+ "parameters": [
14726
+ {
14727
+ "name": "target",
14728
+ "type": {
14729
+ "text": "ScrollableTarget"
14730
+ }
14731
+ }
14732
+ ],
14733
+ "description": "Pixels between the current scroll position and the top edge."
14734
+ },
14735
+ {
14736
+ "kind": "function",
14737
+ "name": "distanceFromBottom",
14738
+ "return": {
14739
+ "type": {
14740
+ "text": "number"
14741
+ }
14742
+ },
14743
+ "parameters": [
14744
+ {
14745
+ "name": "target",
14746
+ "type": {
14747
+ "text": "ScrollableTarget"
14748
+ }
14749
+ }
14750
+ ],
14751
+ "description": "Pixels between the current scroll position and the bottom edge."
14752
+ },
14753
+ {
14754
+ "kind": "function",
14755
+ "name": "scrollToEdge",
14756
+ "return": {
14757
+ "type": {
14758
+ "text": "void"
14759
+ }
14760
+ },
14761
+ "parameters": [
14762
+ {
14763
+ "name": "target",
14764
+ "type": {
14765
+ "text": "ScrollableTarget"
14766
+ }
14767
+ },
14768
+ {
14769
+ "name": "edge",
14770
+ "type": {
14771
+ "text": "\"top\" | \"bottom\""
14772
+ }
14773
+ }
14774
+ ],
14775
+ "description": "Scrolls `target` to its top or bottom edge, honoring `prefers-reduced-motion`."
14776
+ }
14777
+ ],
14778
+ "exports": [
14779
+ {
14780
+ "kind": "js",
14781
+ "name": "distanceFromTop",
14782
+ "declaration": {
14783
+ "name": "distanceFromTop",
14784
+ "module": "src/utils/scroll.ts"
14785
+ }
14786
+ },
14787
+ {
14788
+ "kind": "js",
14789
+ "name": "distanceFromBottom",
14790
+ "declaration": {
14791
+ "name": "distanceFromBottom",
14792
+ "module": "src/utils/scroll.ts"
14793
+ }
14794
+ },
14795
+ {
14796
+ "kind": "js",
14797
+ "name": "scrollToEdge",
14798
+ "declaration": {
14799
+ "name": "scrollToEdge",
14800
+ "module": "src/utils/scroll.ts"
14801
+ }
14802
+ }
14803
+ ]
14804
+ },
13516
14805
  {
13517
14806
  "kind": "javascript-module",
13518
14807
  "path": "src/utils/time.ts",