asciidoctor-tabs 1.0.0.alpha.7 → 1.0.0.alpha.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53a90833ce2142600152bf87248d9470058d6e39495863c644ac7e7bcc8c8ef0
4
- data.tar.gz: fd0c9ab6d3e8a27c7bcb48489115b7c7a069a5aee6985626ffb91dc827830baa
3
+ metadata.gz: 35c07868db0fc9f06cc95b5af64d1228ede7894c8acdb63570c368acf8d179f8
4
+ data.tar.gz: 80e712a56c6e421a922e109ba7cdfcf4807f24aa2b1a8aac9e8d6b334f483986
5
5
  SHA512:
6
- metadata.gz: 7f187bad924fd98d618d23b452f5d06551392bb3c2acc25990793af0a2d0a55897a3d1557790df64a9658d9c4dc9a533b7da6e0ae4abb53e9993121a356c2e8e
7
- data.tar.gz: '039a9561293145c0717da9f98942d027ee18e89bdd23ab975deec004461e14ac85a1d4aa0540e52d28e9b531d495428f3c4bf74bf3f3c5ea118694ac703547d1'
6
+ metadata.gz: 3cda7d6fd762ae09f8376b344f3e1a2a28c32605cfc9c5afb51117f31868e5ea9e05f299e587937ad045d4bb2c0e24bc4dc4b3351a02cae840ebe3a7cca56b1b
7
+ data.tar.gz: 68e26c82a72335b2ff799d816f3e8562367b7d14e0de78794ac19b3bcc36a98b4dc51f9d6b9f06d82d5769d87cb132ada8b8a8fd31706434a001428b772367b8
data/CHANGELOG.adoc CHANGED
@@ -4,6 +4,18 @@
4
4
  This document provides a curated view of the changes to Asciidoctor Tabs per release.
5
5
  For a detailed view of what has changed, refer to the {url-repo}/commits/main[commit history] on GitHub.
6
6
 
7
+ == 1.0.0-alpha.8 (2022-11-30) - @mojavelinux
8
+
9
+ === Fixed
10
+
11
+ * Sync tab selection on hash change (#32)
12
+ * Lock position of content when synchronizing tab selection (#34)
13
+ * Remove bottom margin from last block in tab pane for the most common cases
14
+
15
+ === Details
16
+
17
+ {url-repo}/releases/tag/v1.0.0-alpha.8[git tag] | {url-repo}/compare/v1.0.0-alpha.7\...v1.0.0-alpha.8[full diff]
18
+
7
19
  == 1.0.0-alpha.7 (2022-11-28) - @mojavelinux
8
20
 
9
21
  === Added
data/README.adoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = Asciidoctor Tabs
2
2
  Dan Allen <https://github.com/mojavelinux[@mojavelinux]>
3
- v1.0.0-alpha.7, 2022-11-28
3
+ v1.0.0-alpha.8, 2022-11-30
4
4
  :idprefix:
5
5
  :idseparator: -
6
6
  ifndef::env-github[:icons: font]
@@ -100,6 +100,33 @@ Tab B:: Just text.
100
100
  ======
101
101
  ----
102
102
 
103
+ == Tabs Sync
104
+
105
+ If you want to synchronize the tab selection across tabsets, set the `tabs-sync-option` on the document.
106
+
107
+ .document-with-tabs-sync.adoc
108
+ [,asciidoc]
109
+ ----
110
+ :tabs-sync-option:
111
+
112
+ [tabs]
113
+ ====
114
+ Tab A:: Contents of tab A in first tabset.
115
+ Tab B:: Contents of tab B in first tabset.
116
+ ====
117
+
118
+ ...
119
+
120
+ [tabs]
121
+ ====
122
+ Tab A:: Contents of tab A in second tabset.
123
+ Tab B:: Contents of tab B in second tabset.
124
+ ====
125
+ ----
126
+
127
+ Alternately, you can set the `sync` option on each tabs block.
128
+ If you want to delist a tabs block from sync, set the `nosync` option on that block.
129
+
103
130
  == Usage
104
131
 
105
132
  === CLI
data/data/css/tabs.css CHANGED
@@ -65,6 +65,8 @@
65
65
  margin-top: 0;
66
66
  }
67
67
 
68
- .tab-pane > :last-child > :last-child {
68
+ #content .tab-pane > :last-child,
69
+ #content .tab-pane > :last-child > :last-child,
70
+ #content .tab-pane > :last-child > :last-child > li:last-child > :last-child {
69
71
  margin-bottom: 0;
70
72
  }
data/data/js/tabs.js CHANGED
@@ -7,11 +7,8 @@
7
7
 
8
8
  function init (tabsets) {
9
9
  if (!tabsets.length) return
10
- var fragment = getFragment()
11
10
  forEach.call(tabsets, function (tabset) {
12
11
  var tabs = tabset.querySelectorAll('.tabs li')
13
- if (!tabs.length) return tabset.classList.remove('is-loading')
14
- var active, first, syncId
15
12
  var syncIds = tabset.classList.contains('is-sync') ? {} : undefined
16
13
  forEach.call(tabs, function (tab, idx) {
17
14
  var id = tab.id
@@ -20,26 +17,22 @@
20
17
  if (!anchor) return // invalid state
21
18
  tab.id = id = anchor.parentNode.removeChild(anchor).id
22
19
  }
23
- tab.className = 'tab'
20
+ tab.className = idx ? 'tab' : 'tab is-active'
24
21
  var pane = tabset.querySelector('.tab-pane[aria-labelledby~="' + id + '"]')
25
22
  if (!pane) return // invalid state
23
+ if (!idx) pane.classList.add('is-active')
24
+ var onClick = activateTab
26
25
  var instance = { tabset: tabset, tab: tab, pane: pane }
27
- if (!idx) first = instance
28
- if (!active && fragment === id && (active = true)) {
29
- tab.classList.add('is-active')
30
- pane.classList.add('is-active')
31
- }
26
+ var syncId
32
27
  if (syncIds && !((syncId = tab.textContent.trim()) in syncIds)) {
33
28
  syncIds[(tab.dataset.syncId = syncId)] = true
34
- tab.addEventListener('click', activateTabSync.bind(instance))
35
- } else {
36
- tab.addEventListener('click', activateTab.bind(instance))
29
+ onClick = activateTabSync
37
30
  }
31
+ tab.addEventListener('click', onClick.bind(instance))
38
32
  })
39
- if (!active && first) {
40
- first.tab.classList.add('is-active')
41
- first.pane.classList.add('is-active')
42
- }
33
+ })
34
+ onHashChange()
35
+ forEach.call(tabsets, function (tabset) {
43
36
  tabset.classList.remove('is-loading')
44
37
  })
45
38
  window.addEventListener('hashchange', onHashChange)
@@ -47,7 +40,7 @@
47
40
 
48
41
  function activateTab (e) {
49
42
  var tab = this.tab
50
- var tabset = this.tabset || tab.closest('.tabset')
43
+ var tabset = this.tabset || (this.tabset = tab.closest('.tabset'))
51
44
  var pane = this.pane || tabset.querySelector('.tab-pane[aria-labelledby~="' + tab.id + '"]')
52
45
  forEach.call(tabset.querySelectorAll('.tabs li, .tab-pane'), function (el) {
53
46
  el === tab || el === pane ? el.classList.add('is-active') : el.classList.remove('is-active')
@@ -61,20 +54,21 @@
61
54
 
62
55
  function activateTabSync (e) {
63
56
  activateTab.call(this, e)
57
+ var tabset = this.tabset
64
58
  var thisTab = this.tab
59
+ var initialY = tabset.getBoundingClientRect().y
65
60
  forEach.call(document.querySelectorAll('.tabs li'), function (tab) {
66
61
  if (tab !== thisTab && tab.dataset.syncId === thisTab.dataset.syncId) activateTab.call({ tab: tab })
67
62
  })
68
- }
69
-
70
- function getFragment (hash) {
71
- return (hash = window.location.hash) && (~hash.indexOf('%') ? decodeURIComponent(hash.slice(1)) : hash.slice(1))
63
+ var shiftedBy = tabset.getBoundingClientRect().y - initialY
64
+ if (shiftedBy && (shiftedBy = Math.round(shiftedBy))) window.scrollBy({ top: shiftedBy, behavior: 'instant' })
72
65
  }
73
66
 
74
67
  function onHashChange () {
75
- var id = getFragment()
68
+ var id = window.location.hash.slice(1)
76
69
  if (!id) return
77
- var tab = document.getElementById(id)
78
- if (tab && tab.classList.contains('tab')) activateTab.call({ tab: tab })
70
+ var tab = document.getElementById(~id.indexOf('%') ? decodeURIComponent(id) : id)
71
+ if (!(tab && tab.classList.contains('tab'))) return
72
+ tab.dataset.syncId ? activateTabSync.call({ tab: tab }) : activateTab.call({ tab: tab })
79
73
  }
80
74
  })()
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module Tabs
5
- VERSION = '1.0.0.alpha.7'
5
+ VERSION = '1.0.0.alpha.8'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-tabs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.7
4
+ version: 1.0.0.alpha.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Allen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-28 00:00:00.000000000 Z
11
+ date: 2022-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor