@skdx/web-components-blocks 0.35.0 → 0.37.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 (56) hide show
  1. package/custom-elements.json +1015 -1319
  2. package/dist/chat-composer/ChatComposer.cjs +1 -1
  3. package/dist/chat-composer/ChatComposer.js +1 -1
  4. package/dist/chat-message/ChatMessage.cjs +12 -12
  5. package/dist/chat-message/ChatMessage.js +1 -1
  6. package/dist/comment/Comment.cjs +2 -2
  7. package/dist/comment/Comment.js +2 -2
  8. package/dist/comment-thread/CommentThread.cjs +1 -1
  9. package/dist/comment-thread/CommentThread.js +1 -1
  10. package/dist/empty-state/EmptyState.cjs +10 -10
  11. package/dist/empty-state/EmptyState.js +5 -5
  12. package/dist/filter-bar/FilterBar.cjs +9 -9
  13. package/dist/filter-bar/FilterBar.d.cts +9 -0
  14. package/dist/filter-bar/FilterBar.d.ts +9 -0
  15. package/dist/filter-bar/FilterBar.js +19 -19
  16. package/dist/forgot-password-page/ForgotPasswordPage.cjs +2 -2
  17. package/dist/forgot-password-page/ForgotPasswordPage.js +6 -6
  18. package/dist/form-section/FormSection.cjs +5 -5
  19. package/dist/form-section/FormSection.js +2 -2
  20. package/dist/index.cjs +1 -1
  21. package/dist/index.d.cts +0 -1
  22. package/dist/index.d.ts +0 -1
  23. package/dist/index.js +1 -1
  24. package/dist/internal/slots.cjs +1 -1
  25. package/dist/internal/slots.js +1 -1
  26. package/dist/notification-center/NotificationCenter.cjs +1 -1
  27. package/dist/notification-center/NotificationCenter.js +1 -1
  28. package/dist/page-container/PageContainer.cjs +5 -5
  29. package/dist/page-container/PageContainer.js +2 -2
  30. package/dist/reset-password-page/ResetPasswordPage.cjs +15 -5
  31. package/dist/reset-password-page/ResetPasswordPage.js +15 -5
  32. package/dist/sign-up-page/SignUpPage.cjs +13 -5
  33. package/dist/sign-up-page/SignUpPage.d.cts +1 -1
  34. package/dist/sign-up-page/SignUpPage.d.ts +1 -1
  35. package/dist/sign-up-page/SignUpPage.js +14 -6
  36. package/dist/stat-card/StatCard.cjs +1 -1
  37. package/dist/stat-card/StatCard.js +11 -11
  38. package/dist/usage-card/UsageCard.cjs +1 -1
  39. package/dist/usage-card/UsageCard.js +1 -1
  40. package/dist/user-menu/UserMenu.cjs +5 -3
  41. package/dist/user-menu/UserMenu.js +8 -6
  42. package/dist/verification-page/VerificationPage.cjs +4 -6
  43. package/dist/verification-page/VerificationPage.d.cts +1 -1
  44. package/dist/verification-page/VerificationPage.d.ts +1 -1
  45. package/dist/verification-page/VerificationPage.js +4 -6
  46. package/dist/workspace-switcher/WorkspaceSwitcher.cjs +1 -1
  47. package/dist/workspace-switcher/WorkspaceSwitcher.js +1 -1
  48. package/package.json +3 -17
  49. package/dist/confirm-dialog/ConfirmDialog.cjs +0 -38
  50. package/dist/confirm-dialog/ConfirmDialog.d.cts +0 -101
  51. package/dist/confirm-dialog/ConfirmDialog.d.ts +0 -101
  52. package/dist/confirm-dialog/ConfirmDialog.js +0 -38
  53. package/dist/confirm-dialog/index.cjs +0 -1
  54. package/dist/confirm-dialog/index.d.cts +0 -1
  55. package/dist/confirm-dialog/index.d.ts +0 -1
  56. package/dist/confirm-dialog/index.js +0 -1
@@ -71,14 +71,6 @@
71
71
  "module": "./sign-in-page"
72
72
  }
73
73
  },
74
- {
75
- "kind": "js",
76
- "name": "SkdxConfirmDialog",
77
- "declaration": {
78
- "name": "SkdxConfirmDialog",
79
- "module": "./confirm-dialog"
80
- }
81
- },
82
74
  {
83
75
  "kind": "js",
84
76
  "name": "SkdxEmptyState",
@@ -1402,247 +1394,186 @@
1402
1394
  },
1403
1395
  {
1404
1396
  "kind": "javascript-module",
1405
- "path": "src/filter-bar/FilterBar.ts",
1397
+ "path": "src/dashboard-layout/DashboardLayout.ts",
1406
1398
  "declarations": [
1407
1399
  {
1408
1400
  "kind": "class",
1409
- "description": "Filtering surface above a table, list, card grid or report: a search field,\nthe consumer's filter controls, the applied filters as removable tags, and a\nclear action. Composes TextField, TagGroup and Button.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-filter-bar` on the host, then `__search`, `__filters`,\n`__actions`, `__active`, `__tags` and `__clear`.",
1410
- "name": "SkdxFilterBar",
1401
+ "description": "Application shell block: an app bar, a collapsible side navigation and the content region.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-dashboard-layout` on the host, then `__app-bar`,\n`__nav-toggle`, `__branding`, `__title`, `__actions`, `__body`, `__nav`,\n`__nav-list`, `__nav-item`, `__nav-header`, `__nav-divider` and `__content`.\n`data-nav-open` sits on the host while the navigation is shown.",
1402
+ "name": "SkdxDashboardLayout",
1411
1403
  "slots": [
1412
1404
  {
1413
- "description": "The consumer's filter controls, laid out in the filters region.",
1405
+ "description": "The page content rendered inside the `<main>` region.",
1414
1406
  "name": ""
1415
1407
  },
1416
1408
  {
1417
- "description": "Controls rendered at the end of the bar, such as a \"Save view\" button.",
1409
+ "description": "Logo or product mark at the start of the app bar.",
1410
+ "name": "branding"
1411
+ },
1412
+ {
1413
+ "description": "Controls at the end of the app bar.",
1418
1414
  "name": "actions"
1419
1415
  }
1420
1416
  ],
1421
1417
  "members": [
1422
1418
  {
1423
1419
  "kind": "field",
1424
- "name": "label",
1420
+ "name": "title",
1425
1421
  "type": {
1426
1422
  "text": "string"
1427
1423
  },
1428
- "default": "'Filters'",
1429
- "description": "Accessible name of the root region, written to `aria-label`.",
1430
- "attribute": "label"
1431
- },
1432
- {
1433
- "kind": "field",
1434
- "name": "searchLabel",
1435
- "type": {
1436
- "text": "string | undefined | undefined"
1437
- },
1438
- "description": "Accessible name of the search field; providing it renders the search region.",
1439
- "default": "undefined",
1440
- "attribute": "search-label"
1424
+ "default": "''",
1425
+ "description": "Application title shown in the app bar after the branding, shadowing the native tooltip attribute.",
1426
+ "attribute": "title"
1441
1427
  },
1442
1428
  {
1443
1429
  "kind": "field",
1444
- "name": "searchPlaceholder",
1430
+ "name": "navigation",
1445
1431
  "type": {
1446
- "text": "string | undefined | undefined"
1432
+ "text": "readonly SkdxDashboardNavigationItem[]"
1447
1433
  },
1448
- "description": "Placeholder shown in the empty search field.",
1449
- "default": "undefined",
1450
- "attribute": "search-placeholder"
1434
+ "description": "The side navigation, one entry per row, nested through each entry's `children`.",
1435
+ "required": true
1451
1436
  },
1452
1437
  {
1453
1438
  "kind": "field",
1454
- "name": "searchValue",
1439
+ "name": "navOpen",
1455
1440
  "type": {
1456
- "text": "string | undefined | undefined"
1441
+ "text": "boolean | undefined"
1457
1442
  },
1458
- "description": "Current search text, for controlled usage; pair it with `search-value-change`.",
1443
+ "description": "Whether the side navigation is shown, for controlled usage.",
1459
1444
  "default": "undefined",
1460
- "attribute": "search-value"
1461
- },
1462
- {
1463
- "kind": "field",
1464
- "name": "defaultSearchValue",
1465
- "type": {
1466
- "text": "string"
1467
- },
1468
- "default": "''",
1469
- "description": "Initial search text, for uncontrolled usage — seeds the internally tracked value.",
1470
- "attribute": "default-search-value"
1471
- },
1472
- {
1473
- "kind": "field",
1474
- "name": "clearSearchLabel",
1475
- "type": {
1476
- "text": "string"
1477
- },
1478
- "default": "'Clear search'",
1479
- "description": "Accessible name of the search field's clear button.",
1480
- "attribute": "clear-search-label"
1445
+ "attribute": "nav-open"
1481
1446
  },
1482
1447
  {
1483
1448
  "kind": "field",
1484
- "name": "activeFilters",
1449
+ "name": "defaultNavOpen",
1485
1450
  "type": {
1486
- "text": "readonly SkdxFilterBarFilter[] | undefined | undefined"
1451
+ "text": "boolean"
1487
1452
  },
1488
- "description": "The applied filters, in display order, rendered as removable tags.",
1489
- "default": "undefined"
1453
+ "default": "true",
1454
+ "description": "Whether the side navigation starts shown, for uncontrolled usage.",
1455
+ "attribute": "default-nav-open"
1490
1456
  },
1491
1457
  {
1492
1458
  "kind": "field",
1493
- "name": "activeFiltersLabel",
1459
+ "name": "navLabel",
1494
1460
  "type": {
1495
1461
  "text": "string"
1496
1462
  },
1497
- "default": "'Active filters'",
1498
- "description": "Accessible name of the active-filters tag list.",
1499
- "attribute": "active-filters-label"
1463
+ "default": "'Main navigation'",
1464
+ "description": "Accessible name of the side navigation landmark.",
1465
+ "attribute": "nav-label"
1500
1466
  },
1501
1467
  {
1502
1468
  "kind": "field",
1503
- "name": "clearLabel",
1469
+ "name": "navToggleLabel",
1504
1470
  "type": {
1505
1471
  "text": "string"
1506
1472
  },
1507
- "default": "'Clear filters'",
1508
- "description": "Text rendered on the clear-filters button.",
1509
- "attribute": "clear-label"
1473
+ "default": "'Toggle navigation'",
1474
+ "description": "Accessible name of the icon-only button that shows and hides the navigation.",
1475
+ "attribute": "nav-toggle-label"
1510
1476
  }
1511
1477
  ],
1512
1478
  "events": [
1513
1479
  {
1514
- "description": "Fires with the new text whenever the search field changes, controlled or not.",
1515
- "name": "search-value-change"
1516
- },
1517
- {
1518
- "description": "Fires with the removed filter when its tag's remove control is activated.",
1519
- "name": "remove-filter"
1520
- },
1521
- {
1522
- "description": "Fires when the clear-filters button is activated while filters are shown.",
1523
- "name": "clear"
1480
+ "description": "Fires with the new open state whenever the navigation toggle is activated.",
1481
+ "name": "nav-open-change"
1524
1482
  }
1525
1483
  ],
1526
1484
  "attributes": [
1527
1485
  {
1528
- "name": "label",
1486
+ "name": "title",
1529
1487
  "type": {
1530
1488
  "text": "string"
1531
1489
  },
1532
- "default": "'Filters'",
1533
- "description": "Accessible name of the root region, written to `aria-label`.",
1534
- "fieldName": "label"
1535
- },
1536
- {
1537
- "name": "search-label",
1538
- "type": {
1539
- "text": "string | undefined | undefined"
1540
- },
1541
- "description": "Accessible name of the search field; providing it renders the search region.",
1542
- "default": "undefined",
1543
- "fieldName": "searchLabel"
1544
- },
1545
- {
1546
- "name": "search-placeholder",
1547
- "type": {
1548
- "text": "string | undefined | undefined"
1549
- },
1550
- "description": "Placeholder shown in the empty search field.",
1551
- "default": "undefined",
1552
- "fieldName": "searchPlaceholder"
1490
+ "default": "''",
1491
+ "description": "Application title shown in the app bar after the branding, shadowing the native tooltip attribute.",
1492
+ "fieldName": "title"
1553
1493
  },
1554
1494
  {
1555
- "name": "search-value",
1495
+ "name": "nav-open",
1556
1496
  "type": {
1557
- "text": "string | undefined | undefined"
1497
+ "text": "boolean | undefined"
1558
1498
  },
1559
- "description": "Current search text, for controlled usage; pair it with `search-value-change`.",
1499
+ "description": "Whether the side navigation is shown, for controlled usage.",
1560
1500
  "default": "undefined",
1561
- "fieldName": "searchValue"
1562
- },
1563
- {
1564
- "name": "default-search-value",
1565
- "type": {
1566
- "text": "string"
1567
- },
1568
- "default": "''",
1569
- "description": "Initial search text, for uncontrolled usage — seeds the internally tracked value.",
1570
- "fieldName": "defaultSearchValue"
1501
+ "fieldName": "navOpen"
1571
1502
  },
1572
1503
  {
1573
- "name": "clear-search-label",
1504
+ "name": "default-nav-open",
1574
1505
  "type": {
1575
- "text": "string"
1506
+ "text": "boolean"
1576
1507
  },
1577
- "default": "'Clear search'",
1578
- "description": "Accessible name of the search field's clear button.",
1579
- "fieldName": "clearSearchLabel"
1508
+ "default": "true",
1509
+ "description": "Whether the side navigation starts shown, for uncontrolled usage.",
1510
+ "fieldName": "defaultNavOpen"
1580
1511
  },
1581
1512
  {
1582
- "name": "active-filters-label",
1513
+ "name": "nav-label",
1583
1514
  "type": {
1584
1515
  "text": "string"
1585
1516
  },
1586
- "default": "'Active filters'",
1587
- "description": "Accessible name of the active-filters tag list.",
1588
- "fieldName": "activeFiltersLabel"
1517
+ "default": "'Main navigation'",
1518
+ "description": "Accessible name of the side navigation landmark.",
1519
+ "fieldName": "navLabel"
1589
1520
  },
1590
1521
  {
1591
- "name": "clear-label",
1522
+ "name": "nav-toggle-label",
1592
1523
  "type": {
1593
1524
  "text": "string"
1594
1525
  },
1595
- "default": "'Clear filters'",
1596
- "description": "Text rendered on the clear-filters button.",
1597
- "fieldName": "clearLabel"
1526
+ "default": "'Toggle navigation'",
1527
+ "description": "Accessible name of the icon-only button that shows and hides the navigation.",
1528
+ "fieldName": "navToggleLabel"
1598
1529
  }
1599
1530
  ],
1600
1531
  "superclass": {
1601
1532
  "name": "LitElement",
1602
1533
  "package": "lit"
1603
1534
  },
1604
- "tagName": "skdx-filter-bar",
1535
+ "tagName": "skdx-dashboard-layout",
1605
1536
  "customElement": true
1606
1537
  }
1607
1538
  ],
1608
1539
  "exports": [
1609
1540
  {
1610
1541
  "kind": "js",
1611
- "name": "SkdxFilterBar",
1542
+ "name": "SkdxDashboardLayout",
1612
1543
  "declaration": {
1613
- "name": "SkdxFilterBar",
1614
- "module": "src/filter-bar/FilterBar.ts"
1544
+ "name": "SkdxDashboardLayout",
1545
+ "module": "src/dashboard-layout/DashboardLayout.ts"
1615
1546
  }
1616
1547
  },
1617
1548
  {
1618
1549
  "kind": "custom-element-definition",
1619
- "name": "skdx-filter-bar",
1550
+ "name": "skdx-dashboard-layout",
1620
1551
  "declaration": {
1621
- "name": "SkdxFilterBar",
1622
- "module": "src/filter-bar/FilterBar.ts"
1552
+ "name": "SkdxDashboardLayout",
1553
+ "module": "src/dashboard-layout/DashboardLayout.ts"
1623
1554
  }
1624
1555
  }
1625
1556
  ]
1626
1557
  },
1627
1558
  {
1628
1559
  "kind": "javascript-module",
1629
- "path": "src/filter-bar/index.ts",
1560
+ "path": "src/dashboard-layout/index.ts",
1630
1561
  "declarations": [],
1631
1562
  "exports": [
1632
1563
  {
1633
1564
  "kind": "js",
1634
- "name": "SkdxFilterBar",
1565
+ "name": "SkdxDashboardLayout",
1635
1566
  "declaration": {
1636
- "name": "SkdxFilterBar",
1637
- "module": "./FilterBar"
1567
+ "name": "SkdxDashboardLayout",
1568
+ "module": "./DashboardLayout"
1638
1569
  }
1639
1570
  },
1640
1571
  {
1641
1572
  "kind": "js",
1642
- "name": "SkdxFilterBarFilter",
1573
+ "name": "SkdxDashboardNavigationItem",
1643
1574
  "declaration": {
1644
- "name": "SkdxFilterBarFilter",
1645
- "module": "./FilterBar"
1575
+ "name": "SkdxDashboardNavigationItem",
1576
+ "module": "./DashboardLayout"
1646
1577
  }
1647
1578
  }
1648
1579
  ]
@@ -1812,316 +1743,267 @@
1812
1743
  },
1813
1744
  {
1814
1745
  "kind": "javascript-module",
1815
- "path": "src/confirm-dialog/ConfirmDialog.ts",
1746
+ "path": "src/filter-bar/FilterBar.ts",
1816
1747
  "declarations": [
1817
1748
  {
1818
1749
  "kind": "class",
1819
- "description": "Confirmation dialog block for a destructive, irreversible or sensitive\naction, composing the core dialog primitives as an alert dialog with an\nexternally controlled pending state that disables both buttons and blocks\ndismissal while the confirmed request is in flight.\n\nA synchronous confirmation with no pending state is served by the core\n`<skdx-dialog role=\"alertdialog\">` recipe alone.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-confirm-dialog` on the host, then `__title`,\n`__description`, `__body`, `__footer`, `__cancel` and `__confirm`.",
1820
- "name": "SkdxConfirmDialog",
1750
+ "description": "Filtering surface above a table, list, card grid or report: a search field,\nthe consumer's filter controls, the applied filters as removable tags, and a\nclear action. Composes TextField, TagGroup and Button.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-filter-bar` on the host, then `__search`, `__filters`,\n`__actions`, `__active`, `__tags` and `__clear`.",
1751
+ "name": "SkdxFilterBar",
1821
1752
  "slots": [
1822
1753
  {
1823
- "description": "Extra content rendered between the description and the footer buttons.",
1754
+ "description": "The consumer's filter controls, laid out in the filters region.",
1824
1755
  "name": ""
1825
1756
  },
1826
1757
  {
1827
- "description": "Content of the button that opens the dialog; no trigger renders without it.",
1828
- "name": "trigger"
1758
+ "description": "Controls rendered at the end of the bar, such as a \"Save view\" button.",
1759
+ "name": "actions"
1829
1760
  }
1830
1761
  ],
1831
1762
  "members": [
1832
1763
  {
1833
1764
  "kind": "field",
1834
- "name": "open",
1765
+ "name": "label",
1835
1766
  "type": {
1836
- "text": "boolean | undefined | undefined"
1767
+ "text": "string"
1837
1768
  },
1838
- "description": "Whether the dialog is open, for controlled usage; pair it with `open-change`.",
1839
- "default": "undefined",
1840
- "attribute": "open"
1769
+ "default": "'Filters'",
1770
+ "description": "Accessible name of the root region, written to `aria-label`.",
1771
+ "attribute": "label"
1841
1772
  },
1842
1773
  {
1843
1774
  "kind": "field",
1844
- "name": "defaultOpen",
1775
+ "name": "searchLabel",
1845
1776
  "type": {
1846
- "text": "boolean"
1777
+ "text": "string | undefined | undefined"
1847
1778
  },
1848
- "default": "false",
1849
- "description": "Whether the dialog starts open, for uncontrolled usage.",
1850
- "attribute": "default-open"
1779
+ "description": "Accessible name of the search field; providing it renders the search region.",
1780
+ "default": "undefined",
1781
+ "attribute": "search-label"
1851
1782
  },
1852
1783
  {
1853
1784
  "kind": "field",
1854
- "name": "title",
1785
+ "name": "searchPlaceholder",
1855
1786
  "type": {
1856
- "text": "string"
1787
+ "text": "string | undefined | undefined"
1857
1788
  },
1858
- "description": "Heading text rendered into the panel's title, naming and labelling the dialog.",
1859
- "attribute": "title",
1860
- "required": true
1789
+ "description": "Placeholder shown in the empty search field.",
1790
+ "default": "undefined",
1791
+ "attribute": "search-placeholder"
1861
1792
  },
1862
1793
  {
1863
1794
  "kind": "field",
1864
- "name": "description",
1795
+ "name": "searchValue",
1865
1796
  "type": {
1866
1797
  "text": "string | undefined | undefined"
1867
1798
  },
1868
- "description": "Supporting sentence rendered into the panel's description, read alongside the title.",
1799
+ "description": "Current search text, for controlled usage; pair it with `search-value-change`.",
1869
1800
  "default": "undefined",
1870
- "attribute": "description"
1801
+ "attribute": "search-value"
1871
1802
  },
1872
1803
  {
1873
1804
  "kind": "field",
1874
- "name": "confirmLabel",
1805
+ "name": "defaultSearchValue",
1875
1806
  "type": {
1876
1807
  "text": "string"
1877
1808
  },
1878
- "default": "'Confirm'",
1879
- "description": "Text of the button that carries out the confirmed action.",
1880
- "attribute": "confirm-label"
1809
+ "default": "''",
1810
+ "description": "Initial search text, for uncontrolled usage seeds the internally tracked value.",
1811
+ "attribute": "default-search-value"
1881
1812
  },
1882
1813
  {
1883
1814
  "kind": "field",
1884
- "name": "cancelLabel",
1815
+ "name": "clearSearchLabel",
1885
1816
  "type": {
1886
1817
  "text": "string"
1887
1818
  },
1888
- "default": "'Cancel'",
1889
- "description": "Text of the button that abandons the action.",
1890
- "attribute": "cancel-label"
1819
+ "default": "'Clear search'",
1820
+ "description": "Accessible name of the search field's clear button.",
1821
+ "attribute": "clear-search-label"
1891
1822
  },
1892
1823
  {
1893
1824
  "kind": "field",
1894
- "name": "destructive",
1825
+ "name": "activeFilters",
1895
1826
  "type": {
1896
- "text": "boolean"
1897
- },
1898
- "default": "false",
1899
- "description": "Colours the confirm button and the panel danger, for an irreversible or destructive action.",
1900
- "attribute": "destructive"
1901
- },
1902
- {
1903
- "kind": "field",
1904
- "name": "pending",
1905
- "type": {
1906
- "text": "boolean"
1827
+ "text": "readonly SkdxFilterBarFilter[] | undefined | undefined"
1907
1828
  },
1908
- "default": "false",
1909
- "description": "Marks the confirmed request as in flight: disables both buttons, marks the confirm button loading, and blocks Escape dismissal until it clears.",
1910
- "attribute": "pending"
1829
+ "description": "The applied filters, in display order, rendered as removable tags.",
1830
+ "default": "undefined"
1911
1831
  },
1912
1832
  {
1913
1833
  "kind": "field",
1914
- "name": "disabled",
1834
+ "name": "activeFiltersLabel",
1915
1835
  "type": {
1916
- "text": "boolean"
1836
+ "text": "string"
1917
1837
  },
1918
- "default": "false",
1919
- "description": "Disables the confirm button on its own, independent of `pending` for example until a typed confirmation matches.",
1920
- "attribute": "disabled"
1838
+ "default": "'Active filters'",
1839
+ "description": "Accessible name of the active-filters tag list.",
1840
+ "attribute": "active-filters-label"
1921
1841
  },
1922
1842
  {
1923
1843
  "kind": "field",
1924
- "name": "size",
1844
+ "name": "clearLabel",
1925
1845
  "type": {
1926
- "text": "'sm' | 'md' | 'lg' | (string & {}) | undefined | undefined"
1846
+ "text": "string"
1927
1847
  },
1928
- "description": "Panel width rung the skin reads, fed to the underlying dialog panel.",
1929
- "default": "undefined",
1930
- "attribute": "size"
1848
+ "default": "'Clear filters'",
1849
+ "description": "Text rendered on the clear-filters button.",
1850
+ "attribute": "clear-label"
1931
1851
  }
1932
1852
  ],
1933
1853
  "events": [
1934
1854
  {
1935
- "description": "Fires with the new open state whenever the dialog opens or closes, controlled or not.",
1936
- "name": "open-change"
1937
- },
1938
- {
1939
- "description": "Fires with the new open state once the panel's enter or exit animation has settled.",
1940
- "name": "open-change-complete"
1941
- },
1942
- {
1943
- "description": "Fires with the click when the confirm button is activated, before the dialog closes; `preventDefault()` holds the panel open.",
1944
- "name": "confirm"
1945
- },
1946
- {
1947
- "description": "Fires with the click when the cancel button is activated, before the dialog closes; `preventDefault()` keeps the panel open.",
1948
- "name": "cancel"
1949
- },
1950
- {
1951
- "description": "Fires when Escape is pressed while the panel is open; `preventDefault()` keeps it open.",
1952
- "name": "escape-key-down"
1953
- },
1954
- {
1955
- "description": "Fires on a pointer-down outside the panel while open; an alert dialog never closes on one.",
1956
- "name": "pointer-down-outside"
1957
- },
1958
- {
1959
- "description": "Fires when focus moves outside the panel while open; an alert dialog never closes on one.",
1960
- "name": "focus-outside"
1961
- },
1962
- {
1963
- "description": "Fires for either kind of outside interaction, just before the specific event.",
1964
- "name": "interact-outside"
1855
+ "description": "Fires with the new text whenever the search field changes, controlled or not.",
1856
+ "name": "search-value-change"
1965
1857
  },
1966
1858
  {
1967
- "description": "Fires before focus moves into the panel on open; `preventDefault()` leaves focus where it is.",
1968
- "name": "open-auto-focus"
1859
+ "description": "Fires with the removed filter when its tag's remove control is activated.",
1860
+ "name": "remove-filter"
1969
1861
  },
1970
1862
  {
1971
- "description": "Fires before focus returns to the trigger on close; `preventDefault()` suppresses that return.",
1972
- "name": "close-auto-focus"
1863
+ "description": "Fires when the clear-filters button is activated while filters are shown.",
1864
+ "name": "clear"
1973
1865
  }
1974
1866
  ],
1975
1867
  "attributes": [
1976
1868
  {
1977
- "name": "open",
1869
+ "name": "label",
1978
1870
  "type": {
1979
- "text": "boolean | undefined | undefined"
1871
+ "text": "string"
1980
1872
  },
1981
- "description": "Whether the dialog is open, for controlled usage; pair it with `open-change`.",
1982
- "default": "undefined",
1983
- "fieldName": "open"
1873
+ "default": "'Filters'",
1874
+ "description": "Accessible name of the root region, written to `aria-label`.",
1875
+ "fieldName": "label"
1984
1876
  },
1985
1877
  {
1986
- "name": "default-open",
1878
+ "name": "search-label",
1987
1879
  "type": {
1988
- "text": "boolean"
1880
+ "text": "string | undefined | undefined"
1989
1881
  },
1990
- "default": "false",
1991
- "description": "Whether the dialog starts open, for uncontrolled usage.",
1992
- "fieldName": "defaultOpen"
1882
+ "description": "Accessible name of the search field; providing it renders the search region.",
1883
+ "default": "undefined",
1884
+ "fieldName": "searchLabel"
1993
1885
  },
1994
1886
  {
1995
- "name": "title",
1887
+ "name": "search-placeholder",
1996
1888
  "type": {
1997
- "text": "string"
1889
+ "text": "string | undefined | undefined"
1998
1890
  },
1999
- "description": "Heading text rendered into the panel's title, naming and labelling the dialog.",
2000
- "fieldName": "title",
2001
- "required": true
1891
+ "description": "Placeholder shown in the empty search field.",
1892
+ "default": "undefined",
1893
+ "fieldName": "searchPlaceholder"
2002
1894
  },
2003
1895
  {
2004
- "name": "description",
1896
+ "name": "search-value",
2005
1897
  "type": {
2006
1898
  "text": "string | undefined | undefined"
2007
1899
  },
2008
- "description": "Supporting sentence rendered into the panel's description, read alongside the title.",
1900
+ "description": "Current search text, for controlled usage; pair it with `search-value-change`.",
2009
1901
  "default": "undefined",
2010
- "fieldName": "description"
1902
+ "fieldName": "searchValue"
2011
1903
  },
2012
1904
  {
2013
- "name": "confirm-label",
1905
+ "name": "default-search-value",
2014
1906
  "type": {
2015
1907
  "text": "string"
2016
1908
  },
2017
- "default": "'Confirm'",
2018
- "description": "Text of the button that carries out the confirmed action.",
2019
- "fieldName": "confirmLabel"
1909
+ "default": "''",
1910
+ "description": "Initial search text, for uncontrolled usage seeds the internally tracked value.",
1911
+ "fieldName": "defaultSearchValue"
2020
1912
  },
2021
1913
  {
2022
- "name": "cancel-label",
1914
+ "name": "clear-search-label",
2023
1915
  "type": {
2024
1916
  "text": "string"
2025
1917
  },
2026
- "default": "'Cancel'",
2027
- "description": "Text of the button that abandons the action.",
2028
- "fieldName": "cancelLabel"
2029
- },
2030
- {
2031
- "name": "destructive",
2032
- "type": {
2033
- "text": "boolean"
2034
- },
2035
- "default": "false",
2036
- "description": "Colours the confirm button and the panel danger, for an irreversible or destructive action.",
2037
- "fieldName": "destructive"
2038
- },
2039
- {
2040
- "name": "pending",
2041
- "type": {
2042
- "text": "boolean"
2043
- },
2044
- "default": "false",
2045
- "description": "Marks the confirmed request as in flight: disables both buttons, marks the confirm button loading, and blocks Escape dismissal until it clears.",
2046
- "fieldName": "pending"
1918
+ "default": "'Clear search'",
1919
+ "description": "Accessible name of the search field's clear button.",
1920
+ "fieldName": "clearSearchLabel"
2047
1921
  },
2048
1922
  {
2049
- "name": "disabled",
1923
+ "name": "active-filters-label",
2050
1924
  "type": {
2051
- "text": "boolean"
1925
+ "text": "string"
2052
1926
  },
2053
- "default": "false",
2054
- "description": "Disables the confirm button on its own, independent of `pending` for example until a typed confirmation matches.",
2055
- "fieldName": "disabled"
1927
+ "default": "'Active filters'",
1928
+ "description": "Accessible name of the active-filters tag list.",
1929
+ "fieldName": "activeFiltersLabel"
2056
1930
  },
2057
1931
  {
2058
- "name": "size",
1932
+ "name": "clear-label",
2059
1933
  "type": {
2060
- "text": "'sm' | 'md' | 'lg' | (string & {}) | undefined | undefined"
1934
+ "text": "string"
2061
1935
  },
2062
- "description": "Panel width rung the skin reads, fed to the underlying dialog panel.",
2063
- "default": "undefined",
2064
- "fieldName": "size"
1936
+ "default": "'Clear filters'",
1937
+ "description": "Text rendered on the clear-filters button.",
1938
+ "fieldName": "clearLabel"
2065
1939
  }
2066
1940
  ],
2067
1941
  "superclass": {
2068
1942
  "name": "LitElement",
2069
1943
  "package": "lit"
2070
1944
  },
2071
- "tagName": "skdx-confirm-dialog",
1945
+ "tagName": "skdx-filter-bar",
2072
1946
  "customElement": true
2073
1947
  }
2074
1948
  ],
2075
1949
  "exports": [
2076
1950
  {
2077
1951
  "kind": "js",
2078
- "name": "SkdxConfirmDialog",
1952
+ "name": "SkdxFilterBar",
2079
1953
  "declaration": {
2080
- "name": "SkdxConfirmDialog",
2081
- "module": "src/confirm-dialog/ConfirmDialog.ts"
1954
+ "name": "SkdxFilterBar",
1955
+ "module": "src/filter-bar/FilterBar.ts"
2082
1956
  }
2083
1957
  },
2084
1958
  {
2085
1959
  "kind": "custom-element-definition",
2086
- "name": "skdx-confirm-dialog",
1960
+ "name": "skdx-filter-bar",
2087
1961
  "declaration": {
2088
- "name": "SkdxConfirmDialog",
2089
- "module": "src/confirm-dialog/ConfirmDialog.ts"
1962
+ "name": "SkdxFilterBar",
1963
+ "module": "src/filter-bar/FilterBar.ts"
2090
1964
  }
2091
1965
  }
2092
1966
  ]
2093
1967
  },
2094
1968
  {
2095
1969
  "kind": "javascript-module",
2096
- "path": "src/confirm-dialog/index.ts",
1970
+ "path": "src/filter-bar/index.ts",
2097
1971
  "declarations": [],
2098
1972
  "exports": [
2099
1973
  {
2100
1974
  "kind": "js",
2101
- "name": "SkdxConfirmDialog",
1975
+ "name": "SkdxFilterBar",
1976
+ "declaration": {
1977
+ "name": "SkdxFilterBar",
1978
+ "module": "./FilterBar"
1979
+ }
1980
+ },
1981
+ {
1982
+ "kind": "js",
1983
+ "name": "SkdxFilterBarFilter",
2102
1984
  "declaration": {
2103
- "name": "SkdxConfirmDialog",
2104
- "module": "./ConfirmDialog"
1985
+ "name": "SkdxFilterBarFilter",
1986
+ "module": "./FilterBar"
2105
1987
  }
2106
1988
  }
2107
1989
  ]
2108
1990
  },
2109
1991
  {
2110
1992
  "kind": "javascript-module",
2111
- "path": "src/form-section/FormSection.ts",
1993
+ "path": "src/forgot-password-page/ForgotPasswordPage.ts",
2112
1994
  "declarations": [
2113
1995
  {
2114
1996
  "kind": "class",
2115
- "description": "Titled group inside a larger form: a heading, supporting text, the group's\nfields and a footer for the group's own actions, composing Heading and Text\naround consumer-supplied fields.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-form-section` on the host, then `__header`, `__title`,\n`__description`, `__content` and `__footer`. `data-variant` sits on the host\nfor the skin to read.",
2116
- "name": "SkdxFormSection",
1997
+ "description": "Forgot-password block: a description, one email field and a submit button,\nreplaced entirely by a success alert once the request is accepted.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-forgot-password-page` on the host, then `__panel`,\n`__title`, `__description`, `__error`, `__success`, `__form`, `__field`,\n`__submit` and `__footer`.",
1998
+ "name": "SkdxForgotPasswordPage",
2117
1999
  "slots": [
2118
2000
  {
2119
- "description": "The group's fields, rendered into the content region.",
2001
+ "description": "Extra fields rendered inside the form, above the submit button.",
2120
2002
  "name": ""
2121
2003
  },
2122
2004
  {
2123
- "description": "Save, cancel or other controls rendered in the footer below the fields.",
2124
- "name": "actions"
2005
+ "description": "Navigation below the form, such as a link back to the sign-in page.",
2006
+ "name": "footer"
2125
2007
  }
2126
2008
  ],
2127
2009
  "members": [
@@ -2131,39 +2013,75 @@
2131
2013
  "type": {
2132
2014
  "text": "string"
2133
2015
  },
2134
- "description": "Heading text naming the group, rendered into a derived Heading that names the section.",
2135
- "attribute": "title",
2136
- "required": true
2016
+ "default": "'Reset your password'",
2017
+ "description": "Heading text, rendered into a derived `<h1>` that names the section.",
2018
+ "attribute": "title"
2137
2019
  },
2138
2020
  {
2139
2021
  "kind": "field",
2140
2022
  "name": "description",
2141
2023
  "type": {
2142
- "text": "string | undefined | undefined"
2024
+ "text": "string | undefined"
2143
2025
  },
2144
- "description": "Supporting copy rendered below the title, explaining the group's fields.",
2026
+ "description": "Supporting copy rendered below the title, explaining what the reset link does.",
2145
2027
  "default": "undefined",
2146
2028
  "attribute": "description"
2147
2029
  },
2148
2030
  {
2149
2031
  "kind": "field",
2150
- "name": "headingLevel",
2032
+ "name": "error",
2151
2033
  "type": {
2152
- "text": "1 | 2 | 3 | 4 | 5 | 6"
2034
+ "text": "string | undefined"
2153
2035
  },
2154
- "default": "2",
2155
- "description": "Outline level of the derived title heading, lowered or raised to fit the surrounding form outline.",
2156
- "attribute": "heading-level"
2036
+ "description": "Message rendered into a derived error Alert above the form. The block never clears it.",
2037
+ "default": "undefined",
2038
+ "attribute": "error"
2157
2039
  },
2158
2040
  {
2159
2041
  "kind": "field",
2160
- "name": "variant",
2042
+ "name": "success",
2161
2043
  "type": {
2162
- "text": "'bordered' | 'split' | (string & {}) | undefined | undefined"
2044
+ "text": "string | undefined"
2163
2045
  },
2164
- "description": "Layout rung written to `data-variant`; `bordered` draws a bounded panel and `split` places the header beside the content.",
2046
+ "description": "Confirmation rendered into a derived success Alert that replaces the form entirely.",
2165
2047
  "default": "undefined",
2166
- "attribute": "variant"
2048
+ "attribute": "success"
2049
+ },
2050
+ {
2051
+ "kind": "field",
2052
+ "name": "pending",
2053
+ "type": {
2054
+ "text": "boolean"
2055
+ },
2056
+ "default": "false",
2057
+ "description": "Marks the request in flight, making the submit button busy while the email field stays editable.",
2058
+ "attribute": "pending"
2059
+ },
2060
+ {
2061
+ "kind": "field",
2062
+ "name": "emailLabel",
2063
+ "type": {
2064
+ "text": "string"
2065
+ },
2066
+ "default": "'Email'",
2067
+ "description": "Label of the email field the reset link is requested for.",
2068
+ "attribute": "email-label"
2069
+ },
2070
+ {
2071
+ "kind": "field",
2072
+ "name": "submitLabel",
2073
+ "type": {
2074
+ "text": "string"
2075
+ },
2076
+ "default": "'Send reset link'",
2077
+ "description": "Text of the form's submit button.",
2078
+ "attribute": "submit-label"
2079
+ }
2080
+ ],
2081
+ "events": [
2082
+ {
2083
+ "description": "Fires with `{ email }` when the form submits with an address that passes constraint validation.",
2084
+ "name": "request-reset"
2167
2085
  }
2168
2086
  ],
2169
2087
  "attributes": [
@@ -2172,96 +2090,131 @@
2172
2090
  "type": {
2173
2091
  "text": "string"
2174
2092
  },
2175
- "description": "Heading text naming the group, rendered into a derived Heading that names the section.",
2176
- "fieldName": "title",
2177
- "required": true
2093
+ "default": "'Reset your password'",
2094
+ "description": "Heading text, rendered into a derived `<h1>` that names the section.",
2095
+ "fieldName": "title"
2178
2096
  },
2179
2097
  {
2180
2098
  "name": "description",
2181
2099
  "type": {
2182
- "text": "string | undefined | undefined"
2100
+ "text": "string | undefined"
2183
2101
  },
2184
- "description": "Supporting copy rendered below the title, explaining the group's fields.",
2102
+ "description": "Supporting copy rendered below the title, explaining what the reset link does.",
2185
2103
  "default": "undefined",
2186
2104
  "fieldName": "description"
2187
2105
  },
2188
2106
  {
2189
- "name": "heading-level",
2107
+ "name": "error",
2190
2108
  "type": {
2191
- "text": "1 | 2 | 3 | 4 | 5 | 6"
2109
+ "text": "string | undefined"
2192
2110
  },
2193
- "default": "2",
2194
- "description": "Outline level of the derived title heading, lowered or raised to fit the surrounding form outline.",
2195
- "fieldName": "headingLevel"
2111
+ "description": "Message rendered into a derived error Alert above the form. The block never clears it.",
2112
+ "default": "undefined",
2113
+ "fieldName": "error"
2196
2114
  },
2197
2115
  {
2198
- "name": "variant",
2116
+ "name": "success",
2199
2117
  "type": {
2200
- "text": "'bordered' | 'split' | (string & {}) | undefined | undefined"
2118
+ "text": "string | undefined"
2201
2119
  },
2202
- "description": "Layout rung written to `data-variant`; `bordered` draws a bounded panel and `split` places the header beside the content.",
2120
+ "description": "Confirmation rendered into a derived success Alert that replaces the form entirely.",
2203
2121
  "default": "undefined",
2204
- "fieldName": "variant"
2122
+ "fieldName": "success"
2123
+ },
2124
+ {
2125
+ "name": "pending",
2126
+ "type": {
2127
+ "text": "boolean"
2128
+ },
2129
+ "default": "false",
2130
+ "description": "Marks the request in flight, making the submit button busy while the email field stays editable.",
2131
+ "fieldName": "pending"
2132
+ },
2133
+ {
2134
+ "name": "email-label",
2135
+ "type": {
2136
+ "text": "string"
2137
+ },
2138
+ "default": "'Email'",
2139
+ "description": "Label of the email field the reset link is requested for.",
2140
+ "fieldName": "emailLabel"
2141
+ },
2142
+ {
2143
+ "name": "submit-label",
2144
+ "type": {
2145
+ "text": "string"
2146
+ },
2147
+ "default": "'Send reset link'",
2148
+ "description": "Text of the form's submit button.",
2149
+ "fieldName": "submitLabel"
2205
2150
  }
2206
2151
  ],
2207
2152
  "superclass": {
2208
2153
  "name": "LitElement",
2209
2154
  "package": "lit"
2210
2155
  },
2211
- "tagName": "skdx-form-section",
2156
+ "tagName": "skdx-forgot-password-page",
2212
2157
  "customElement": true
2213
2158
  }
2214
2159
  ],
2215
2160
  "exports": [
2216
2161
  {
2217
2162
  "kind": "js",
2218
- "name": "SkdxFormSection",
2163
+ "name": "SkdxForgotPasswordPage",
2219
2164
  "declaration": {
2220
- "name": "SkdxFormSection",
2221
- "module": "src/form-section/FormSection.ts"
2165
+ "name": "SkdxForgotPasswordPage",
2166
+ "module": "src/forgot-password-page/ForgotPasswordPage.ts"
2222
2167
  }
2223
2168
  },
2224
2169
  {
2225
2170
  "kind": "custom-element-definition",
2226
- "name": "skdx-form-section",
2171
+ "name": "skdx-forgot-password-page",
2227
2172
  "declaration": {
2228
- "name": "SkdxFormSection",
2229
- "module": "src/form-section/FormSection.ts"
2173
+ "name": "SkdxForgotPasswordPage",
2174
+ "module": "src/forgot-password-page/ForgotPasswordPage.ts"
2230
2175
  }
2231
2176
  }
2232
2177
  ]
2233
2178
  },
2234
2179
  {
2235
2180
  "kind": "javascript-module",
2236
- "path": "src/form-section/index.ts",
2181
+ "path": "src/forgot-password-page/index.ts",
2237
2182
  "declarations": [],
2238
2183
  "exports": [
2239
2184
  {
2240
2185
  "kind": "js",
2241
- "name": "SkdxFormSection",
2186
+ "name": "SkdxForgotPasswordPage",
2242
2187
  "declaration": {
2243
- "name": "SkdxFormSection",
2244
- "module": "./FormSection"
2188
+ "name": "SkdxForgotPasswordPage",
2189
+ "module": "./ForgotPasswordPage"
2190
+ }
2191
+ },
2192
+ {
2193
+ "kind": "js",
2194
+ "name": "SkdxForgotPasswordDetail",
2195
+ "declaration": {
2196
+ "name": "SkdxForgotPasswordDetail",
2197
+ "module": "./ForgotPasswordPage"
2245
2198
  }
2246
2199
  }
2247
2200
  ]
2248
2201
  },
2249
2202
  {
2250
2203
  "kind": "javascript-module",
2251
- "path": "src/forgot-password-page/ForgotPasswordPage.ts",
2204
+ "path": "src/form-section/FormSection.ts",
2252
2205
  "declarations": [
2253
2206
  {
2254
2207
  "kind": "class",
2255
- "description": "Forgot-password block: a description, one email field and a submit button,\nreplaced entirely by a success alert once the request is accepted.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-forgot-password-page` on the host, then `__panel`,\n`__title`, `__description`, `__error`, `__success`, `__form`, `__field`,\n`__submit` and `__footer`.",
2256
- "name": "SkdxForgotPasswordPage",
2208
+ "description": "Titled group inside a larger form: a heading, supporting text, the group's\nfields and a footer for the group's own actions, composing Heading and Text\naround consumer-supplied fields.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-form-section` on the host, then `__header`, `__title`,\n`__description`, `__content` and `__footer`. `data-variant` sits on the host\nfor the skin to read.",
2209
+ "name": "SkdxFormSection",
2257
2210
  "slots": [
2258
2211
  {
2259
- "description": "Extra fields rendered inside the form, above the submit button.",
2212
+ "description": "The group's fields, rendered into the content region.",
2260
2213
  "name": ""
2261
2214
  },
2262
2215
  {
2263
- "description": "Navigation below the form, such as a link back to the sign-in page.",
2264
- "name": "footer"
2216
+ "description": "Save, cancel or other controls rendered in the footer below the fields.",
2217
+ "name": "actions"
2265
2218
  }
2266
2219
  ],
2267
2220
  "members": [
@@ -2271,75 +2224,39 @@
2271
2224
  "type": {
2272
2225
  "text": "string"
2273
2226
  },
2274
- "default": "'Reset your password'",
2275
- "description": "Heading text, rendered into a derived `<h1>` that names the section.",
2276
- "attribute": "title"
2227
+ "description": "Heading text naming the group, rendered into a derived Heading that names the section.",
2228
+ "attribute": "title",
2229
+ "required": true
2277
2230
  },
2278
2231
  {
2279
2232
  "kind": "field",
2280
2233
  "name": "description",
2281
2234
  "type": {
2282
- "text": "string | undefined"
2235
+ "text": "string | undefined | undefined"
2283
2236
  },
2284
- "description": "Supporting copy rendered below the title, explaining what the reset link does.",
2237
+ "description": "Supporting copy rendered below the title, explaining the group's fields.",
2285
2238
  "default": "undefined",
2286
2239
  "attribute": "description"
2287
2240
  },
2288
2241
  {
2289
2242
  "kind": "field",
2290
- "name": "error",
2243
+ "name": "headingLevel",
2291
2244
  "type": {
2292
- "text": "string | undefined"
2245
+ "text": "1 | 2 | 3 | 4 | 5 | 6"
2293
2246
  },
2294
- "description": "Message rendered into a derived error Alert above the form. The block never clears it.",
2295
- "default": "undefined",
2296
- "attribute": "error"
2247
+ "default": "2",
2248
+ "description": "Outline level of the derived title heading, lowered or raised to fit the surrounding form outline.",
2249
+ "attribute": "heading-level"
2297
2250
  },
2298
2251
  {
2299
2252
  "kind": "field",
2300
- "name": "success",
2253
+ "name": "variant",
2301
2254
  "type": {
2302
- "text": "string | undefined"
2255
+ "text": "'bordered' | 'split' | (string & {}) | undefined | undefined"
2303
2256
  },
2304
- "description": "Confirmation rendered into a derived success Alert that replaces the form entirely.",
2257
+ "description": "Layout rung written to `data-variant`; `bordered` draws a bounded panel and `split` places the header beside the content.",
2305
2258
  "default": "undefined",
2306
- "attribute": "success"
2307
- },
2308
- {
2309
- "kind": "field",
2310
- "name": "pending",
2311
- "type": {
2312
- "text": "boolean"
2313
- },
2314
- "default": "false",
2315
- "description": "Marks the request in flight, making the submit button busy while the email field stays editable.",
2316
- "attribute": "pending"
2317
- },
2318
- {
2319
- "kind": "field",
2320
- "name": "emailLabel",
2321
- "type": {
2322
- "text": "string"
2323
- },
2324
- "default": "'Email'",
2325
- "description": "Label of the email field the reset link is requested for.",
2326
- "attribute": "email-label"
2327
- },
2328
- {
2329
- "kind": "field",
2330
- "name": "submitLabel",
2331
- "type": {
2332
- "text": "string"
2333
- },
2334
- "default": "'Send reset link'",
2335
- "description": "Text of the form's submit button.",
2336
- "attribute": "submit-label"
2337
- }
2338
- ],
2339
- "events": [
2340
- {
2341
- "description": "Fires with `{ email }` when the form submits with an address that passes constraint validation.",
2342
- "name": "request-reset"
2259
+ "attribute": "variant"
2343
2260
  }
2344
2261
  ],
2345
2262
  "attributes": [
@@ -2348,297 +2265,143 @@
2348
2265
  "type": {
2349
2266
  "text": "string"
2350
2267
  },
2351
- "default": "'Reset your password'",
2352
- "description": "Heading text, rendered into a derived `<h1>` that names the section.",
2353
- "fieldName": "title"
2268
+ "description": "Heading text naming the group, rendered into a derived Heading that names the section.",
2269
+ "fieldName": "title",
2270
+ "required": true
2354
2271
  },
2355
2272
  {
2356
2273
  "name": "description",
2357
2274
  "type": {
2358
- "text": "string | undefined"
2275
+ "text": "string | undefined | undefined"
2359
2276
  },
2360
- "description": "Supporting copy rendered below the title, explaining what the reset link does.",
2277
+ "description": "Supporting copy rendered below the title, explaining the group's fields.",
2361
2278
  "default": "undefined",
2362
2279
  "fieldName": "description"
2363
2280
  },
2364
2281
  {
2365
- "name": "error",
2282
+ "name": "heading-level",
2366
2283
  "type": {
2367
- "text": "string | undefined"
2284
+ "text": "1 | 2 | 3 | 4 | 5 | 6"
2368
2285
  },
2369
- "description": "Message rendered into a derived error Alert above the form. The block never clears it.",
2370
- "default": "undefined",
2371
- "fieldName": "error"
2286
+ "default": "2",
2287
+ "description": "Outline level of the derived title heading, lowered or raised to fit the surrounding form outline.",
2288
+ "fieldName": "headingLevel"
2372
2289
  },
2373
2290
  {
2374
- "name": "success",
2291
+ "name": "variant",
2375
2292
  "type": {
2376
- "text": "string | undefined"
2293
+ "text": "'bordered' | 'split' | (string & {}) | undefined | undefined"
2377
2294
  },
2378
- "description": "Confirmation rendered into a derived success Alert that replaces the form entirely.",
2295
+ "description": "Layout rung written to `data-variant`; `bordered` draws a bounded panel and `split` places the header beside the content.",
2379
2296
  "default": "undefined",
2380
- "fieldName": "success"
2381
- },
2382
- {
2383
- "name": "pending",
2384
- "type": {
2385
- "text": "boolean"
2386
- },
2387
- "default": "false",
2388
- "description": "Marks the request in flight, making the submit button busy while the email field stays editable.",
2389
- "fieldName": "pending"
2390
- },
2391
- {
2392
- "name": "email-label",
2393
- "type": {
2394
- "text": "string"
2395
- },
2396
- "default": "'Email'",
2397
- "description": "Label of the email field the reset link is requested for.",
2398
- "fieldName": "emailLabel"
2399
- },
2400
- {
2401
- "name": "submit-label",
2402
- "type": {
2403
- "text": "string"
2404
- },
2405
- "default": "'Send reset link'",
2406
- "description": "Text of the form's submit button.",
2407
- "fieldName": "submitLabel"
2297
+ "fieldName": "variant"
2408
2298
  }
2409
2299
  ],
2410
2300
  "superclass": {
2411
2301
  "name": "LitElement",
2412
2302
  "package": "lit"
2413
2303
  },
2414
- "tagName": "skdx-forgot-password-page",
2304
+ "tagName": "skdx-form-section",
2415
2305
  "customElement": true
2416
2306
  }
2417
2307
  ],
2418
2308
  "exports": [
2419
2309
  {
2420
2310
  "kind": "js",
2421
- "name": "SkdxForgotPasswordPage",
2311
+ "name": "SkdxFormSection",
2422
2312
  "declaration": {
2423
- "name": "SkdxForgotPasswordPage",
2424
- "module": "src/forgot-password-page/ForgotPasswordPage.ts"
2313
+ "name": "SkdxFormSection",
2314
+ "module": "src/form-section/FormSection.ts"
2425
2315
  }
2426
2316
  },
2427
2317
  {
2428
2318
  "kind": "custom-element-definition",
2429
- "name": "skdx-forgot-password-page",
2319
+ "name": "skdx-form-section",
2430
2320
  "declaration": {
2431
- "name": "SkdxForgotPasswordPage",
2432
- "module": "src/forgot-password-page/ForgotPasswordPage.ts"
2321
+ "name": "SkdxFormSection",
2322
+ "module": "src/form-section/FormSection.ts"
2433
2323
  }
2434
2324
  }
2435
2325
  ]
2436
2326
  },
2437
2327
  {
2438
2328
  "kind": "javascript-module",
2439
- "path": "src/forgot-password-page/index.ts",
2329
+ "path": "src/form-section/index.ts",
2440
2330
  "declarations": [],
2441
2331
  "exports": [
2442
2332
  {
2443
2333
  "kind": "js",
2444
- "name": "SkdxForgotPasswordPage",
2334
+ "name": "SkdxFormSection",
2445
2335
  "declaration": {
2446
- "name": "SkdxForgotPasswordPage",
2447
- "module": "./ForgotPasswordPage"
2336
+ "name": "SkdxFormSection",
2337
+ "module": "./FormSection"
2448
2338
  }
2449
- },
2339
+ }
2340
+ ]
2341
+ },
2342
+ {
2343
+ "kind": "javascript-module",
2344
+ "path": "src/internal/define.ts",
2345
+ "declarations": [],
2346
+ "exports": [
2450
2347
  {
2451
- "kind": "js",
2452
- "name": "SkdxForgotPasswordDetail",
2348
+ "kind": "custom-element-definition",
2349
+ "name": "tagName",
2453
2350
  "declaration": {
2454
- "name": "SkdxForgotPasswordDetail",
2455
- "module": "./ForgotPasswordPage"
2351
+ "name": "anonymous_0",
2352
+ "module": "src/internal/define.ts"
2456
2353
  }
2457
2354
  }
2458
2355
  ]
2459
2356
  },
2460
2357
  {
2461
2358
  "kind": "javascript-module",
2462
- "path": "src/dashboard-layout/DashboardLayout.ts",
2359
+ "path": "src/internal/events.ts",
2360
+ "declarations": [],
2361
+ "exports": []
2362
+ },
2363
+ {
2364
+ "kind": "javascript-module",
2365
+ "path": "src/internal/part.ts",
2366
+ "declarations": [],
2367
+ "exports": []
2368
+ },
2369
+ {
2370
+ "kind": "javascript-module",
2371
+ "path": "src/internal/slots.ts",
2463
2372
  "declarations": [
2464
2373
  {
2465
- "kind": "class",
2466
- "description": "Application shell block: an app bar, a collapsible side navigation and the content region.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-dashboard-layout` on the host, then `__app-bar`,\n`__nav-toggle`, `__branding`, `__title`, `__actions`, `__body`, `__nav`,\n`__nav-list`, `__nav-item`, `__nav-header`, `__nav-divider` and `__content`.\n`data-nav-open` sits on the host while the navigation is shown.",
2467
- "name": "SkdxDashboardLayout",
2468
- "slots": [
2469
- {
2470
- "description": "The page content rendered inside the `<main>` region.",
2471
- "name": ""
2472
- },
2473
- {
2474
- "description": "Logo or product mark at the start of the app bar.",
2475
- "name": "branding"
2476
- },
2477
- {
2478
- "description": "Controls at the end of the app bar.",
2479
- "name": "actions"
2480
- }
2481
- ],
2482
- "members": [
2483
- {
2484
- "kind": "field",
2485
- "name": "title",
2486
- "type": {
2487
- "text": "string"
2488
- },
2489
- "default": "''",
2490
- "description": "Application title shown in the app bar after the branding, shadowing the native tooltip attribute.",
2491
- "attribute": "title"
2492
- },
2493
- {
2494
- "kind": "field",
2495
- "name": "navigation",
2496
- "type": {
2497
- "text": "readonly SkdxDashboardNavigationItem[]"
2498
- },
2499
- "description": "The side navigation, one entry per row, nested through each entry's `children`.",
2500
- "required": true
2501
- },
2502
- {
2503
- "kind": "field",
2504
- "name": "navOpen",
2505
- "type": {
2506
- "text": "boolean | undefined"
2507
- },
2508
- "description": "Whether the side navigation is shown, for controlled usage.",
2509
- "default": "undefined",
2510
- "attribute": "nav-open"
2511
- },
2512
- {
2513
- "kind": "field",
2514
- "name": "defaultNavOpen",
2515
- "type": {
2516
- "text": "boolean"
2517
- },
2518
- "default": "true",
2519
- "description": "Whether the side navigation starts shown, for uncontrolled usage.",
2520
- "attribute": "default-nav-open"
2521
- },
2522
- {
2523
- "kind": "field",
2524
- "name": "navLabel",
2525
- "type": {
2526
- "text": "string"
2527
- },
2528
- "default": "'Main navigation'",
2529
- "description": "Accessible name of the side navigation landmark.",
2530
- "attribute": "nav-label"
2531
- },
2532
- {
2533
- "kind": "field",
2534
- "name": "navToggleLabel",
2535
- "type": {
2536
- "text": "string"
2537
- },
2538
- "default": "'Toggle navigation'",
2539
- "description": "Accessible name of the icon-only button that shows and hides the navigation.",
2540
- "attribute": "nav-toggle-label"
2541
- }
2542
- ],
2543
- "events": [
2544
- {
2545
- "description": "Fires with the new open state whenever the navigation toggle is activated.",
2546
- "name": "nav-open-change"
2374
+ "kind": "function",
2375
+ "name": "hasUnslottedChild",
2376
+ "return": {
2377
+ "type": {
2378
+ "text": "boolean"
2547
2379
  }
2548
- ],
2549
- "attributes": [
2550
- {
2551
- "name": "title",
2552
- "type": {
2553
- "text": "string"
2554
- },
2555
- "default": "''",
2556
- "description": "Application title shown in the app bar after the branding, shadowing the native tooltip attribute.",
2557
- "fieldName": "title"
2558
- },
2559
- {
2560
- "name": "nav-open",
2561
- "type": {
2562
- "text": "boolean | undefined"
2563
- },
2564
- "description": "Whether the side navigation is shown, for controlled usage.",
2565
- "default": "undefined",
2566
- "fieldName": "navOpen"
2567
- },
2568
- {
2569
- "name": "default-nav-open",
2570
- "type": {
2571
- "text": "boolean"
2572
- },
2573
- "default": "true",
2574
- "description": "Whether the side navigation starts shown, for uncontrolled usage.",
2575
- "fieldName": "defaultNavOpen"
2576
- },
2380
+ },
2381
+ "parameters": [
2577
2382
  {
2578
- "name": "nav-label",
2383
+ "name": "host",
2579
2384
  "type": {
2580
- "text": "string"
2581
- },
2582
- "default": "'Main navigation'",
2583
- "description": "Accessible name of the side navigation landmark.",
2584
- "fieldName": "navLabel"
2385
+ "text": "HTMLElement"
2386
+ }
2585
2387
  },
2586
2388
  {
2587
- "name": "nav-toggle-label",
2389
+ "name": "marker",
2588
2390
  "type": {
2589
2391
  "text": "string"
2590
- },
2591
- "default": "'Toggle navigation'",
2592
- "description": "Accessible name of the icon-only button that shows and hides the navigation.",
2593
- "fieldName": "navToggleLabel"
2392
+ }
2594
2393
  }
2595
2394
  ],
2596
- "superclass": {
2597
- "name": "LitElement",
2598
- "package": "lit"
2599
- },
2600
- "tagName": "skdx-dashboard-layout",
2601
- "customElement": true
2395
+ "description": "Whether the host holds consumer content for the default slot: an element without a `slot` name that the block did not generate, or non-blank text."
2602
2396
  }
2603
2397
  ],
2604
2398
  "exports": [
2605
2399
  {
2606
2400
  "kind": "js",
2607
- "name": "SkdxDashboardLayout",
2608
- "declaration": {
2609
- "name": "SkdxDashboardLayout",
2610
- "module": "src/dashboard-layout/DashboardLayout.ts"
2611
- }
2612
- },
2613
- {
2614
- "kind": "custom-element-definition",
2615
- "name": "skdx-dashboard-layout",
2616
- "declaration": {
2617
- "name": "SkdxDashboardLayout",
2618
- "module": "src/dashboard-layout/DashboardLayout.ts"
2619
- }
2620
- }
2621
- ]
2622
- },
2623
- {
2624
- "kind": "javascript-module",
2625
- "path": "src/dashboard-layout/index.ts",
2626
- "declarations": [],
2627
- "exports": [
2628
- {
2629
- "kind": "js",
2630
- "name": "SkdxDashboardLayout",
2631
- "declaration": {
2632
- "name": "SkdxDashboardLayout",
2633
- "module": "./DashboardLayout"
2634
- }
2635
- },
2636
- {
2637
- "kind": "js",
2638
- "name": "SkdxDashboardNavigationItem",
2401
+ "name": "hasUnslottedChild",
2639
2402
  "declaration": {
2640
- "name": "SkdxDashboardNavigationItem",
2641
- "module": "./DashboardLayout"
2403
+ "name": "hasUnslottedChild",
2404
+ "module": "src/internal/slots.ts"
2642
2405
  }
2643
2406
  }
2644
2407
  ]
@@ -2929,73 +2692,6 @@
2929
2692
  }
2930
2693
  ]
2931
2694
  },
2932
- {
2933
- "kind": "javascript-module",
2934
- "path": "src/internal/define.ts",
2935
- "declarations": [],
2936
- "exports": [
2937
- {
2938
- "kind": "custom-element-definition",
2939
- "name": "tagName",
2940
- "declaration": {
2941
- "name": "anonymous_0",
2942
- "module": "src/internal/define.ts"
2943
- }
2944
- }
2945
- ]
2946
- },
2947
- {
2948
- "kind": "javascript-module",
2949
- "path": "src/internal/events.ts",
2950
- "declarations": [],
2951
- "exports": []
2952
- },
2953
- {
2954
- "kind": "javascript-module",
2955
- "path": "src/internal/part.ts",
2956
- "declarations": [],
2957
- "exports": []
2958
- },
2959
- {
2960
- "kind": "javascript-module",
2961
- "path": "src/internal/slots.ts",
2962
- "declarations": [
2963
- {
2964
- "kind": "function",
2965
- "name": "hasUnslottedChild",
2966
- "return": {
2967
- "type": {
2968
- "text": "boolean"
2969
- }
2970
- },
2971
- "parameters": [
2972
- {
2973
- "name": "host",
2974
- "type": {
2975
- "text": "HTMLElement"
2976
- }
2977
- },
2978
- {
2979
- "name": "marker",
2980
- "type": {
2981
- "text": "string"
2982
- }
2983
- }
2984
- ],
2985
- "description": "Whether the host holds consumer content for the default slot: an element without a `slot` name that the block did not generate, or non-blank text."
2986
- }
2987
- ],
2988
- "exports": [
2989
- {
2990
- "kind": "js",
2991
- "name": "hasUnslottedChild",
2992
- "declaration": {
2993
- "name": "hasUnslottedChild",
2994
- "module": "src/internal/slots.ts"
2995
- }
2996
- }
2997
- ]
2998
- },
2999
2695
  {
3000
2696
  "kind": "javascript-module",
3001
2697
  "path": "src/onboarding-checklist/OnboardingChecklist.ts",
@@ -3578,24 +3274,266 @@
3578
3274
  },
3579
3275
  {
3580
3276
  "kind": "javascript-module",
3581
- "path": "src/sign-up-page/SignUpPage.ts",
3277
+ "path": "src/sign-in-page/SignInPage.ts",
3582
3278
  "declarations": [
3583
3279
  {
3584
- "kind": "class",
3585
- "description": "Sign-up block: provider buttons, a credentials form with optional name,\nconfirmation and terms fields, and a footer.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-sign-up-page` on the host, then `__panel`, `__title`,\n`__error`, `__providers`, `__provider`, `__divider`, `__form`, `__field`,\n`__terms`, `__submit` and `__footer`.",
3586
- "name": "SkdxSignUpPage",
3587
- "slots": [
3588
- {
3589
- "description": "Extra fields rendered inside the form, above the terms and the submit button.",
3590
- "name": ""
3591
- },
3592
- {
3593
- "description": "Terms copy and links used as the label of the required terms checkbox.",
3594
- "name": "terms"
3595
- },
3596
- {
3597
- "description": "Navigation below the form, such as a link back to the sign-in page.",
3598
- "name": "footer"
3280
+ "kind": "function",
3281
+ "name": "defaultProviderLabel",
3282
+ "return": {
3283
+ "type": {
3284
+ "text": "string"
3285
+ }
3286
+ },
3287
+ "parameters": [
3288
+ {
3289
+ "name": "provider",
3290
+ "type": {
3291
+ "text": "SkdxSignInProvider"
3292
+ }
3293
+ }
3294
+ ],
3295
+ "description": "Default provider button text, reading \"Sign in with Google\" for a provider named Google."
3296
+ },
3297
+ {
3298
+ "kind": "class",
3299
+ "description": "Sign-in block: provider buttons, an email and password form, and a magic-link form.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-sign-in-page` on the host, then `__panel`, `__title`,\n`__error`, `__providers`, `__provider`, `__divider`, `__form`, `__field`\nand `__submit`.",
3300
+ "name": "SkdxSignInPage",
3301
+ "members": [
3302
+ {
3303
+ "kind": "field",
3304
+ "name": "title",
3305
+ "type": {
3306
+ "text": "string"
3307
+ },
3308
+ "default": "'Sign in'",
3309
+ "description": "Heading text, rendered into a derived `<h1>` that names the section.",
3310
+ "attribute": "title"
3311
+ },
3312
+ {
3313
+ "kind": "field",
3314
+ "name": "providers",
3315
+ "type": {
3316
+ "text": "readonly SkdxSignInProvider[]"
3317
+ },
3318
+ "description": "The ways to sign in, in render order; `'credentials'` and `'magic-link'` render their forms.",
3319
+ "required": true
3320
+ },
3321
+ {
3322
+ "kind": "field",
3323
+ "name": "error",
3324
+ "type": {
3325
+ "text": "string | undefined"
3326
+ },
3327
+ "description": "Message rendered into a derived error Alert above the providers. The block never clears it.",
3328
+ "default": "undefined",
3329
+ "attribute": "error"
3330
+ },
3331
+ {
3332
+ "kind": "field",
3333
+ "name": "emailLabel",
3334
+ "type": {
3335
+ "text": "string"
3336
+ },
3337
+ "default": "'Email'",
3338
+ "description": "Label of the email field in both forms.",
3339
+ "attribute": "email-label"
3340
+ },
3341
+ {
3342
+ "kind": "field",
3343
+ "name": "passwordLabel",
3344
+ "type": {
3345
+ "text": "string"
3346
+ },
3347
+ "default": "'Password'",
3348
+ "description": "Label of the password field in the credentials form.",
3349
+ "attribute": "password-label"
3350
+ },
3351
+ {
3352
+ "kind": "field",
3353
+ "name": "submitLabel",
3354
+ "type": {
3355
+ "text": "string"
3356
+ },
3357
+ "default": "'Sign in'",
3358
+ "description": "Text of the credentials form submit button.",
3359
+ "attribute": "submit-label"
3360
+ },
3361
+ {
3362
+ "kind": "field",
3363
+ "name": "magicLinkLabel",
3364
+ "type": {
3365
+ "text": "string"
3366
+ },
3367
+ "default": "'Send magic link'",
3368
+ "description": "Text of the magic-link form submit button.",
3369
+ "attribute": "magic-link-label"
3370
+ },
3371
+ {
3372
+ "kind": "field",
3373
+ "name": "getProviderLabel",
3374
+ "type": {
3375
+ "text": "(provider: SkdxSignInProvider) => string | undefined"
3376
+ },
3377
+ "description": "Formats a provider button's text from its entry.",
3378
+ "default": "defaultProviderLabel"
3379
+ }
3380
+ ],
3381
+ "events": [
3382
+ {
3383
+ "description": "Fires with `{ providerId, email?, password? }` when a provider button is activated or a form submits with valid fields.",
3384
+ "name": "sign-in"
3385
+ }
3386
+ ],
3387
+ "attributes": [
3388
+ {
3389
+ "name": "title",
3390
+ "type": {
3391
+ "text": "string"
3392
+ },
3393
+ "default": "'Sign in'",
3394
+ "description": "Heading text, rendered into a derived `<h1>` that names the section.",
3395
+ "fieldName": "title"
3396
+ },
3397
+ {
3398
+ "name": "error",
3399
+ "type": {
3400
+ "text": "string | undefined"
3401
+ },
3402
+ "description": "Message rendered into a derived error Alert above the providers. The block never clears it.",
3403
+ "default": "undefined",
3404
+ "fieldName": "error"
3405
+ },
3406
+ {
3407
+ "name": "email-label",
3408
+ "type": {
3409
+ "text": "string"
3410
+ },
3411
+ "default": "'Email'",
3412
+ "description": "Label of the email field in both forms.",
3413
+ "fieldName": "emailLabel"
3414
+ },
3415
+ {
3416
+ "name": "password-label",
3417
+ "type": {
3418
+ "text": "string"
3419
+ },
3420
+ "default": "'Password'",
3421
+ "description": "Label of the password field in the credentials form.",
3422
+ "fieldName": "passwordLabel"
3423
+ },
3424
+ {
3425
+ "name": "submit-label",
3426
+ "type": {
3427
+ "text": "string"
3428
+ },
3429
+ "default": "'Sign in'",
3430
+ "description": "Text of the credentials form submit button.",
3431
+ "fieldName": "submitLabel"
3432
+ },
3433
+ {
3434
+ "name": "magic-link-label",
3435
+ "type": {
3436
+ "text": "string"
3437
+ },
3438
+ "default": "'Send magic link'",
3439
+ "description": "Text of the magic-link form submit button.",
3440
+ "fieldName": "magicLinkLabel"
3441
+ }
3442
+ ],
3443
+ "superclass": {
3444
+ "name": "LitElement",
3445
+ "package": "lit"
3446
+ },
3447
+ "tagName": "skdx-sign-in-page",
3448
+ "customElement": true
3449
+ }
3450
+ ],
3451
+ "exports": [
3452
+ {
3453
+ "kind": "js",
3454
+ "name": "defaultProviderLabel",
3455
+ "declaration": {
3456
+ "name": "defaultProviderLabel",
3457
+ "module": "src/sign-in-page/SignInPage.ts"
3458
+ }
3459
+ },
3460
+ {
3461
+ "kind": "js",
3462
+ "name": "SkdxSignInPage",
3463
+ "declaration": {
3464
+ "name": "SkdxSignInPage",
3465
+ "module": "src/sign-in-page/SignInPage.ts"
3466
+ }
3467
+ },
3468
+ {
3469
+ "kind": "custom-element-definition",
3470
+ "name": "skdx-sign-in-page",
3471
+ "declaration": {
3472
+ "name": "SkdxSignInPage",
3473
+ "module": "src/sign-in-page/SignInPage.ts"
3474
+ }
3475
+ }
3476
+ ]
3477
+ },
3478
+ {
3479
+ "kind": "javascript-module",
3480
+ "path": "src/sign-in-page/index.ts",
3481
+ "declarations": [],
3482
+ "exports": [
3483
+ {
3484
+ "kind": "js",
3485
+ "name": "defaultProviderLabel",
3486
+ "declaration": {
3487
+ "name": "defaultProviderLabel",
3488
+ "module": "./SignInPage"
3489
+ }
3490
+ },
3491
+ {
3492
+ "kind": "js",
3493
+ "name": "SkdxSignInPage",
3494
+ "declaration": {
3495
+ "name": "SkdxSignInPage",
3496
+ "module": "./SignInPage"
3497
+ }
3498
+ },
3499
+ {
3500
+ "kind": "js",
3501
+ "name": "SkdxSignInDetail",
3502
+ "declaration": {
3503
+ "name": "SkdxSignInDetail",
3504
+ "module": "./SignInPage"
3505
+ }
3506
+ },
3507
+ {
3508
+ "kind": "js",
3509
+ "name": "SkdxSignInProvider",
3510
+ "declaration": {
3511
+ "name": "SkdxSignInProvider",
3512
+ "module": "./SignInPage"
3513
+ }
3514
+ }
3515
+ ]
3516
+ },
3517
+ {
3518
+ "kind": "javascript-module",
3519
+ "path": "src/sign-up-page/SignUpPage.ts",
3520
+ "declarations": [
3521
+ {
3522
+ "kind": "class",
3523
+ "description": "Sign-up block: provider buttons, a credentials form with optional name,\nconfirmation and terms fields, and a footer.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-sign-up-page` on the host, then `__panel`, `__title`,\n`__error`, `__providers`, `__provider`, `__divider`, `__form`, `__field`,\n`__terms`, `__submit` and `__footer`.",
3524
+ "name": "SkdxSignUpPage",
3525
+ "slots": [
3526
+ {
3527
+ "description": "Extra fields rendered inside the form, above the terms and the submit button.",
3528
+ "name": ""
3529
+ },
3530
+ {
3531
+ "description": "Terms copy and links used as the label of the required terms checkbox.",
3532
+ "name": "terms"
3533
+ },
3534
+ {
3535
+ "description": "Navigation below the form, such as a link back to the sign-in page.",
3536
+ "name": "footer"
3599
3537
  }
3600
3538
  ],
3601
3539
  "members": [
@@ -3853,242 +3791,232 @@
3853
3791
  },
3854
3792
  {
3855
3793
  "kind": "javascript-module",
3856
- "path": "src/sign-in-page/SignInPage.ts",
3794
+ "path": "src/stat-card/StatCard.ts",
3857
3795
  "declarations": [
3858
3796
  {
3859
- "kind": "function",
3860
- "name": "defaultProviderLabel",
3861
- "return": {
3862
- "type": {
3863
- "text": "string"
3864
- }
3865
- },
3866
- "parameters": [
3797
+ "kind": "class",
3798
+ "description": "KPI tile block: a label, a value, an optional trend with sentiment colour,\na description, a derived progress bar and a visual region, all inside one\n`role=\"group\"` named by its own label.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-stat-card` on the host, then `__header`, `__icon`,\n`__label`, `__actions`, `__body`, `__value`, `__trend`, `__trend-icon`,\n`__description`, `__progress`, `__visual` and `__footer`. `data-trend`,\n`data-sentiment` and `data-state` sit on the host for the skin to read.",
3799
+ "name": "SkdxStatCard",
3800
+ "slots": [
3867
3801
  {
3868
- "name": "provider",
3869
- "type": {
3870
- "text": "SkdxSignInProvider"
3871
- }
3802
+ "description": "The metric's current reading, already formatted by the consumer.",
3803
+ "name": "value"
3804
+ },
3805
+ {
3806
+ "description": "Decorative glyph rendered beside the label in the card header.",
3807
+ "name": "icon"
3808
+ },
3809
+ {
3810
+ "description": "Decorative glyph rendered beside the change text in the trend region.",
3811
+ "name": "trend-icon"
3812
+ },
3813
+ {
3814
+ "description": "A chart or sparkline region the card sizes for the consumer to draw into.",
3815
+ "name": "visual"
3816
+ },
3817
+ {
3818
+ "description": "Content rendered in a footer region below the card's other regions.",
3819
+ "name": "footer"
3820
+ },
3821
+ {
3822
+ "description": "Controls rendered at the end of the header, such as a menu button.",
3823
+ "name": "actions"
3872
3824
  }
3873
3825
  ],
3874
- "description": "Default provider button text, reading \"Sign in with Google\" for a provider named Google."
3875
- },
3876
- {
3877
- "kind": "class",
3878
- "description": "Sign-in block: provider buttons, an email and password form, and a magic-link form.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-sign-in-page` on the host, then `__panel`, `__title`,\n`__error`, `__providers`, `__provider`, `__divider`, `__form`, `__field`\nand `__submit`.",
3879
- "name": "SkdxSignInPage",
3880
3826
  "members": [
3881
3827
  {
3882
3828
  "kind": "field",
3883
- "name": "title",
3829
+ "name": "label",
3884
3830
  "type": {
3885
3831
  "text": "string"
3886
3832
  },
3887
- "default": "'Sign in'",
3888
- "description": "Heading text, rendered into a derived `<h1>` that names the section.",
3889
- "attribute": "title"
3833
+ "description": "Name of the metric, rendered into the label that names the group through `aria-labelledby`.",
3834
+ "attribute": "label",
3835
+ "required": true
3890
3836
  },
3891
3837
  {
3892
3838
  "kind": "field",
3893
- "name": "providers",
3839
+ "name": "change",
3894
3840
  "type": {
3895
- "text": "readonly SkdxSignInProvider[]"
3841
+ "text": "string | undefined | undefined"
3896
3842
  },
3897
- "description": "The ways to sign in, in render order; `'credentials'` and `'magic-link'` render their forms.",
3898
- "required": true
3843
+ "description": "Already-formatted delta text such as \"+12.4%\", rendered inside the trend region.",
3844
+ "default": "undefined",
3845
+ "attribute": "change"
3899
3846
  },
3900
3847
  {
3901
3848
  "kind": "field",
3902
- "name": "error",
3849
+ "name": "trend",
3903
3850
  "type": {
3904
- "text": "string | undefined"
3851
+ "text": "'up' | 'down' | 'neutral' | undefined | undefined"
3905
3852
  },
3906
- "description": "Message rendered into a derived error Alert above the providers. The block never clears it.",
3853
+ "description": "Direction of the change only, written to `data-trend` on the host and the trend part.",
3907
3854
  "default": "undefined",
3908
- "attribute": "error"
3855
+ "attribute": "trend"
3909
3856
  },
3910
3857
  {
3911
3858
  "kind": "field",
3912
- "name": "emailLabel",
3859
+ "name": "sentiment",
3913
3860
  "type": {
3914
- "text": "string"
3861
+ "text": "'positive' | 'negative' | 'neutral' | undefined | undefined"
3915
3862
  },
3916
- "default": "'Email'",
3917
- "description": "Label of the email field in both forms.",
3918
- "attribute": "email-label"
3863
+ "description": "Whether the change is good or bad, independent of `trend`, written to `data-sentiment`.",
3864
+ "default": "undefined",
3865
+ "attribute": "sentiment"
3919
3866
  },
3920
3867
  {
3921
3868
  "kind": "field",
3922
- "name": "passwordLabel",
3869
+ "name": "changeLabel",
3923
3870
  "type": {
3924
- "text": "string"
3871
+ "text": "string | undefined | undefined"
3925
3872
  },
3926
- "default": "'Password'",
3927
- "description": "Label of the password field in the credentials form.",
3928
- "attribute": "password-label"
3873
+ "description": "Visually hidden text read before the change, such as \"Increased by\".",
3874
+ "default": "undefined",
3875
+ "attribute": "change-label"
3929
3876
  },
3930
3877
  {
3931
3878
  "kind": "field",
3932
- "name": "submitLabel",
3879
+ "name": "description",
3933
3880
  "type": {
3934
- "text": "string"
3881
+ "text": "string | undefined | undefined"
3935
3882
  },
3936
- "default": "'Sign in'",
3937
- "description": "Text of the credentials form submit button.",
3938
- "attribute": "submit-label"
3883
+ "description": "Supporting text rendered below the value, in the skin's muted tone.",
3884
+ "default": "undefined",
3885
+ "attribute": "description"
3939
3886
  },
3940
3887
  {
3941
3888
  "kind": "field",
3942
- "name": "magicLinkLabel",
3889
+ "name": "progress",
3943
3890
  "type": {
3944
- "text": "string"
3891
+ "text": "number | undefined | undefined"
3945
3892
  },
3946
- "default": "'Send magic link'",
3947
- "description": "Text of the magic-link form submit button.",
3948
- "attribute": "magic-link-label"
3893
+ "description": "Percentage from 0 to 100, rendered into a derived Progress named by the label.",
3894
+ "default": "undefined",
3895
+ "attribute": "progress"
3949
3896
  },
3950
3897
  {
3951
3898
  "kind": "field",
3952
- "name": "getProviderLabel",
3899
+ "name": "loading",
3953
3900
  "type": {
3954
- "text": "(provider: SkdxSignInProvider) => string | undefined"
3901
+ "text": "boolean"
3955
3902
  },
3956
- "description": "Formats a provider button's text from its entry.",
3957
- "default": "defaultProviderLabel"
3958
- }
3959
- ],
3960
- "events": [
3961
- {
3962
- "description": "Fires with `{ providerId, email?, password? }` when a provider button is activated or a form submits with valid fields.",
3963
- "name": "sign-in"
3903
+ "default": "false",
3904
+ "description": "Shows a skeleton in the value region and withholds the trend while true.",
3905
+ "attribute": "loading"
3964
3906
  }
3965
3907
  ],
3966
3908
  "attributes": [
3967
3909
  {
3968
- "name": "title",
3910
+ "name": "label",
3969
3911
  "type": {
3970
3912
  "text": "string"
3971
3913
  },
3972
- "default": "'Sign in'",
3973
- "description": "Heading text, rendered into a derived `<h1>` that names the section.",
3974
- "fieldName": "title"
3914
+ "description": "Name of the metric, rendered into the label that names the group through `aria-labelledby`.",
3915
+ "fieldName": "label",
3916
+ "required": true
3975
3917
  },
3976
3918
  {
3977
- "name": "error",
3919
+ "name": "change",
3978
3920
  "type": {
3979
- "text": "string | undefined"
3921
+ "text": "string | undefined | undefined"
3980
3922
  },
3981
- "description": "Message rendered into a derived error Alert above the providers. The block never clears it.",
3923
+ "description": "Already-formatted delta text such as \"+12.4%\", rendered inside the trend region.",
3982
3924
  "default": "undefined",
3983
- "fieldName": "error"
3925
+ "fieldName": "change"
3984
3926
  },
3985
3927
  {
3986
- "name": "email-label",
3928
+ "name": "trend",
3987
3929
  "type": {
3988
- "text": "string"
3930
+ "text": "'up' | 'down' | 'neutral' | undefined | undefined"
3989
3931
  },
3990
- "default": "'Email'",
3991
- "description": "Label of the email field in both forms.",
3992
- "fieldName": "emailLabel"
3932
+ "description": "Direction of the change only, written to `data-trend` on the host and the trend part.",
3933
+ "default": "undefined",
3934
+ "fieldName": "trend"
3993
3935
  },
3994
3936
  {
3995
- "name": "password-label",
3937
+ "name": "sentiment",
3996
3938
  "type": {
3997
- "text": "string"
3939
+ "text": "'positive' | 'negative' | 'neutral' | undefined | undefined"
3998
3940
  },
3999
- "default": "'Password'",
4000
- "description": "Label of the password field in the credentials form.",
4001
- "fieldName": "passwordLabel"
3941
+ "description": "Whether the change is good or bad, independent of `trend`, written to `data-sentiment`.",
3942
+ "default": "undefined",
3943
+ "fieldName": "sentiment"
4002
3944
  },
4003
3945
  {
4004
- "name": "submit-label",
3946
+ "name": "change-label",
4005
3947
  "type": {
4006
- "text": "string"
3948
+ "text": "string | undefined | undefined"
4007
3949
  },
4008
- "default": "'Sign in'",
4009
- "description": "Text of the credentials form submit button.",
4010
- "fieldName": "submitLabel"
3950
+ "description": "Visually hidden text read before the change, such as \"Increased by\".",
3951
+ "default": "undefined",
3952
+ "fieldName": "changeLabel"
4011
3953
  },
4012
3954
  {
4013
- "name": "magic-link-label",
3955
+ "name": "description",
4014
3956
  "type": {
4015
- "text": "string"
3957
+ "text": "string | undefined | undefined"
4016
3958
  },
4017
- "default": "'Send magic link'",
4018
- "description": "Text of the magic-link form submit button.",
4019
- "fieldName": "magicLinkLabel"
3959
+ "description": "Supporting text rendered below the value, in the skin's muted tone.",
3960
+ "default": "undefined",
3961
+ "fieldName": "description"
3962
+ },
3963
+ {
3964
+ "name": "progress",
3965
+ "type": {
3966
+ "text": "number | undefined | undefined"
3967
+ },
3968
+ "description": "Percentage from 0 to 100, rendered into a derived Progress named by the label.",
3969
+ "default": "undefined",
3970
+ "fieldName": "progress"
3971
+ },
3972
+ {
3973
+ "name": "loading",
3974
+ "type": {
3975
+ "text": "boolean"
3976
+ },
3977
+ "default": "false",
3978
+ "description": "Shows a skeleton in the value region and withholds the trend while true.",
3979
+ "fieldName": "loading"
4020
3980
  }
4021
3981
  ],
4022
3982
  "superclass": {
4023
3983
  "name": "LitElement",
4024
3984
  "package": "lit"
4025
3985
  },
4026
- "tagName": "skdx-sign-in-page",
3986
+ "tagName": "skdx-stat-card",
4027
3987
  "customElement": true
4028
3988
  }
4029
3989
  ],
4030
3990
  "exports": [
4031
3991
  {
4032
3992
  "kind": "js",
4033
- "name": "defaultProviderLabel",
4034
- "declaration": {
4035
- "name": "defaultProviderLabel",
4036
- "module": "src/sign-in-page/SignInPage.ts"
4037
- }
4038
- },
4039
- {
4040
- "kind": "js",
4041
- "name": "SkdxSignInPage",
3993
+ "name": "SkdxStatCard",
4042
3994
  "declaration": {
4043
- "name": "SkdxSignInPage",
4044
- "module": "src/sign-in-page/SignInPage.ts"
3995
+ "name": "SkdxStatCard",
3996
+ "module": "src/stat-card/StatCard.ts"
4045
3997
  }
4046
3998
  },
4047
3999
  {
4048
4000
  "kind": "custom-element-definition",
4049
- "name": "skdx-sign-in-page",
4001
+ "name": "skdx-stat-card",
4050
4002
  "declaration": {
4051
- "name": "SkdxSignInPage",
4052
- "module": "src/sign-in-page/SignInPage.ts"
4003
+ "name": "SkdxStatCard",
4004
+ "module": "src/stat-card/StatCard.ts"
4053
4005
  }
4054
4006
  }
4055
4007
  ]
4056
4008
  },
4057
4009
  {
4058
4010
  "kind": "javascript-module",
4059
- "path": "src/sign-in-page/index.ts",
4011
+ "path": "src/stat-card/index.ts",
4060
4012
  "declarations": [],
4061
4013
  "exports": [
4062
4014
  {
4063
4015
  "kind": "js",
4064
- "name": "defaultProviderLabel",
4065
- "declaration": {
4066
- "name": "defaultProviderLabel",
4067
- "module": "./SignInPage"
4068
- }
4069
- },
4070
- {
4071
- "kind": "js",
4072
- "name": "SkdxSignInPage",
4073
- "declaration": {
4074
- "name": "SkdxSignInPage",
4075
- "module": "./SignInPage"
4076
- }
4077
- },
4078
- {
4079
- "kind": "js",
4080
- "name": "SkdxSignInDetail",
4081
- "declaration": {
4082
- "name": "SkdxSignInDetail",
4083
- "module": "./SignInPage"
4084
- }
4085
- },
4086
- {
4087
- "kind": "js",
4088
- "name": "SkdxSignInProvider",
4016
+ "name": "SkdxStatCard",
4089
4017
  "declaration": {
4090
- "name": "SkdxSignInProvider",
4091
- "module": "./SignInPage"
4018
+ "name": "SkdxStatCard",
4019
+ "module": "./StatCard"
4092
4020
  }
4093
4021
  }
4094
4022
  ]
@@ -4307,12 +4235,262 @@
4307
4235
  },
4308
4236
  {
4309
4237
  "kind": "javascript-module",
4310
- "path": "src/verification-page/VerificationPage.ts",
4238
+ "path": "src/user-menu/UserMenu.ts",
4311
4239
  "declarations": [
4312
4240
  {
4313
4241
  "kind": "class",
4314
- "description": "Verification block: a pin input for a one-time code, a submit button and a\nresend control whose cooldown the consumer owns.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-verification-page` on the host, then `__panel`, `__title`,\n`__description`, `__error`, `__form`, `__field`, `__code`, `__submit`,\n`__resend`, `__resend-hint` and `__footer`.",
4315
- "name": "SkdxVerificationPage",
4242
+ "description": "The signed-in user's menu: a derived trigger showing an avatar, name and\ndescription that opens a panel repeating the identity above the\napplication's own entries.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-user-menu` on the host, then `__avatar`, `__identity`,\n`__name`, `__description`, `__content` and `__header`. `data-variant` sits on\nthe host while the derived trigger renders.",
4243
+ "name": "SkdxUserMenu",
4244
+ "slots": [
4245
+ {
4246
+ "description": "The application's own menu entries, rendered below the repeated identity header.",
4247
+ "name": ""
4248
+ },
4249
+ {
4250
+ "description": "Content that replaces the derived avatar-and-identity trigger entirely.",
4251
+ "name": "trigger"
4252
+ },
4253
+ {
4254
+ "description": "An extra indicator rendered after the identity in the trigger.",
4255
+ "name": "status"
4256
+ }
4257
+ ],
4258
+ "members": [
4259
+ {
4260
+ "kind": "field",
4261
+ "name": "name",
4262
+ "type": {
4263
+ "text": "string"
4264
+ },
4265
+ "description": "The signed-in user's name, rendered in the trigger and repeated in the menu header.",
4266
+ "attribute": "name",
4267
+ "required": true
4268
+ },
4269
+ {
4270
+ "kind": "field",
4271
+ "name": "description",
4272
+ "type": {
4273
+ "text": "string | undefined | undefined"
4274
+ },
4275
+ "description": "Secondary text such as an email or role, rendered below the name in the trigger and the header.",
4276
+ "default": "undefined",
4277
+ "attribute": "description"
4278
+ },
4279
+ {
4280
+ "kind": "field",
4281
+ "name": "avatarSrc",
4282
+ "type": {
4283
+ "text": "string | undefined | undefined"
4284
+ },
4285
+ "description": "Source of the identity image, passed straight through to the derived Avatar.",
4286
+ "default": "undefined",
4287
+ "attribute": "avatar-src"
4288
+ },
4289
+ {
4290
+ "kind": "field",
4291
+ "name": "variant",
4292
+ "type": {
4293
+ "text": "'compact' | (string & {}) | undefined | undefined"
4294
+ },
4295
+ "description": "Visual rung written to `data-variant`; `'compact'` visually hides the identity text while keeping it as the accessible name.",
4296
+ "default": "undefined",
4297
+ "attribute": "variant"
4298
+ },
4299
+ {
4300
+ "kind": "field",
4301
+ "name": "open",
4302
+ "type": {
4303
+ "text": "boolean | undefined | undefined"
4304
+ },
4305
+ "description": "Whether the menu is open, for controlled usage paired with `open-change`.",
4306
+ "default": "undefined",
4307
+ "attribute": "open"
4308
+ },
4309
+ {
4310
+ "kind": "field",
4311
+ "name": "defaultOpen",
4312
+ "type": {
4313
+ "text": "boolean"
4314
+ },
4315
+ "default": "false",
4316
+ "description": "Whether the menu starts open, for uncontrolled usage.",
4317
+ "attribute": "default-open"
4318
+ },
4319
+ {
4320
+ "kind": "field",
4321
+ "name": "side",
4322
+ "type": {
4323
+ "text": "'top' | 'right' | 'bottom' | 'left'"
4324
+ },
4325
+ "default": "'bottom'",
4326
+ "description": "Which side of the trigger the menu panel opens on.",
4327
+ "attribute": "side"
4328
+ },
4329
+ {
4330
+ "kind": "field",
4331
+ "name": "align",
4332
+ "type": {
4333
+ "text": "'start' | 'center' | 'end'"
4334
+ },
4335
+ "default": "'end'",
4336
+ "description": "Alignment of the menu panel relative to the side it opens on.",
4337
+ "attribute": "align"
4338
+ }
4339
+ ],
4340
+ "events": [
4341
+ {
4342
+ "description": "Fires with the new open state whenever the trigger opens or closes the menu.",
4343
+ "name": "open-change"
4344
+ },
4345
+ {
4346
+ "description": "Fires with the new open state once the panel's enter or exit animation has settled.",
4347
+ "name": "open-change-complete"
4348
+ },
4349
+ {
4350
+ "description": "Fires when Escape is pressed while the menu is open; `preventDefault()` keeps it open.",
4351
+ "name": "escape-key-down"
4352
+ },
4353
+ {
4354
+ "description": "Fires on a pointer-down outside the panel while open; `preventDefault()` keeps it open.",
4355
+ "name": "pointer-down-outside"
4356
+ },
4357
+ {
4358
+ "description": "Fires when focus moves outside the panel while open; `preventDefault()` keeps it open.",
4359
+ "name": "focus-outside"
4360
+ },
4361
+ {
4362
+ "description": "Fires for either kind of outside interaction, just before the specific event.",
4363
+ "name": "interact-outside"
4364
+ },
4365
+ {
4366
+ "description": "Fires before focus returns to the trigger on close; `preventDefault()` suppresses that return.",
4367
+ "name": "close-auto-focus"
4368
+ }
4369
+ ],
4370
+ "attributes": [
4371
+ {
4372
+ "name": "name",
4373
+ "type": {
4374
+ "text": "string"
4375
+ },
4376
+ "description": "The signed-in user's name, rendered in the trigger and repeated in the menu header.",
4377
+ "fieldName": "name",
4378
+ "required": true
4379
+ },
4380
+ {
4381
+ "name": "description",
4382
+ "type": {
4383
+ "text": "string | undefined | undefined"
4384
+ },
4385
+ "description": "Secondary text such as an email or role, rendered below the name in the trigger and the header.",
4386
+ "default": "undefined",
4387
+ "fieldName": "description"
4388
+ },
4389
+ {
4390
+ "name": "avatar-src",
4391
+ "type": {
4392
+ "text": "string | undefined | undefined"
4393
+ },
4394
+ "description": "Source of the identity image, passed straight through to the derived Avatar.",
4395
+ "default": "undefined",
4396
+ "fieldName": "avatarSrc"
4397
+ },
4398
+ {
4399
+ "name": "variant",
4400
+ "type": {
4401
+ "text": "'compact' | (string & {}) | undefined | undefined"
4402
+ },
4403
+ "description": "Visual rung written to `data-variant`; `'compact'` visually hides the identity text while keeping it as the accessible name.",
4404
+ "default": "undefined",
4405
+ "fieldName": "variant"
4406
+ },
4407
+ {
4408
+ "name": "open",
4409
+ "type": {
4410
+ "text": "boolean | undefined | undefined"
4411
+ },
4412
+ "description": "Whether the menu is open, for controlled usage paired with `open-change`.",
4413
+ "default": "undefined",
4414
+ "fieldName": "open"
4415
+ },
4416
+ {
4417
+ "name": "default-open",
4418
+ "type": {
4419
+ "text": "boolean"
4420
+ },
4421
+ "default": "false",
4422
+ "description": "Whether the menu starts open, for uncontrolled usage.",
4423
+ "fieldName": "defaultOpen"
4424
+ },
4425
+ {
4426
+ "name": "side",
4427
+ "type": {
4428
+ "text": "'top' | 'right' | 'bottom' | 'left'"
4429
+ },
4430
+ "default": "'bottom'",
4431
+ "description": "Which side of the trigger the menu panel opens on.",
4432
+ "fieldName": "side"
4433
+ },
4434
+ {
4435
+ "name": "align",
4436
+ "type": {
4437
+ "text": "'start' | 'center' | 'end'"
4438
+ },
4439
+ "default": "'end'",
4440
+ "description": "Alignment of the menu panel relative to the side it opens on.",
4441
+ "fieldName": "align"
4442
+ }
4443
+ ],
4444
+ "superclass": {
4445
+ "name": "LitElement",
4446
+ "package": "lit"
4447
+ },
4448
+ "tagName": "skdx-user-menu",
4449
+ "customElement": true
4450
+ }
4451
+ ],
4452
+ "exports": [
4453
+ {
4454
+ "kind": "js",
4455
+ "name": "SkdxUserMenu",
4456
+ "declaration": {
4457
+ "name": "SkdxUserMenu",
4458
+ "module": "src/user-menu/UserMenu.ts"
4459
+ }
4460
+ },
4461
+ {
4462
+ "kind": "custom-element-definition",
4463
+ "name": "skdx-user-menu",
4464
+ "declaration": {
4465
+ "name": "SkdxUserMenu",
4466
+ "module": "src/user-menu/UserMenu.ts"
4467
+ }
4468
+ }
4469
+ ]
4470
+ },
4471
+ {
4472
+ "kind": "javascript-module",
4473
+ "path": "src/user-menu/index.ts",
4474
+ "declarations": [],
4475
+ "exports": [
4476
+ {
4477
+ "kind": "js",
4478
+ "name": "SkdxUserMenu",
4479
+ "declaration": {
4480
+ "name": "SkdxUserMenu",
4481
+ "module": "./UserMenu"
4482
+ }
4483
+ }
4484
+ ]
4485
+ },
4486
+ {
4487
+ "kind": "javascript-module",
4488
+ "path": "src/verification-page/VerificationPage.ts",
4489
+ "declarations": [
4490
+ {
4491
+ "kind": "class",
4492
+ "description": "Verification block: a pin input for a one-time code, a submit button and a\nresend control whose cooldown the consumer owns.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-verification-page` on the host, then `__panel`, `__title`,\n`__description`, `__error`, `__form`, `__field`, `__code`, `__submit`,\n`__resend`, `__resend-hint` and `__footer`.",
4493
+ "name": "SkdxVerificationPage",
4316
4494
  "slots": [
4317
4495
  {
4318
4496
  "description": "Extra fields rendered inside the form, above the submit button.",
@@ -4371,7 +4549,7 @@
4371
4549
  "text": "string"
4372
4550
  },
4373
4551
  "default": "'Verification code'",
4374
- "description": "Field label and accessible name of the derived pin input holding the code.",
4552
+ "description": "Legend of the code fieldset and accessible name of the derived pin input holding the code.",
4375
4553
  "attribute": "code-label"
4376
4554
  },
4377
4555
  {
@@ -4502,7 +4680,7 @@
4502
4680
  "text": "string"
4503
4681
  },
4504
4682
  "default": "'Verification code'",
4505
- "description": "Field label and accessible name of the derived pin input holding the code.",
4683
+ "description": "Legend of the code fieldset and accessible name of the derived pin input holding the code.",
4506
4684
  "fieldName": "codeLabel"
4507
4685
  },
4508
4686
  {
@@ -4627,488 +4805,6 @@
4627
4805
  }
4628
4806
  ]
4629
4807
  },
4630
- {
4631
- "kind": "javascript-module",
4632
- "path": "src/user-menu/UserMenu.ts",
4633
- "declarations": [
4634
- {
4635
- "kind": "class",
4636
- "description": "The signed-in user's menu: a derived trigger showing an avatar, name and\ndescription that opens a panel repeating the identity above the\napplication's own entries.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-user-menu` on the host, then `__avatar`, `__identity`,\n`__name`, `__description`, `__content` and `__header`. `data-variant` sits on\nthe host while the derived trigger renders.",
4637
- "name": "SkdxUserMenu",
4638
- "slots": [
4639
- {
4640
- "description": "The application's own menu entries, rendered below the repeated identity header.",
4641
- "name": ""
4642
- },
4643
- {
4644
- "description": "Content that replaces the derived avatar-and-identity trigger entirely.",
4645
- "name": "trigger"
4646
- },
4647
- {
4648
- "description": "An extra indicator rendered after the identity in the trigger.",
4649
- "name": "status"
4650
- }
4651
- ],
4652
- "members": [
4653
- {
4654
- "kind": "field",
4655
- "name": "name",
4656
- "type": {
4657
- "text": "string"
4658
- },
4659
- "description": "The signed-in user's name, rendered in the trigger and repeated in the menu header.",
4660
- "attribute": "name",
4661
- "required": true
4662
- },
4663
- {
4664
- "kind": "field",
4665
- "name": "description",
4666
- "type": {
4667
- "text": "string | undefined | undefined"
4668
- },
4669
- "description": "Secondary text such as an email or role, rendered below the name in the trigger and the header.",
4670
- "default": "undefined",
4671
- "attribute": "description"
4672
- },
4673
- {
4674
- "kind": "field",
4675
- "name": "avatarSrc",
4676
- "type": {
4677
- "text": "string | undefined | undefined"
4678
- },
4679
- "description": "Source of the identity image, passed straight through to the derived Avatar.",
4680
- "default": "undefined",
4681
- "attribute": "avatar-src"
4682
- },
4683
- {
4684
- "kind": "field",
4685
- "name": "variant",
4686
- "type": {
4687
- "text": "'compact' | (string & {}) | undefined | undefined"
4688
- },
4689
- "description": "Visual rung written to `data-variant`; `'compact'` visually hides the identity text while keeping it as the accessible name.",
4690
- "default": "undefined",
4691
- "attribute": "variant"
4692
- },
4693
- {
4694
- "kind": "field",
4695
- "name": "open",
4696
- "type": {
4697
- "text": "boolean | undefined | undefined"
4698
- },
4699
- "description": "Whether the menu is open, for controlled usage paired with `open-change`.",
4700
- "default": "undefined",
4701
- "attribute": "open"
4702
- },
4703
- {
4704
- "kind": "field",
4705
- "name": "defaultOpen",
4706
- "type": {
4707
- "text": "boolean"
4708
- },
4709
- "default": "false",
4710
- "description": "Whether the menu starts open, for uncontrolled usage.",
4711
- "attribute": "default-open"
4712
- },
4713
- {
4714
- "kind": "field",
4715
- "name": "side",
4716
- "type": {
4717
- "text": "'top' | 'right' | 'bottom' | 'left'"
4718
- },
4719
- "default": "'bottom'",
4720
- "description": "Which side of the trigger the menu panel opens on.",
4721
- "attribute": "side"
4722
- },
4723
- {
4724
- "kind": "field",
4725
- "name": "align",
4726
- "type": {
4727
- "text": "'start' | 'center' | 'end'"
4728
- },
4729
- "default": "'end'",
4730
- "description": "Alignment of the menu panel relative to the side it opens on.",
4731
- "attribute": "align"
4732
- }
4733
- ],
4734
- "events": [
4735
- {
4736
- "description": "Fires with the new open state whenever the trigger opens or closes the menu.",
4737
- "name": "open-change"
4738
- },
4739
- {
4740
- "description": "Fires with the new open state once the panel's enter or exit animation has settled.",
4741
- "name": "open-change-complete"
4742
- },
4743
- {
4744
- "description": "Fires when Escape is pressed while the menu is open; `preventDefault()` keeps it open.",
4745
- "name": "escape-key-down"
4746
- },
4747
- {
4748
- "description": "Fires on a pointer-down outside the panel while open; `preventDefault()` keeps it open.",
4749
- "name": "pointer-down-outside"
4750
- },
4751
- {
4752
- "description": "Fires when focus moves outside the panel while open; `preventDefault()` keeps it open.",
4753
- "name": "focus-outside"
4754
- },
4755
- {
4756
- "description": "Fires for either kind of outside interaction, just before the specific event.",
4757
- "name": "interact-outside"
4758
- },
4759
- {
4760
- "description": "Fires before focus returns to the trigger on close; `preventDefault()` suppresses that return.",
4761
- "name": "close-auto-focus"
4762
- }
4763
- ],
4764
- "attributes": [
4765
- {
4766
- "name": "name",
4767
- "type": {
4768
- "text": "string"
4769
- },
4770
- "description": "The signed-in user's name, rendered in the trigger and repeated in the menu header.",
4771
- "fieldName": "name",
4772
- "required": true
4773
- },
4774
- {
4775
- "name": "description",
4776
- "type": {
4777
- "text": "string | undefined | undefined"
4778
- },
4779
- "description": "Secondary text such as an email or role, rendered below the name in the trigger and the header.",
4780
- "default": "undefined",
4781
- "fieldName": "description"
4782
- },
4783
- {
4784
- "name": "avatar-src",
4785
- "type": {
4786
- "text": "string | undefined | undefined"
4787
- },
4788
- "description": "Source of the identity image, passed straight through to the derived Avatar.",
4789
- "default": "undefined",
4790
- "fieldName": "avatarSrc"
4791
- },
4792
- {
4793
- "name": "variant",
4794
- "type": {
4795
- "text": "'compact' | (string & {}) | undefined | undefined"
4796
- },
4797
- "description": "Visual rung written to `data-variant`; `'compact'` visually hides the identity text while keeping it as the accessible name.",
4798
- "default": "undefined",
4799
- "fieldName": "variant"
4800
- },
4801
- {
4802
- "name": "open",
4803
- "type": {
4804
- "text": "boolean | undefined | undefined"
4805
- },
4806
- "description": "Whether the menu is open, for controlled usage paired with `open-change`.",
4807
- "default": "undefined",
4808
- "fieldName": "open"
4809
- },
4810
- {
4811
- "name": "default-open",
4812
- "type": {
4813
- "text": "boolean"
4814
- },
4815
- "default": "false",
4816
- "description": "Whether the menu starts open, for uncontrolled usage.",
4817
- "fieldName": "defaultOpen"
4818
- },
4819
- {
4820
- "name": "side",
4821
- "type": {
4822
- "text": "'top' | 'right' | 'bottom' | 'left'"
4823
- },
4824
- "default": "'bottom'",
4825
- "description": "Which side of the trigger the menu panel opens on.",
4826
- "fieldName": "side"
4827
- },
4828
- {
4829
- "name": "align",
4830
- "type": {
4831
- "text": "'start' | 'center' | 'end'"
4832
- },
4833
- "default": "'end'",
4834
- "description": "Alignment of the menu panel relative to the side it opens on.",
4835
- "fieldName": "align"
4836
- }
4837
- ],
4838
- "superclass": {
4839
- "name": "LitElement",
4840
- "package": "lit"
4841
- },
4842
- "tagName": "skdx-user-menu",
4843
- "customElement": true
4844
- }
4845
- ],
4846
- "exports": [
4847
- {
4848
- "kind": "js",
4849
- "name": "SkdxUserMenu",
4850
- "declaration": {
4851
- "name": "SkdxUserMenu",
4852
- "module": "src/user-menu/UserMenu.ts"
4853
- }
4854
- },
4855
- {
4856
- "kind": "custom-element-definition",
4857
- "name": "skdx-user-menu",
4858
- "declaration": {
4859
- "name": "SkdxUserMenu",
4860
- "module": "src/user-menu/UserMenu.ts"
4861
- }
4862
- }
4863
- ]
4864
- },
4865
- {
4866
- "kind": "javascript-module",
4867
- "path": "src/user-menu/index.ts",
4868
- "declarations": [],
4869
- "exports": [
4870
- {
4871
- "kind": "js",
4872
- "name": "SkdxUserMenu",
4873
- "declaration": {
4874
- "name": "SkdxUserMenu",
4875
- "module": "./UserMenu"
4876
- }
4877
- }
4878
- ]
4879
- },
4880
- {
4881
- "kind": "javascript-module",
4882
- "path": "src/stat-card/StatCard.ts",
4883
- "declarations": [
4884
- {
4885
- "kind": "class",
4886
- "description": "KPI tile block: a label, a value, an optional trend with sentiment colour,\na description, a derived progress bar and a visual region, all inside one\n`role=\"group\"` named by its own label.\n\nRenders light DOM, so its parts are classes rather than shadow `::part()`\ntargets: `.skdx-stat-card` on the host, then `__header`, `__icon`,\n`__label`, `__actions`, `__body`, `__value`, `__trend`, `__trend-icon`,\n`__description`, `__progress`, `__visual` and `__footer`. `data-trend`,\n`data-sentiment` and `data-state` sit on the host for the skin to read.",
4887
- "name": "SkdxStatCard",
4888
- "slots": [
4889
- {
4890
- "description": "The metric's current reading, already formatted by the consumer.",
4891
- "name": "value"
4892
- },
4893
- {
4894
- "description": "Decorative glyph rendered beside the label in the card header.",
4895
- "name": "icon"
4896
- },
4897
- {
4898
- "description": "Decorative glyph rendered beside the change text in the trend region.",
4899
- "name": "trend-icon"
4900
- },
4901
- {
4902
- "description": "A chart or sparkline region the card sizes for the consumer to draw into.",
4903
- "name": "visual"
4904
- },
4905
- {
4906
- "description": "Content rendered in a footer region below the card's other regions.",
4907
- "name": "footer"
4908
- },
4909
- {
4910
- "description": "Controls rendered at the end of the header, such as a menu button.",
4911
- "name": "actions"
4912
- }
4913
- ],
4914
- "members": [
4915
- {
4916
- "kind": "field",
4917
- "name": "label",
4918
- "type": {
4919
- "text": "string"
4920
- },
4921
- "description": "Name of the metric, rendered into the label that names the group through `aria-labelledby`.",
4922
- "attribute": "label",
4923
- "required": true
4924
- },
4925
- {
4926
- "kind": "field",
4927
- "name": "change",
4928
- "type": {
4929
- "text": "string | undefined | undefined"
4930
- },
4931
- "description": "Already-formatted delta text such as \"+12.4%\", rendered inside the trend region.",
4932
- "default": "undefined",
4933
- "attribute": "change"
4934
- },
4935
- {
4936
- "kind": "field",
4937
- "name": "trend",
4938
- "type": {
4939
- "text": "'up' | 'down' | 'neutral' | undefined | undefined"
4940
- },
4941
- "description": "Direction of the change only, written to `data-trend` on the host and the trend part.",
4942
- "default": "undefined",
4943
- "attribute": "trend"
4944
- },
4945
- {
4946
- "kind": "field",
4947
- "name": "sentiment",
4948
- "type": {
4949
- "text": "'positive' | 'negative' | 'neutral' | undefined | undefined"
4950
- },
4951
- "description": "Whether the change is good or bad, independent of `trend`, written to `data-sentiment`.",
4952
- "default": "undefined",
4953
- "attribute": "sentiment"
4954
- },
4955
- {
4956
- "kind": "field",
4957
- "name": "changeLabel",
4958
- "type": {
4959
- "text": "string | undefined | undefined"
4960
- },
4961
- "description": "Visually hidden text read before the change, such as \"Increased by\".",
4962
- "default": "undefined",
4963
- "attribute": "change-label"
4964
- },
4965
- {
4966
- "kind": "field",
4967
- "name": "description",
4968
- "type": {
4969
- "text": "string | undefined | undefined"
4970
- },
4971
- "description": "Supporting text rendered below the value, in the skin's muted tone.",
4972
- "default": "undefined",
4973
- "attribute": "description"
4974
- },
4975
- {
4976
- "kind": "field",
4977
- "name": "progress",
4978
- "type": {
4979
- "text": "number | undefined | undefined"
4980
- },
4981
- "description": "Percentage from 0 to 100, rendered into a derived Progress named by the label.",
4982
- "default": "undefined",
4983
- "attribute": "progress"
4984
- },
4985
- {
4986
- "kind": "field",
4987
- "name": "loading",
4988
- "type": {
4989
- "text": "boolean"
4990
- },
4991
- "default": "false",
4992
- "description": "Shows a skeleton in the value region and withholds the trend while true.",
4993
- "attribute": "loading"
4994
- }
4995
- ],
4996
- "attributes": [
4997
- {
4998
- "name": "label",
4999
- "type": {
5000
- "text": "string"
5001
- },
5002
- "description": "Name of the metric, rendered into the label that names the group through `aria-labelledby`.",
5003
- "fieldName": "label",
5004
- "required": true
5005
- },
5006
- {
5007
- "name": "change",
5008
- "type": {
5009
- "text": "string | undefined | undefined"
5010
- },
5011
- "description": "Already-formatted delta text such as \"+12.4%\", rendered inside the trend region.",
5012
- "default": "undefined",
5013
- "fieldName": "change"
5014
- },
5015
- {
5016
- "name": "trend",
5017
- "type": {
5018
- "text": "'up' | 'down' | 'neutral' | undefined | undefined"
5019
- },
5020
- "description": "Direction of the change only, written to `data-trend` on the host and the trend part.",
5021
- "default": "undefined",
5022
- "fieldName": "trend"
5023
- },
5024
- {
5025
- "name": "sentiment",
5026
- "type": {
5027
- "text": "'positive' | 'negative' | 'neutral' | undefined | undefined"
5028
- },
5029
- "description": "Whether the change is good or bad, independent of `trend`, written to `data-sentiment`.",
5030
- "default": "undefined",
5031
- "fieldName": "sentiment"
5032
- },
5033
- {
5034
- "name": "change-label",
5035
- "type": {
5036
- "text": "string | undefined | undefined"
5037
- },
5038
- "description": "Visually hidden text read before the change, such as \"Increased by\".",
5039
- "default": "undefined",
5040
- "fieldName": "changeLabel"
5041
- },
5042
- {
5043
- "name": "description",
5044
- "type": {
5045
- "text": "string | undefined | undefined"
5046
- },
5047
- "description": "Supporting text rendered below the value, in the skin's muted tone.",
5048
- "default": "undefined",
5049
- "fieldName": "description"
5050
- },
5051
- {
5052
- "name": "progress",
5053
- "type": {
5054
- "text": "number | undefined | undefined"
5055
- },
5056
- "description": "Percentage from 0 to 100, rendered into a derived Progress named by the label.",
5057
- "default": "undefined",
5058
- "fieldName": "progress"
5059
- },
5060
- {
5061
- "name": "loading",
5062
- "type": {
5063
- "text": "boolean"
5064
- },
5065
- "default": "false",
5066
- "description": "Shows a skeleton in the value region and withholds the trend while true.",
5067
- "fieldName": "loading"
5068
- }
5069
- ],
5070
- "superclass": {
5071
- "name": "LitElement",
5072
- "package": "lit"
5073
- },
5074
- "tagName": "skdx-stat-card",
5075
- "customElement": true
5076
- }
5077
- ],
5078
- "exports": [
5079
- {
5080
- "kind": "js",
5081
- "name": "SkdxStatCard",
5082
- "declaration": {
5083
- "name": "SkdxStatCard",
5084
- "module": "src/stat-card/StatCard.ts"
5085
- }
5086
- },
5087
- {
5088
- "kind": "custom-element-definition",
5089
- "name": "skdx-stat-card",
5090
- "declaration": {
5091
- "name": "SkdxStatCard",
5092
- "module": "src/stat-card/StatCard.ts"
5093
- }
5094
- }
5095
- ]
5096
- },
5097
- {
5098
- "kind": "javascript-module",
5099
- "path": "src/stat-card/index.ts",
5100
- "declarations": [],
5101
- "exports": [
5102
- {
5103
- "kind": "js",
5104
- "name": "SkdxStatCard",
5105
- "declaration": {
5106
- "name": "SkdxStatCard",
5107
- "module": "./StatCard"
5108
- }
5109
- }
5110
- ]
5111
- },
5112
4808
  {
5113
4809
  "kind": "javascript-module",
5114
4810
  "path": "src/workspace-switcher/WorkspaceSwitcher.ts",