asciidoctor-tabs 1.0.0.alpha.11 → 1.0.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +25 -0
- data/README.adoc +5 -1
- data/data/css/tabs.css +14 -7
- data/data/js/tabs.js +23 -13
- data/lib/asciidoctor/tabs/block.rb +3 -2
- data/lib/asciidoctor/tabs/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 461e1d2d860df917423ed9dea49891739dd1129bda4aabb4bb9a9fc9bfbd09d8
|
4
|
+
data.tar.gz: 85189a9d92e881b4570f395357673b42d3bdd272fed80d2b1b718a3d67ff13a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d3cf0e88c3852b1660f133bff1253d674b0ffa2ed38d0e1e700cbb1e7d41449582c007df86d8f1af20539717d5bdcbff85f8f732b47255b0198eddaa87378bd
|
7
|
+
data.tar.gz: fe30e9640c17b3cdbd64f78ead25dc37735eaf5275c1a75f918b00d185caceb3499673aad700938ed117be83c7ffa6e30b4e5e84ae08f46b55df47d2571d72f1
|
data/CHANGELOG.adoc
CHANGED
@@ -4,6 +4,31 @@
|
|
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
|
+
|
22
|
+
== 1.0.0-alpha.12 (2022-12-23) - @mojavelinux
|
23
|
+
|
24
|
+
=== Fixed
|
25
|
+
|
26
|
+
* Wrap div with class `tablecontainer` around tables inside tabpanel to prevent tables from overflowing bounds while honoring width (#41)
|
27
|
+
|
28
|
+
=== Details
|
29
|
+
|
30
|
+
{url-repo}/releases/tag/v1.0.0-alpha.12[git tag] | {url-repo}/compare/v1.0.0-alpha.11\...v1.0.0-alpha.12[full diff]
|
31
|
+
|
7
32
|
== 1.0.0-alpha.11 (2022-12-08) - @mojavelinux
|
8
33
|
|
9
34
|
=== Changed
|
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-
|
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
@@ -58,12 +58,6 @@
|
|
58
58
|
padding: 1.25em;
|
59
59
|
}
|
60
60
|
|
61
|
-
.tabpanel > table.tableblock {
|
62
|
-
border-width: 0;
|
63
|
-
display: block;
|
64
|
-
overflow-x: auto;
|
65
|
-
}
|
66
|
-
|
67
61
|
.tablist > ul li,
|
68
62
|
.tabpanel {
|
69
63
|
border: 1px solid #dcdcdc;
|
@@ -73,7 +67,7 @@
|
|
73
67
|
border-bottom: 0;
|
74
68
|
}
|
75
69
|
|
76
|
-
.tabs.is-loading .tabpanel
|
70
|
+
.tabs.is-loading .tabpanel + .tabpanel,
|
77
71
|
.tabs:not(.is-loading) .tabpanel.is-hidden {
|
78
72
|
display: none;
|
79
73
|
}
|
@@ -82,8 +76,21 @@
|
|
82
76
|
margin-top: 0;
|
83
77
|
}
|
84
78
|
|
79
|
+
/* #content is a signature of the Asciidoctor standalone HTML output */
|
85
80
|
#content .tabpanel > :last-child,
|
86
81
|
#content .tabpanel > :last-child > :last-child,
|
87
82
|
#content .tabpanel > :last-child > :last-child > li:last-child > :last-child {
|
88
83
|
margin-bottom: 0;
|
89
84
|
}
|
85
|
+
|
86
|
+
.tablecontainer {
|
87
|
+
overflow-x: auto;
|
88
|
+
}
|
89
|
+
|
90
|
+
#content .tablecontainer {
|
91
|
+
margin-bottom: 1.25em;
|
92
|
+
}
|
93
|
+
|
94
|
+
#content .tablecontainer > table.tableblock {
|
95
|
+
margin-bottom: 0;
|
96
|
+
}
|
data/data/js/tabs.js
CHANGED
@@ -1,38 +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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
onClick = activateTabSync
|
33
|
-
}
|
34
|
-
tab.addEventListener('click', onClick.bind(instance))
|
35
|
+
forEach.call(panel.querySelectorAll('table.tableblock'), function (table) {
|
36
|
+
var container = Object.assign(document.createElement('div'), { className: 'tablecontainer' })
|
37
|
+
table.parentNode.insertBefore(container, table).appendChild(table)
|
38
|
+
})
|
39
|
+
var onClick = syncId === undefined ? activateTab : activateTabSync
|
40
|
+
tab.addEventListener('click', onClick.bind({ tabs: tabs, tab: tab, panel: panel }))
|
35
41
|
})
|
42
|
+
if (!selectedTab && first) toggleSelected(first.tab, true) || toggleHidden(first.panel, false)
|
36
43
|
})
|
37
44
|
onHashChange()
|
38
45
|
forEach.call(tabsBlocks, function (tabs) {
|
@@ -51,6 +58,9 @@
|
|
51
58
|
forEach.call(tabs.querySelectorAll('.tabpanel'), function (el) {
|
52
59
|
toggleHidden(el, el !== panel)
|
53
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
|
+
}
|
54
64
|
if (!e) return
|
55
65
|
var loc = window.location
|
56
66
|
var hashIdx = loc.hash ? loc.href.indexOf('#') : -1
|
@@ -64,7 +74,7 @@
|
|
64
74
|
var thisTab = this.tab
|
65
75
|
var initialY = tabs.getBoundingClientRect().y
|
66
76
|
forEach.call(document.querySelectorAll('.tabs .tablist .tab'), function (tab) {
|
67
|
-
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 })
|
68
78
|
})
|
69
79
|
var shiftedBy = tabs.getBoundingClientRect().y - initialY
|
70
80
|
if (shiftedBy && (shiftedBy = Math.round(shiftedBy))) window.scrollBy({ top: shiftedBy, behavior: 'instant' })
|
@@ -75,7 +85,7 @@
|
|
75
85
|
}
|
76
86
|
|
77
87
|
function toggleSelected (el, state) {
|
78
|
-
el.setAttribute('aria-selected', state)
|
88
|
+
el.setAttribute('aria-selected', '' + state)
|
79
89
|
el.classList.toggle('is-selected', state)
|
80
90
|
el.tabIndex = state ? 0 : -1
|
81
91
|
}
|
@@ -85,6 +95,6 @@
|
|
85
95
|
if (!id) return
|
86
96
|
var tab = document.getElementById(~id.indexOf('%') ? decodeURIComponent(id) : id)
|
87
97
|
if (!(tab && tab.classList.contains('tab'))) return
|
88
|
-
tab.dataset.syncId ?
|
98
|
+
tab.dataset.syncId === undefined ? activateTab.call({ tab: tab }) : activateTabSync.call({ tab: tab })
|
89
99
|
}
|
90
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
|
-
|
22
|
-
|
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 = {}
|
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.
|
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:
|
11
|
+
date: 2023-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|