Skip to content

Commit eabbf06

Browse files
committed
Refactored temporary tabbed code into separate component
1 parent 7880991 commit eabbf06

File tree

9 files changed

+135
-55
lines changed

9 files changed

+135
-55
lines changed

material/assets/javascripts/bundle.2248a2bd.min.js

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

material/assets/javascripts/bundle.2248a2bd.min.js.map

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

material/assets/javascripts/bundle.e3d8df37.min.js

-29
This file was deleted.

material/assets/javascripts/bundle.e3d8df37.min.js.map

-7
This file was deleted.

material/base.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ <h1>{{ page.title | d(config.site_name, true)}}</h1>
225225
</script>
226226
{% endblock %}
227227
{% block scripts %}
228-
<script src="{{ 'assets/javascripts/bundle.e3d8df37.min.js' | url }}"></script>
228+
<script src="{{ 'assets/javascripts/bundle.2248a2bd.min.js' | url }}"></script>
229229
{% for path in config["extra_javascript"] %}
230230
<script src="{{ path | url }}"></script>
231231
{% endfor %}

src/assets/javascripts/bundle.ts

-17
Original file line numberDiff line numberDiff line change
@@ -256,20 +256,3 @@ window.screen$ = screen$ /* Screen observable */
256256
window.print$ = print$ /* Print mode observable */
257257
window.alert$ = alert$ /* Alert subject */
258258
window.component$ = component$ /* Component observable */
259-
260-
/* ----------------------------------------------------------------------------
261-
* Temporary, before we integrate this into master
262-
* ------------------------------------------------------------------------- */
263-
264-
document$
265-
.pipe(
266-
switchMap(() => of(...getElements(".tabbed-alternate > input"))
267-
.pipe(
268-
mergeMap(el => fromEvent(el, "change").pipe(mapTo(el))),
269-
map(el => getElementOrThrow(`label[for=${el.id}]`))
270-
)
271-
)
272-
)
273-
.subscribe(el => {
274-
el.scrollIntoView({ behavior: "smooth", block: "nearest" })
275-
})

src/assets/javascripts/components/content/_/index.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { Component } from "../../_"
2828
import { CodeBlock, mountCodeBlock } from "../code"
2929
import { Details, mountDetails } from "../details"
3030
import { DataTable, mountDataTable } from "../table"
31+
import { ContentTabs, mountContentTabs } from "../tabs"
3132

3233
/* ----------------------------------------------------------------------------
3334
* Types
@@ -37,6 +38,7 @@ import { DataTable, mountDataTable } from "../table"
3738
* Content
3839
*/
3940
export type Content =
41+
| ContentTabs
4042
| CodeBlock
4143
| DataTable
4244
| Details
@@ -84,6 +86,10 @@ export function mountContent(
8486

8587
/* Details */
8688
...getElements("details", el)
87-
.map(child => mountDetails(child, { target$, print$ }))
89+
.map(child => mountDetails(child, { target$, print$ })),
90+
91+
/* Content tabs */
92+
...getElements("[data-tabs]", el)
93+
.map(child => mountContentTabs(child))
8894
)
8995
}

src/assets/javascripts/components/content/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ export * from "./_"
2424
export * from "./code"
2525
export * from "./details"
2626
export * from "./table"
27+
export * from "./tabs"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* Copyright (c) 2016-2021 Martin Donath <[email protected]>
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a copy
5+
* of this software and associated documentation files (the "Software"), to
6+
* deal in the Software without restriction, including without limitation the
7+
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8+
* sell copies of the Software, and to permit persons to whom the Software is
9+
* furnished to do so, subject to the following conditions:
10+
*
11+
* The above copyright notice and this permission notice shall be included in
12+
* all copies or substantial portions of the Software.
13+
*
14+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
17+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20+
* IN THE SOFTWARE.
21+
*/
22+
23+
import { NEVER, Observable, Subject, fromEvent, merge } from "rxjs"
24+
import { finalize, map, mapTo, tap } from "rxjs/operators"
25+
26+
import { getElementOrThrow, getElements } from "~/browser"
27+
28+
import { Component } from "../../_"
29+
30+
/* ----------------------------------------------------------------------------
31+
* Types
32+
* ------------------------------------------------------------------------- */
33+
34+
/**
35+
* Content tabs
36+
*/
37+
export interface ContentTabs {
38+
active: HTMLLabelElement /* Active tab label */
39+
}
40+
41+
/* ----------------------------------------------------------------------------
42+
* Functions
43+
* ------------------------------------------------------------------------- */
44+
45+
/**
46+
* Watch content tabs
47+
*
48+
* @param el - Content tabs element
49+
*
50+
* @returns Content tabs observable
51+
*/
52+
export function watchContentTabs(
53+
el: HTMLElement
54+
): Observable<ContentTabs> {
55+
if (!el.classList.contains(".tabbed-alternate"))
56+
return NEVER
57+
else
58+
return merge(...getElements(":scope > input", el)
59+
.map(input => fromEvent(input, "change").pipe(mapTo(input.id)))
60+
)
61+
.pipe(
62+
map(id => ({
63+
active: getElementOrThrow<HTMLLabelElement>(`label[for=${id}]`)
64+
}))
65+
)
66+
}
67+
68+
/**
69+
* Mount content tabs
70+
*
71+
* @param el - Content tabs element
72+
*
73+
* @returns Content tabs component observable
74+
*/
75+
export function mountContentTabs(
76+
el: HTMLElement
77+
): Observable<Component<ContentTabs>> {
78+
const internal$ = new Subject<ContentTabs>()
79+
internal$.subscribe(({ active }) => {
80+
active.scrollIntoView({ behavior: "smooth", block: "nearest" })
81+
})
82+
83+
/* Create and return component */
84+
return watchContentTabs(el)
85+
.pipe(
86+
tap(state => internal$.next(state)),
87+
finalize(() => internal$.complete()),
88+
map(state => ({ ref: el, ...state }))
89+
)
90+
}

0 commit comments

Comments
 (0)