asciidoctor-tabs 1.0.0.alpha.12 → 1.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 601c6ff5abe598efcbd05754237c29ee0d75412553ab59596a1f44f798f8e340
4
- data.tar.gz: 2dc954003e7c3d180c610d5faf0d5e1c29bb49e73434275a81305de55793a170
3
+ metadata.gz: 461e1d2d860df917423ed9dea49891739dd1129bda4aabb4bb9a9fc9bfbd09d8
4
+ data.tar.gz: 85189a9d92e881b4570f395357673b42d3bdd272fed80d2b1b718a3d67ff13a7
5
5
  SHA512:
6
- metadata.gz: 61ead4d57a662a73f3b754450127ff9ec16dc4ed40ae3a3997e0ce8562cdf3b501cba83bdc6f3c6d32d2dcc08c63900031010c1aeadad1b731f67c838848f8d0
7
- data.tar.gz: e2eed95c99e32fbcd9630126ab6b9b73f88181a07f874c4f1aaf8f0b013dde42b873059ac9926b25c7127e800f1c68deddd6a88690a5650631a43a61ade848ca
6
+ metadata.gz: 1d3cf0e88c3852b1660f133bff1253d674b0ffa2ed38d0e1e700cbb1e7d41449582c007df86d8f1af20539717d5bdcbff85f8f732b47255b0198eddaa87378bd
7
+ data.tar.gz: fe30e9640c17b3cdbd64f78ead25dc37735eaf5275c1a75f918b00d185caceb3499673aad700938ed117be83c7ffa6e30b4e5e84ae08f46b55df47d2571d72f1
data/CHANGELOG.adoc CHANGED
@@ -4,6 +4,21 @@
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-beta.1 (2023-01-30) - @mojavelinux
8
+
9
+ === Added
10
+
11
+ * Pass through role attribute on tabs block (#43)
12
+ * Add configuration option to save sync selection (i.e., sync ID) in local or session storage (#44)
13
+
14
+ === Fixed
15
+
16
+ * Use correct selector to unhide panel of first tab while tabs are loading
17
+
18
+ === Details
19
+
20
+ {url-repo}/releases/tag/v1.0.0-beta.1[git tag] | {url-repo}/compare/v1.0.0-alpha.12\...v1.0.0-beta.1[full diff]
21
+
7
22
  == 1.0.0-alpha.12 (2022-12-23) - @mojavelinux
8
23
 
9
24
  === Fixed
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.12, 2022-12-23
3
+ v1.0.0-beta.1, 2023-01-30
4
4
  :idprefix:
5
5
  :idseparator: -
6
6
  ifndef::env-github[:icons: font]
@@ -128,6 +128,10 @@ Tab B:: Contents of tab B in second tabset.
128
128
  Alternately, you can set the `sync` option on each tabs block.
129
129
  If you want to delist a tabs block from sync, set the `nosync` option on that block.
130
130
 
131
+ If you want to persist the sync selection, assign a value to the `data-sync-storage-key` attribute on the `<script>` tag.
132
+ By default, the sync selection will be assigned to the specified key in local storage.
133
+ You can set the `data-sync-storage-scope` attribute on the `<script>` tag to `session` to use session storage instead.
134
+
131
135
  == Usage
132
136
 
133
137
  === CLI
data/data/css/tabs.css CHANGED
@@ -67,7 +67,7 @@
67
67
  border-bottom: 0;
68
68
  }
69
69
 
70
- .tabs.is-loading .tabpanel:not(:first-child),
70
+ .tabs.is-loading .tabpanel + .tabpanel,
71
71
  .tabs:not(.is-loading) .tabpanel.is-hidden {
72
72
  display: none;
73
73
  }
data/data/js/tabs.js CHANGED
@@ -1,42 +1,45 @@
1
1
  ;(function () { /*! Asciidoctor Tabs | Copyright (c) 2018-present Dan Allen | MIT License */
2
2
  'use strict'
3
3
 
4
+ var config = (document.currentScript || {}).dataset || {}
4
5
  var forEach = Array.prototype.forEach
5
6
 
6
7
  init(document.querySelectorAll('.tabs'))
7
8
 
8
9
  function init (tabsBlocks) {
9
10
  if (!tabsBlocks.length) return
11
+ var preferredSyncId = 'syncStorageKey' in config
12
+ ? window[(config.syncStorageScope || 'local') + 'Storage'].getItem(config.syncStorageKey)
13
+ : undefined
10
14
  forEach.call(tabsBlocks, function (tabs) {
11
15
  var syncIds = tabs.classList.contains('is-sync') ? {} : undefined
12
16
  var tablist = tabs.querySelector('.tablist ul')
13
17
  tablist.setAttribute('role', 'tablist')
18
+ var first, selectedTab
14
19
  forEach.call(tablist.querySelectorAll('li'), function (tab, idx) {
15
20
  tab.setAttribute('role', (tab.className = 'tab')) // NOTE converter may not have set class on li
16
- var id, anchor
21
+ var id, anchor, syncId
17
22
  if (!(id = tab.id)) {
18
23
  if (!(anchor = tab.querySelector('a[id]'))) return // invalid state
19
24
  tab.id = id = anchor.parentNode.removeChild(anchor).id
20
25
  }
21
26
  var panel = tabs.querySelector('.tabpanel[aria-labelledby~="' + id + '"]')
22
27
  if (!panel) return // invalid state
28
+ if (!idx) first = { tab: tab, panel: panel }
23
29
  tab.tabIndex = -1
30
+ syncIds && !((syncId = tab.textContent.trim()) in syncIds) && (syncIds[(tab.dataset.syncId = syncId)] = true)
31
+ ? syncId === preferredSyncId ? toggleSelected((selectedTab = tab), true) : toggleHidden(panel, true)
32
+ : (syncId = toggleHidden(panel, true))
24
33
  tab.setAttribute('aria-controls', panel.id)
25
34
  panel.setAttribute('role', 'tabpanel')
26
- idx ? toggleHidden(panel, true) : toggleSelected(tab, true)
27
35
  forEach.call(panel.querySelectorAll('table.tableblock'), function (table) {
28
36
  var container = Object.assign(document.createElement('div'), { className: 'tablecontainer' })
29
37
  table.parentNode.insertBefore(container, table).appendChild(table)
30
38
  })
31
- var onClick = activateTab
32
- var instance = { tabs: tabs, tab: tab, panel: panel }
33
- var syncId
34
- if (syncIds && !((syncId = tab.textContent.trim()) in syncIds)) {
35
- syncIds[(tab.dataset.syncId = syncId)] = true
36
- onClick = activateTabSync
37
- }
38
- tab.addEventListener('click', onClick.bind(instance))
39
+ var onClick = syncId === undefined ? activateTab : activateTabSync
40
+ tab.addEventListener('click', onClick.bind({ tabs: tabs, tab: tab, panel: panel }))
39
41
  })
42
+ if (!selectedTab && first) toggleSelected(first.tab, true) || toggleHidden(first.panel, false)
40
43
  })
41
44
  onHashChange()
42
45
  forEach.call(tabsBlocks, function (tabs) {
@@ -55,6 +58,9 @@
55
58
  forEach.call(tabs.querySelectorAll('.tabpanel'), function (el) {
56
59
  toggleHidden(el, el !== panel)
57
60
  })
61
+ if (!this.isSync && 'syncStorageKey' in config && tab.dataset.syncId !== undefined) {
62
+ window[(config.syncStorageScope || 'local') + 'Storage'].setItem(config.syncStorageKey, tab.dataset.syncId)
63
+ }
58
64
  if (!e) return
59
65
  var loc = window.location
60
66
  var hashIdx = loc.hash ? loc.href.indexOf('#') : -1
@@ -68,7 +74,7 @@
68
74
  var thisTab = this.tab
69
75
  var initialY = tabs.getBoundingClientRect().y
70
76
  forEach.call(document.querySelectorAll('.tabs .tablist .tab'), function (tab) {
71
- if (tab !== thisTab && tab.dataset.syncId === thisTab.dataset.syncId) activateTab.call({ tab: tab })
77
+ if (tab !== thisTab && tab.dataset.syncId === thisTab.dataset.syncId) activateTab.call({ tab: tab, isSync: true })
72
78
  })
73
79
  var shiftedBy = tabs.getBoundingClientRect().y - initialY
74
80
  if (shiftedBy && (shiftedBy = Math.round(shiftedBy))) window.scrollBy({ top: shiftedBy, behavior: 'instant' })
@@ -79,7 +85,7 @@
79
85
  }
80
86
 
81
87
  function toggleSelected (el, state) {
82
- el.setAttribute('aria-selected', state)
88
+ el.setAttribute('aria-selected', '' + state)
83
89
  el.classList.toggle('is-selected', state)
84
90
  el.tabIndex = state ? 0 : -1
85
91
  }
@@ -89,6 +95,6 @@
89
95
  if (!id) return
90
96
  var tab = document.getElementById(~id.indexOf('%') ? decodeURIComponent(id) : id)
91
97
  if (!(tab && tab.classList.contains('tab'))) return
92
- tab.dataset.syncId ? activateTabSync.call({ tab: tab }) : activateTab.call({ tab: tab })
98
+ tab.dataset.syncId === undefined ? activateTab.call({ tab: tab }) : activateTabSync.call({ tab: tab })
93
99
  }
94
100
  })()
@@ -18,8 +18,9 @@ module Asciidoctor
18
18
  end
19
19
  tabs_number = doc.counter 'tabs-number'
20
20
  tabs_id = attrs['id'] || (generate_id %(tabs #{tabs_number}), doc)
21
- sync = !(block.option? 'nosync') && ((block.option? 'sync') || (doc.option? 'tabs-sync')) ? ' is-sync' : nil
22
- tabs = create_open_block parent, nil, { 'id' => tabs_id, 'role' => %(tabs#{sync || ''} is-loading) }
21
+ tabs_sync = !(block.option? 'nosync') && ((block.option? 'sync') || (doc.option? 'tabs-sync')) ? ' is-sync' : ''
22
+ tabs_role = (tabs_role = attrs['role']) ? %( #{tabs_role}) : ''
23
+ tabs = create_open_block parent, nil, { 'id' => tabs_id, 'role' => %(tabs#{tabs_sync}#{tabs_role} is-loading) }
23
24
  tabs.title = attrs['title']
24
25
  tablist = create_list parent, :ulist, { 'role' => 'tablist' }
25
26
  panes = {}
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module Tabs
5
- VERSION = '1.0.0.alpha.12'
5
+ VERSION = '1.0.0.beta.1'
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.12
4
+ version: 1.0.0.beta.1
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-12-23 00:00:00.000000000 Z
11
+ date: 2023-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor