scb-wc-test 0.1.133 → 0.1.134

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.
@@ -110,6 +110,12 @@ namespace ScbBlazorDemo
110
110
  // Alla länkar (scb-link) på sidan
111
111
  protected LinkState[] Links { get; private set; } = Array.Empty<LinkState>();
112
112
 
113
+
114
+ // Alla nav (scb-nav) på sidan
115
+ protected NavState[] Navs { get; private set; } = Array.Empty<NavState>();
116
+
117
+ // Uppslag med alla nav (scb-nav) nycklade på id-attributet
118
+ protected Dictionary<string, NavState> NavsById { get; private set; } = new Dictionary<string, NavState>(StringComparer.Ordinal);
113
119
  // Alla innehållsförteckningar (scb-toc) på sidan
114
120
  protected TocState[] Tocs { get; private set; } = Array.Empty<TocState>();
115
121
 
@@ -781,6 +787,86 @@ namespace ScbBlazorDemo
781
787
  Links = Array.Empty<LinkState>();
782
788
  }
783
789
 
790
+ // Nav
791
+ if (state.Navs is not null && state.Navs.Length > 0)
792
+ {
793
+ var navs = new NavState[state.Navs.Length];
794
+ for (var i = 0; i < state.Navs.Length; i++)
795
+ {
796
+ var dto = state.Navs[i];
797
+ navs[i] = new NavState
798
+ {
799
+ Id = dto.Id ?? string.Empty,
800
+ Label = dto.Label ?? string.Empty,
801
+ ActiveHref = dto.ActiveHref ?? string.Empty,
802
+ ActivateOnClick = dto.ActivateOnClick,
803
+ Sticky = dto.Sticky,
804
+ StickyTop = dto.StickyTop ?? string.Empty,
805
+ StickyZIndex = dto.StickyZIndex,
806
+ StickyBackground = dto.StickyBackground ?? string.Empty
807
+ };
808
+ }
809
+
810
+ Navs = navs;
811
+ }
812
+ else
813
+ {
814
+ Navs = Array.Empty<NavState>();
815
+ }
816
+
817
+ // Uppslag med alla nav nycklade på id
818
+ if (state.NavsById is not null && state.NavsById.Count > 0)
819
+ {
820
+ var byId = new Dictionary<string, NavState>(state.NavsById.Count, StringComparer.Ordinal);
821
+ foreach (var kvp in state.NavsById)
822
+ {
823
+ var id = kvp.Key;
824
+ var dto = kvp.Value;
825
+
826
+ if (string.IsNullOrWhiteSpace(id) || dto is null)
827
+ {
828
+ continue;
829
+ }
830
+
831
+ byId[id] = new NavState
832
+ {
833
+ Id = id,
834
+ Label = dto.Label ?? string.Empty,
835
+ ActiveHref = dto.ActiveHref ?? string.Empty,
836
+ ActivateOnClick = dto.ActivateOnClick,
837
+ Sticky = dto.Sticky,
838
+ StickyTop = dto.StickyTop ?? string.Empty,
839
+ StickyZIndex = dto.StickyZIndex,
840
+ StickyBackground = dto.StickyBackground ?? string.Empty
841
+ };
842
+ }
843
+
844
+ NavsById = byId;
845
+ }
846
+ else if (Navs.Length > 0)
847
+ {
848
+ var byId = new Dictionary<string, NavState>(Navs.Length, StringComparer.Ordinal);
849
+ for (var i = 0; i < Navs.Length; i++)
850
+ {
851
+ var nav = Navs[i];
852
+ var id = nav.Id;
853
+
854
+ if (string.IsNullOrWhiteSpace(id))
855
+ {
856
+ continue;
857
+ }
858
+
859
+ byId[id] = nav;
860
+ }
861
+
862
+ NavsById = byId;
863
+ }
864
+ else
865
+ {
866
+ NavsById = new Dictionary<string, NavState>(StringComparer.Ordinal);
867
+ }
868
+
869
+
784
870
  // TOC
785
871
  if (state.Tocs is not null && state.Tocs.Length > 0)
786
872
  {
@@ -1260,6 +1346,12 @@ namespace ScbBlazorDemo
1260
1346
  return JS.InvokeVoidAsync("SCBBlazor.setSearchValueById", id ?? string.Empty, value ?? string.Empty).AsTask();
1261
1347
  }
1262
1348
 
1349
+
1350
+ protected Task SetNavActiveHrefByIdAsync(string id, string activeHref)
1351
+ {
1352
+ return JS.InvokeVoidAsync("SCBBlazor.setNavActiveHrefById", id ?? string.Empty, activeHref ?? string.Empty).AsTask();
1353
+ }
1354
+
1263
1355
  // TOC: index-baserad och id-baserad variant för items
1264
1356
  protected Task SetTocItemExpandedAsync(int tocIndex, int itemIndex, bool expanded)
1265
1357
  {
@@ -1555,6 +1647,19 @@ namespace ScbBlazorDemo
1555
1647
  public string Text { get; set; } = string.Empty;
1556
1648
  }
1557
1649
 
1650
+ protected sealed class NavState
1651
+ {
1652
+ public string Id { get; set; } = string.Empty;
1653
+ public string Label { get; set; } = string.Empty;
1654
+ public string ActiveHref { get; set; } = string.Empty;
1655
+ public bool ActivateOnClick { get; set; }
1656
+ public bool Sticky { get; set; }
1657
+ public string StickyTop { get; set; } = string.Empty;
1658
+ public int StickyZIndex { get; set; }
1659
+ public string StickyBackground { get; set; } = string.Empty;
1660
+ }
1661
+
1662
+
1558
1663
  protected sealed class TocState
1559
1664
  {
1560
1665
  public bool Detached { get; set; }
@@ -1661,6 +1766,10 @@ namespace ScbBlazorDemo
1661
1766
 
1662
1767
  public LinkDto[] Links { get; set; } = Array.Empty<LinkDto>();
1663
1768
 
1769
+
1770
+ public NavDto[] Navs { get; set; } = Array.Empty<NavDto>();
1771
+
1772
+ public Dictionary<string, NavDto> NavsById { get; set; } = new();
1664
1773
  public TocDto[] Tocs { get; set; } = Array.Empty<TocDto>();
1665
1774
 
1666
1775
  public ScrollspyDto Scrollspy { get; set; } = new();
@@ -1949,6 +2058,19 @@ namespace ScbBlazorDemo
1949
2058
  public string? ContentPadding { get; set; }
1950
2059
  }
1951
2060
 
2061
+ private sealed class NavDto
2062
+ {
2063
+ public string? Id { get; set; }
2064
+ public string? Label { get; set; }
2065
+ public string? ActiveHref { get; set; }
2066
+ public bool ActivateOnClick { get; set; }
2067
+ public bool Sticky { get; set; }
2068
+ public string? StickyTop { get; set; }
2069
+ public int StickyZIndex { get; set; }
2070
+ public string? StickyBackground { get; set; }
2071
+ }
2072
+
2073
+
1952
2074
  private sealed class TocDto
1953
2075
  {
1954
2076
  public bool Detached { get; set; }
@@ -92,6 +92,16 @@
92
92
  else el.setAttribute('active-id', String(id));
93
93
  }
94
94
 
95
+ function mirrorNavSelect(el, ev) {
96
+ const href = (ev && ev.detail && ev.detail.href) ?? '';
97
+ try {
98
+ el.activeHref = href;
99
+ } catch (_) {}
100
+ if (!href) el.removeAttribute('active-href');
101
+ else el.setAttribute('active-href', String(href));
102
+ }
103
+
104
+
95
105
  /* Regler som beskriver hur komponenternas egna events ska översättas
96
106
  till enklare, Blazor-vänliga events (och ibland speglas till properties). */
97
107
  const RULES = [
@@ -676,6 +686,16 @@
676
686
  to: 'stepchange',
677
687
  },
678
688
 
689
+
690
+
691
+ // scb-nav
692
+ {
693
+ sel: 'scb-nav',
694
+ from: 'scb-nav-select',
695
+ to: 'navselect',
696
+ mirror: mirrorNavSelect,
697
+ },
698
+
679
699
  // scb-scrollspy
680
700
  {
681
701
  sel: 'scb-scrollspy',
@@ -1085,6 +1105,7 @@ window.SCBBlazor.getState = function () {
1085
1105
  const tooltips = document.querySelectorAll('scb-tooltip');
1086
1106
  const textfields = document.querySelectorAll('scb-textfield');
1087
1107
  const searches = document.querySelectorAll('scb-search');
1108
+ const navs = document.querySelectorAll('scb-nav');
1088
1109
  const scrollspies = document.querySelectorAll('scb-scrollspy');
1089
1110
  const tocs = document.querySelectorAll('scb-toc');
1090
1111
  const vizs = document.querySelectorAll('scb-viz');
@@ -1661,6 +1682,72 @@ window.SCBBlazor.getState = function () {
1661
1682
  });
1662
1683
 
1663
1684
  // Alla scb-toc på sidan med sina scb-toc-item
1685
+
1686
+
1687
+ const navsState = Array.from(navs).map((nav) => {
1688
+ const anyNav = nav;
1689
+
1690
+ const id = (nav.getAttribute('id') || '').toString();
1691
+
1692
+ const label = (
1693
+ anyNav.label ??
1694
+ nav.getAttribute('label') ??
1695
+ ''
1696
+ ).toString();
1697
+
1698
+ const activeHref = (
1699
+ anyNav.activeHref ??
1700
+ nav.getAttribute('active-href') ??
1701
+ ''
1702
+ ).toString();
1703
+
1704
+ const activateOnClick =
1705
+ typeof anyNav.activateOnClick === 'boolean'
1706
+ ? anyNav.activateOnClick
1707
+ : nav.hasAttribute('activate-on-click');
1708
+
1709
+ const sticky =
1710
+ typeof anyNav.sticky === 'boolean'
1711
+ ? anyNav.sticky
1712
+ : nav.hasAttribute('sticky');
1713
+
1714
+ const stickyTop = (
1715
+ anyNav.stickyTop ??
1716
+ nav.getAttribute('sticky-top') ??
1717
+ '0px'
1718
+ ).toString();
1719
+
1720
+ let stickyZIndex = 0;
1721
+ if (typeof anyNav.stickyZIndex === 'number') {
1722
+ stickyZIndex = anyNav.stickyZIndex;
1723
+ } else {
1724
+ const v = parseInt(nav.getAttribute('sticky-z-index') || '0', 10);
1725
+ stickyZIndex = Number.isFinite(v) ? v : 0;
1726
+ }
1727
+
1728
+ const stickyBackground = (
1729
+ anyNav.stickyBackground ??
1730
+ nav.getAttribute('sticky-background') ??
1731
+ ''
1732
+ ).toString();
1733
+
1734
+ return {
1735
+ id,
1736
+ label,
1737
+ activeHref,
1738
+ activateOnClick: !!activateOnClick,
1739
+ sticky: !!sticky,
1740
+ stickyTop,
1741
+ stickyZIndex,
1742
+ stickyBackground,
1743
+ };
1744
+ });
1745
+
1746
+ const navsById = {};
1747
+ for (const n of navsState) {
1748
+ if (!n || !n.id) continue;
1749
+ navsById[n.id] = n;
1750
+ }
1664
1751
  const tocsState = Array.from(tocs).map((toc) => {
1665
1752
  const items = toc.querySelectorAll('scb-toc-item');
1666
1753
  return {
@@ -2127,6 +2214,8 @@ const subMenusState = Array.from(subMenus).map((sm) => {
2127
2214
  stepper: stepperState,
2128
2215
  textfields: textfieldsState,
2129
2216
  searches: searchesState,
2217
+ navs: navsState,
2218
+ navsById: navsById,
2130
2219
  tocs: tocsState,
2131
2220
  scrollspy: scrollspyState,
2132
2221
  scrollspies: scrollspiesState,
@@ -2148,6 +2237,8 @@ window.SCBBlazor.registerScbEventHandlers = function (dotNetRef) {
2148
2237
  'tabchange',
2149
2238
  'draweropen',
2150
2239
  'search',
2240
+ 'navselect',
2241
+ 'activehrefchange',
2151
2242
  'openchange',
2152
2243
  'checkedchange',
2153
2244
  'selectedchange',
@@ -2939,6 +3030,21 @@ window.SCBBlazor.registerScbEventHandlers = function (dotNetRef) {
2939
3030
  dispatchChange(s, 'valuechange', { value: v });
2940
3031
  };
2941
3032
 
3033
+ // Nav
3034
+
3035
+ api.setNavActiveHrefById = function (id, activeHref) {
3036
+ const nav = getById(id, 'scb-nav');
3037
+ if (!nav) return;
3038
+ const v = activeHref == null ? '' : String(activeHref);
3039
+ const anyNav = nav;
3040
+ try {
3041
+ anyNav.activeHref = v;
3042
+ } catch (_) {}
3043
+ if (v) nav.setAttribute('active-href', v);
3044
+ else nav.removeAttribute('active-href');
3045
+ dispatchChange(nav, 'activehrefchange', { activeHref: v });
3046
+ };
3047
+
2942
3048
  // TOC
2943
3049
 
2944
3050
  api.setTocItemExpanded = function (tocIndex, itemIndex, expanded) {
@@ -8,7 +8,8 @@ import{a as p,n as d,i as v,x as h,t as f}from"../../vendor/vendor.js";import"..
8
8
  :host {
9
9
  display: block;
10
10
  color: var(--md-sys-color-on-surface);
11
- }
11
+ font-family: var(--brand-font, Inter);
12
+ }
12
13
 
13
14
  :host([sticky]) {
14
15
  position: sticky;
@@ -92,6 +92,16 @@
92
92
  else el.setAttribute('active-id', String(id));
93
93
  }
94
94
 
95
+ function mirrorNavSelect(el, ev) {
96
+ const href = (ev && ev.detail && ev.detail.href) ?? '';
97
+ try {
98
+ el.activeHref = href;
99
+ } catch (_) {}
100
+ if (!href) el.removeAttribute('active-href');
101
+ else el.setAttribute('active-href', String(href));
102
+ }
103
+
104
+
95
105
  /* Regler som beskriver hur komponenternas egna events ska översättas
96
106
  till enklare, Blazor-vänliga events (och ibland speglas till properties). */
97
107
  const RULES = [
@@ -676,6 +686,16 @@
676
686
  to: 'stepchange',
677
687
  },
678
688
 
689
+
690
+
691
+ // scb-nav
692
+ {
693
+ sel: 'scb-nav',
694
+ from: 'scb-nav-select',
695
+ to: 'navselect',
696
+ mirror: mirrorNavSelect,
697
+ },
698
+
679
699
  // scb-scrollspy
680
700
  {
681
701
  sel: 'scb-scrollspy',
@@ -1085,6 +1105,7 @@ window.SCBBlazor.getState = function () {
1085
1105
  const tooltips = document.querySelectorAll('scb-tooltip');
1086
1106
  const textfields = document.querySelectorAll('scb-textfield');
1087
1107
  const searches = document.querySelectorAll('scb-search');
1108
+ const navs = document.querySelectorAll('scb-nav');
1088
1109
  const scrollspies = document.querySelectorAll('scb-scrollspy');
1089
1110
  const tocs = document.querySelectorAll('scb-toc');
1090
1111
  const vizs = document.querySelectorAll('scb-viz');
@@ -1661,6 +1682,72 @@ window.SCBBlazor.getState = function () {
1661
1682
  });
1662
1683
 
1663
1684
  // Alla scb-toc på sidan med sina scb-toc-item
1685
+
1686
+
1687
+ const navsState = Array.from(navs).map((nav) => {
1688
+ const anyNav = nav;
1689
+
1690
+ const id = (nav.getAttribute('id') || '').toString();
1691
+
1692
+ const label = (
1693
+ anyNav.label ??
1694
+ nav.getAttribute('label') ??
1695
+ ''
1696
+ ).toString();
1697
+
1698
+ const activeHref = (
1699
+ anyNav.activeHref ??
1700
+ nav.getAttribute('active-href') ??
1701
+ ''
1702
+ ).toString();
1703
+
1704
+ const activateOnClick =
1705
+ typeof anyNav.activateOnClick === 'boolean'
1706
+ ? anyNav.activateOnClick
1707
+ : nav.hasAttribute('activate-on-click');
1708
+
1709
+ const sticky =
1710
+ typeof anyNav.sticky === 'boolean'
1711
+ ? anyNav.sticky
1712
+ : nav.hasAttribute('sticky');
1713
+
1714
+ const stickyTop = (
1715
+ anyNav.stickyTop ??
1716
+ nav.getAttribute('sticky-top') ??
1717
+ '0px'
1718
+ ).toString();
1719
+
1720
+ let stickyZIndex = 0;
1721
+ if (typeof anyNav.stickyZIndex === 'number') {
1722
+ stickyZIndex = anyNav.stickyZIndex;
1723
+ } else {
1724
+ const v = parseInt(nav.getAttribute('sticky-z-index') || '0', 10);
1725
+ stickyZIndex = Number.isFinite(v) ? v : 0;
1726
+ }
1727
+
1728
+ const stickyBackground = (
1729
+ anyNav.stickyBackground ??
1730
+ nav.getAttribute('sticky-background') ??
1731
+ ''
1732
+ ).toString();
1733
+
1734
+ return {
1735
+ id,
1736
+ label,
1737
+ activeHref,
1738
+ activateOnClick: !!activateOnClick,
1739
+ sticky: !!sticky,
1740
+ stickyTop,
1741
+ stickyZIndex,
1742
+ stickyBackground,
1743
+ };
1744
+ });
1745
+
1746
+ const navsById = {};
1747
+ for (const n of navsState) {
1748
+ if (!n || !n.id) continue;
1749
+ navsById[n.id] = n;
1750
+ }
1664
1751
  const tocsState = Array.from(tocs).map((toc) => {
1665
1752
  const items = toc.querySelectorAll('scb-toc-item');
1666
1753
  return {
@@ -2127,6 +2214,8 @@ const subMenusState = Array.from(subMenus).map((sm) => {
2127
2214
  stepper: stepperState,
2128
2215
  textfields: textfieldsState,
2129
2216
  searches: searchesState,
2217
+ navs: navsState,
2218
+ navsById: navsById,
2130
2219
  tocs: tocsState,
2131
2220
  scrollspy: scrollspyState,
2132
2221
  scrollspies: scrollspiesState,
@@ -2148,6 +2237,8 @@ window.SCBBlazor.registerScbEventHandlers = function (dotNetRef) {
2148
2237
  'tabchange',
2149
2238
  'draweropen',
2150
2239
  'search',
2240
+ 'navselect',
2241
+ 'activehrefchange',
2151
2242
  'openchange',
2152
2243
  'checkedchange',
2153
2244
  'selectedchange',
@@ -2939,6 +3030,21 @@ window.SCBBlazor.registerScbEventHandlers = function (dotNetRef) {
2939
3030
  dispatchChange(s, 'valuechange', { value: v });
2940
3031
  };
2941
3032
 
3033
+ // Nav
3034
+
3035
+ api.setNavActiveHrefById = function (id, activeHref) {
3036
+ const nav = getById(id, 'scb-nav');
3037
+ if (!nav) return;
3038
+ const v = activeHref == null ? '' : String(activeHref);
3039
+ const anyNav = nav;
3040
+ try {
3041
+ anyNav.activeHref = v;
3042
+ } catch (_) {}
3043
+ if (v) nav.setAttribute('active-href', v);
3044
+ else nav.removeAttribute('active-href');
3045
+ dispatchChange(nav, 'activehrefchange', { activeHref: v });
3046
+ };
3047
+
2942
3048
  // TOC
2943
3049
 
2944
3050
  api.setTocItemExpanded = function (tocIndex, itemIndex, expanded) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scb-wc-test",
3
- "version": "0.1.133",
3
+ "version": "0.1.134",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
@@ -365,5 +365,5 @@
365
365
  },
366
366
  "./mvc/*": "./mvc/*"
367
367
  },
368
- "buildHash": "92B641C59C710183D9C3078FB60FEF5EFD5F8AD1FA4001E7B2F5628816C6A691"
368
+ "buildHash": "C49883F02635182880136D4B4A65C8E5759CB17C1964B8EFE298DC730881E459"
369
369
  }
@@ -114,7 +114,8 @@ a.styles = y`
114
114
  :host {
115
115
  display: block;
116
116
  color: var(--md-sys-color-on-surface);
117
- }
117
+ font-family: var(--brand-font, Inter);
118
+ }
118
119
 
119
120
  :host([sticky]) {
120
121
  position: sticky;
@@ -7188,7 +7188,8 @@ ${this.value}</textarea
7188
7188
  :host {
7189
7189
  display: block;
7190
7190
  color: var(--md-sys-color-on-surface);
7191
- }
7191
+ font-family: var(--brand-font, Inter);
7192
+ }
7192
7193
 
7193
7194
  :host([sticky]) {
7194
7195
  position: sticky;