Fossil SCM
Fix scrolling bug in FF and Chrome.
Commit
22f2d083d6f374ce2a0bdbbca1eeae2845ac3b4312ffc586ce39aecda1e76938
Parent
db5868e0820f713…
2 files changed
+1
-11
+6
-23
+1
-11
| --- src/default.css | ||
| +++ src/default.css | ||
| @@ -994,21 +994,11 @@ | ||
| 994 | 994 | flex-direction: column; |
| 995 | 995 | border-width: 1px; |
| 996 | 996 | border-style: outset; |
| 997 | 997 | border-color: inherit; |
| 998 | 998 | } |
| 999 | -.tab-container > .tabs > .tab-panel, | |
| 1000 | -.tab-container > .tabs > fieldset.tab-wrapper { | |
| 1001 | - align-self: stretch; | |
| 1002 | - flex: 10 1 auto; | |
| 1003 | - display: flex; | |
| 1004 | - flex-direction: row; | |
| 1005 | - border: 0; | |
| 1006 | - padding: 0; | |
| 1007 | - margin: 0; | |
| 1008 | -} | |
| 1009 | -.tab-container > .tabs > fieldset.tab-wrapper > .tab-panel{ | |
| 999 | +.tab-container > .tabs > .tab-panel { | |
| 1010 | 1000 | align-self: stretch; |
| 1011 | 1001 | flex: 10 1 auto; |
| 1012 | 1002 | display: block; |
| 1013 | 1003 | border: 0; |
| 1014 | 1004 | padding: 0; |
| 1015 | 1005 |
| --- src/default.css | |
| +++ src/default.css | |
| @@ -994,21 +994,11 @@ | |
| 994 | flex-direction: column; |
| 995 | border-width: 1px; |
| 996 | border-style: outset; |
| 997 | border-color: inherit; |
| 998 | } |
| 999 | .tab-container > .tabs > .tab-panel, |
| 1000 | .tab-container > .tabs > fieldset.tab-wrapper { |
| 1001 | align-self: stretch; |
| 1002 | flex: 10 1 auto; |
| 1003 | display: flex; |
| 1004 | flex-direction: row; |
| 1005 | border: 0; |
| 1006 | padding: 0; |
| 1007 | margin: 0; |
| 1008 | } |
| 1009 | .tab-container > .tabs > fieldset.tab-wrapper > .tab-panel{ |
| 1010 | align-self: stretch; |
| 1011 | flex: 10 1 auto; |
| 1012 | display: block; |
| 1013 | border: 0; |
| 1014 | padding: 0; |
| 1015 |
| --- src/default.css | |
| +++ src/default.css | |
| @@ -994,21 +994,11 @@ | |
| 994 | flex-direction: column; |
| 995 | border-width: 1px; |
| 996 | border-style: outset; |
| 997 | border-color: inherit; |
| 998 | } |
| 999 | .tab-container > .tabs > .tab-panel { |
| 1000 | align-self: stretch; |
| 1001 | flex: 10 1 auto; |
| 1002 | display: block; |
| 1003 | border: 0; |
| 1004 | padding: 0; |
| 1005 |
+6
-23
| --- src/fossil.tabs.js | ||
| +++ src/fossil.tabs.js | ||
| @@ -30,42 +30,28 @@ | ||
| 30 | 30 | tabAccessKeys: true |
| 31 | 31 | }; |
| 32 | 32 | |
| 33 | 33 | /** |
| 34 | 34 | Internal helper to normalize a method argument to a tab |
| 35 | - element. arg may be a tab DOM element or an index into | |
| 36 | - tabMgr.e.tabs.childNodes. Returns the corresponding tab element. | |
| 35 | + element. arg may be a tab DOM element, a selector string, or an | |
| 36 | + index into tabMgr.e.tabs.childNodes. Returns the corresponding | |
| 37 | + tab element. | |
| 37 | 38 | */ |
| 38 | 39 | const tabArg = function(arg,tabMgr){ |
| 39 | 40 | if('string'===typeof arg) arg = E(arg); |
| 40 | 41 | else if(tabMgr && 'number'===typeof arg && arg>=0){ |
| 41 | 42 | arg = tabMgr.e.tabs.childNodes[arg]; |
| 42 | 43 | } |
| 43 | - if(arg){ | |
| 44 | - if('FIELDSET'===arg.tagName && arg.classList.contains('tab-wrapper')){ | |
| 45 | - arg = arg.firstElementChild; | |
| 46 | - } | |
| 47 | - } | |
| 48 | 44 | return arg; |
| 49 | 45 | }; |
| 50 | 46 | |
| 51 | 47 | /** |
| 52 | 48 | Sets sets the visibility of tab element e to on or off. e MUST be |
| 53 | - a TabManager tab element which has been wrapped in a | |
| 54 | - FIELDSET.tab-wrapper parent element. We disable the hidden | |
| 55 | - FIELDSET.tab-wrapper elements so that any access keys assigned | |
| 56 | - to their children cannot be inadvertently triggered | |
| 49 | + a TabManager tab element. | |
| 57 | 50 | */ |
| 58 | 51 | const setVisible = function(e,yes){ |
| 59 | - const fsWrapper = e.parentElement/*FIELDSET wrapper*/; | |
| 60 | - if(yes){ | |
| 61 | - D.removeClass(e, 'hidden'); | |
| 62 | - D.enable(fsWrapper); | |
| 63 | - }else{ | |
| 64 | - D.addClass(e, 'hidden'); | |
| 65 | - D.disable(fsWrapper); | |
| 66 | - } | |
| 52 | + D[yes ? 'removeClass' : 'addClass'](e, 'hidden'); | |
| 67 | 53 | }; |
| 68 | 54 | |
| 69 | 55 | TabManager.prototype = { |
| 70 | 56 | /** |
| 71 | 57 | Initializes the tabs associated with the given tab container |
| @@ -164,13 +150,11 @@ | ||
| 164 | 150 | e.target.$manager.switchToTab(e.target.$tab); |
| 165 | 151 | }; |
| 166 | 152 | } |
| 167 | 153 | tab = tabArg(tab); |
| 168 | 154 | tab.remove(); |
| 169 | - const eFs = D.addClass(D.fieldset(), 'tab-wrapper'); | |
| 170 | - D.append(eFs, D.addClass(tab,'tab-panel')); | |
| 171 | - D.append(this.e.tabs, eFs); | |
| 155 | + D.append(this.e.tabs, D.addClass(tab,'tab-panel')); | |
| 172 | 156 | const tabCount = this.e.tabBar.childNodes.length+1; |
| 173 | 157 | const lbl = tab.dataset.tabLabel || 'Tab #'+tabCount; |
| 174 | 158 | const btn = D.addClass(D.append(D.span(), lbl), 'tab-button'); |
| 175 | 159 | D.append(this.e.tabBar,btn); |
| 176 | 160 | btn.$manager = this; |
| @@ -238,11 +222,10 @@ | ||
| 238 | 222 | this._dispatchEvent('before-switch-from', this._currentTab); |
| 239 | 223 | } |
| 240 | 224 | delete this._currentTab; |
| 241 | 225 | this.e.tabs.childNodes.forEach((e,ndx)=>{ |
| 242 | 226 | const btn = this.e.tabBar.childNodes[ndx]; |
| 243 | - e = e.firstElementChild /* b/c arguments[0] is a FIELDSET wrapper */; | |
| 244 | 227 | if(e===tab){ |
| 245 | 228 | if(D.hasClass(e,'selected')){ |
| 246 | 229 | return; |
| 247 | 230 | } |
| 248 | 231 | self._dispatchEvent('before-switch-to',tab); |
| 249 | 232 |
| --- src/fossil.tabs.js | |
| +++ src/fossil.tabs.js | |
| @@ -30,42 +30,28 @@ | |
| 30 | tabAccessKeys: true |
| 31 | }; |
| 32 | |
| 33 | /** |
| 34 | Internal helper to normalize a method argument to a tab |
| 35 | element. arg may be a tab DOM element or an index into |
| 36 | tabMgr.e.tabs.childNodes. Returns the corresponding tab element. |
| 37 | */ |
| 38 | const tabArg = function(arg,tabMgr){ |
| 39 | if('string'===typeof arg) arg = E(arg); |
| 40 | else if(tabMgr && 'number'===typeof arg && arg>=0){ |
| 41 | arg = tabMgr.e.tabs.childNodes[arg]; |
| 42 | } |
| 43 | if(arg){ |
| 44 | if('FIELDSET'===arg.tagName && arg.classList.contains('tab-wrapper')){ |
| 45 | arg = arg.firstElementChild; |
| 46 | } |
| 47 | } |
| 48 | return arg; |
| 49 | }; |
| 50 | |
| 51 | /** |
| 52 | Sets sets the visibility of tab element e to on or off. e MUST be |
| 53 | a TabManager tab element which has been wrapped in a |
| 54 | FIELDSET.tab-wrapper parent element. We disable the hidden |
| 55 | FIELDSET.tab-wrapper elements so that any access keys assigned |
| 56 | to their children cannot be inadvertently triggered |
| 57 | */ |
| 58 | const setVisible = function(e,yes){ |
| 59 | const fsWrapper = e.parentElement/*FIELDSET wrapper*/; |
| 60 | if(yes){ |
| 61 | D.removeClass(e, 'hidden'); |
| 62 | D.enable(fsWrapper); |
| 63 | }else{ |
| 64 | D.addClass(e, 'hidden'); |
| 65 | D.disable(fsWrapper); |
| 66 | } |
| 67 | }; |
| 68 | |
| 69 | TabManager.prototype = { |
| 70 | /** |
| 71 | Initializes the tabs associated with the given tab container |
| @@ -164,13 +150,11 @@ | |
| 164 | e.target.$manager.switchToTab(e.target.$tab); |
| 165 | }; |
| 166 | } |
| 167 | tab = tabArg(tab); |
| 168 | tab.remove(); |
| 169 | const eFs = D.addClass(D.fieldset(), 'tab-wrapper'); |
| 170 | D.append(eFs, D.addClass(tab,'tab-panel')); |
| 171 | D.append(this.e.tabs, eFs); |
| 172 | const tabCount = this.e.tabBar.childNodes.length+1; |
| 173 | const lbl = tab.dataset.tabLabel || 'Tab #'+tabCount; |
| 174 | const btn = D.addClass(D.append(D.span(), lbl), 'tab-button'); |
| 175 | D.append(this.e.tabBar,btn); |
| 176 | btn.$manager = this; |
| @@ -238,11 +222,10 @@ | |
| 238 | this._dispatchEvent('before-switch-from', this._currentTab); |
| 239 | } |
| 240 | delete this._currentTab; |
| 241 | this.e.tabs.childNodes.forEach((e,ndx)=>{ |
| 242 | const btn = this.e.tabBar.childNodes[ndx]; |
| 243 | e = e.firstElementChild /* b/c arguments[0] is a FIELDSET wrapper */; |
| 244 | if(e===tab){ |
| 245 | if(D.hasClass(e,'selected')){ |
| 246 | return; |
| 247 | } |
| 248 | self._dispatchEvent('before-switch-to',tab); |
| 249 |
| --- src/fossil.tabs.js | |
| +++ src/fossil.tabs.js | |
| @@ -30,42 +30,28 @@ | |
| 30 | tabAccessKeys: true |
| 31 | }; |
| 32 | |
| 33 | /** |
| 34 | Internal helper to normalize a method argument to a tab |
| 35 | element. arg may be a tab DOM element, a selector string, or an |
| 36 | index into tabMgr.e.tabs.childNodes. Returns the corresponding |
| 37 | tab element. |
| 38 | */ |
| 39 | const tabArg = function(arg,tabMgr){ |
| 40 | if('string'===typeof arg) arg = E(arg); |
| 41 | else if(tabMgr && 'number'===typeof arg && arg>=0){ |
| 42 | arg = tabMgr.e.tabs.childNodes[arg]; |
| 43 | } |
| 44 | return arg; |
| 45 | }; |
| 46 | |
| 47 | /** |
| 48 | Sets sets the visibility of tab element e to on or off. e MUST be |
| 49 | a TabManager tab element. |
| 50 | */ |
| 51 | const setVisible = function(e,yes){ |
| 52 | D[yes ? 'removeClass' : 'addClass'](e, 'hidden'); |
| 53 | }; |
| 54 | |
| 55 | TabManager.prototype = { |
| 56 | /** |
| 57 | Initializes the tabs associated with the given tab container |
| @@ -164,13 +150,11 @@ | |
| 150 | e.target.$manager.switchToTab(e.target.$tab); |
| 151 | }; |
| 152 | } |
| 153 | tab = tabArg(tab); |
| 154 | tab.remove(); |
| 155 | D.append(this.e.tabs, D.addClass(tab,'tab-panel')); |
| 156 | const tabCount = this.e.tabBar.childNodes.length+1; |
| 157 | const lbl = tab.dataset.tabLabel || 'Tab #'+tabCount; |
| 158 | const btn = D.addClass(D.append(D.span(), lbl), 'tab-button'); |
| 159 | D.append(this.e.tabBar,btn); |
| 160 | btn.$manager = this; |
| @@ -238,11 +222,10 @@ | |
| 222 | this._dispatchEvent('before-switch-from', this._currentTab); |
| 223 | } |
| 224 | delete this._currentTab; |
| 225 | this.e.tabs.childNodes.forEach((e,ndx)=>{ |
| 226 | const btn = this.e.tabBar.childNodes[ndx]; |
| 227 | if(e===tab){ |
| 228 | if(D.hasClass(e,'selected')){ |
| 229 | return; |
| 230 | } |
| 231 | self._dispatchEvent('before-switch-to',tab); |
| 232 |