Skip to content

Commit 16d5d0b

Browse files
schultekparlough
andauthored
Refactor to more idiomatic Jaspr code (#12726)
This refactors some parts of the code to have more idiomatic Jaspr components and reduce logic in `global_scripts.dart`. - Implement a new `ComponentRef` system that in some capacity works similar to server components (more limited and less elegant, but functionally working). This is to unblock some improvements (some of which are included in this PR) to the interactive components of the website, as we can already start architecting towards server components and write less manual dom logic. - Change the `Dropdown` component to accept direct `toggle` and `content` components, which simplifies it's implementation. Migrate existing uses of `Dropdown`. - Migrate the top TOC (renamed to `PageNav`) to use the `Dropdown` component, as well as the new `ComponentRef`s. Split into separate "site-subheader" and "pagenav" elements. Preparations for #12715 - Add a new `Tooltip` component and migrate the glossary tooltips to it using the new `ComponentRef`s. Can be reused for #12600 --------- Co-authored-by: Parker Lougheed <[email protected]>
1 parent 4908cb5 commit 16d5d0b

26 files changed

+727
-525
lines changed

site/lib/_sass/_site.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@
2929
@use 'components/misc';
3030
@use 'components/next-prev-nav';
3131
@use 'components/os-selector';
32+
@use 'components/pagenav';
3233
@use 'components/pill';
3334
@use 'components/quiz';
3435
@use 'components/sidebar';
3536
@use 'components/side-menu';
3637
@use 'components/site-switcher';
3738
@use 'components/tabs';
3839
@use 'components/theming';
39-
@use 'components/toc';
4040
@use 'components/tooltip';
4141
@use 'components/trailing';
4242

site/lib/_sass/components/_header.scss

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,26 @@ body.open_menu #menu-toggle span.material-symbols {
167167
}
168168
}
169169
}
170+
171+
#site-subheader {
172+
display: flex;
173+
flex-direction: row;
174+
flex-wrap: wrap;
175+
align-items: center;
176+
177+
position: sticky;
178+
top: var(--site-header-height);
179+
z-index: var(--site-z-subheader);
180+
height: var(--site-subheader-height);
181+
182+
font-family: var(--site-ui-fontFamily);
183+
font-size: 0.875rem;
184+
185+
background-color: var(--site-base-bgColor);
186+
border-bottom: 0.1rem solid var(--site-outline-variant);
187+
box-shadow: 0 2px 4px rgba(0, 0, 0, .05);
188+
189+
@media (width < 240px), (width >= 1200px) {
190+
display: none;
191+
}
192+
}

site/lib/_sass/components/_toc.scss renamed to site/lib/_sass/components/_pagenav.scss

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,6 @@
1-
#toc-top {
2-
font-family: var(--site-ui-fontFamily);
3-
4-
display: none;
5-
flex-direction: row;
6-
flex-wrap: wrap;
7-
justify-content: space-between;
8-
align-content: center;
9-
height: var(--site-subheader-height);
10-
11-
@media (min-width: 240px) {
12-
display: flex;
13-
}
14-
15-
@media (min-width: 1200px) {
16-
display: none;
17-
}
18-
19-
position: sticky;
20-
top: var(--site-header-height);
21-
22-
background-color: var(--site-base-bgColor);
23-
border-bottom: 0.1rem solid var(--site-outline-variant);
24-
box-shadow: 0 2px 4px rgba(0, 0, 0, .05);
25-
26-
font-size: 0.875rem;
27-
z-index: var(--site-z-subheader);
1+
#pagenav {
2+
flex-grow: 1;
3+
min-width: 0;
284

295
>button.dropdown-button {
306
display: flex;
@@ -58,25 +34,21 @@
5834
}
5935

6036
.toc-current {
61-
flex-wrap: nowrap;
62-
white-space: nowrap;
63-
overflow: hidden;
64-
6537
display: none;
6638

6739
@media (min-width: 320px) {
6840
display: flex;
6941
}
70-
}
71-
72-
#current-header {
73-
color: var(--site-base-fgColor-alt);
7442

43+
flex-wrap: nowrap;
44+
white-space: nowrap;
7545
overflow: hidden;
7646
text-overflow: ellipsis;
47+
48+
color: var(--site-base-fgColor-alt);
7749
}
7850

79-
.dropdown-content {
51+
#pagenav-content {
8052
position: absolute;
8153
box-shadow: 0 2px 4px rgba(0, 0, 0, .05);
8254
border-bottom: 0.1rem solid var(--site-outline-variant);
@@ -106,7 +78,7 @@
10678
max-width: 24rem;
10779
}
10880

109-
>a {
81+
a#return-to-top {
11082
margin: 0.4rem 0;
11183
padding: 0.1rem;
11284
font-size: 1rem;
@@ -134,7 +106,7 @@
134106
}
135107
}
136108

137-
>nav {
109+
nav {
138110
padding: 0.6rem 0 0.8rem;
139111
}
140112
}

site/lib/_sass/components/_side-menu.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.styled-toc-list {
1+
.toc-list {
22
margin: 0;
33
--toc-indent: 0;
44

site/lib/_sass/components/_tooltip.scss

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.tooltip-wrapper {
22
position: relative;
33

4-
a.tooltip-target {
4+
.tooltip-target a {
55
color: inherit;
66
text-decoration: underline;
77
text-decoration-style: dotted;
@@ -10,14 +10,13 @@
1010
.tooltip {
1111
visibility: hidden;
1212

13-
display: flex;
13+
display: block;
1414
position: absolute;
1515
z-index: var(--site-z-floating);
1616
top: 100%;
1717
left: 50%;
1818
transform: translateX(-50%);
1919

20-
flex-flow: column nowrap;
2120
width: 16rem;
2221

2322
background: var(--site-raised-bgColor);
@@ -26,20 +25,22 @@
2625
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, .15);
2726
padding: 0.8rem;
2827

29-
font-size: 1rem;
28+
font-size: 0.875rem;
3029
font-weight: normal;
3130
font-style: normal;
3231

32+
.tooltip-content {
33+
display: flex;
34+
flex-flow: column nowrap;
35+
color: var(--site-secondary-textColor);
36+
}
37+
3338
.tooltip-header {
3439
font-size: 1.2rem;
3540
font-weight: 500;
3641
margin-bottom: 0.25rem;
3742
}
3843

39-
.tooltip-content {
40-
font-size: 0.875rem;
41-
color: var(--site-secondary-textColor);
42-
}
4344
}
4445

4546
// On non-touch devices, show tooltip on hover or focus.
@@ -53,7 +54,7 @@
5354
}
5455
}
5556

56-
// On touch devices, show tooltip on click (see global_scripts.dart).
57+
// On touch devices, show tooltip on click.
5758
@media all and (pointer: coarse) {
5859
.tooltip.visible {
5960
visibility: visible;

site/lib/jaspr_options.dart

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,29 @@ import 'package:docs_flutter_dev_site/src/components/common/client/on_this_page_
1919
as prefix5;
2020
import 'package:docs_flutter_dev_site/src/components/common/client/os_selector.dart'
2121
as prefix6;
22-
import 'package:docs_flutter_dev_site/src/components/dartpad/dartpad_injector.dart'
22+
import 'package:docs_flutter_dev_site/src/components/common/client/simple_tooltip.dart'
2323
as prefix7;
24-
import 'package:docs_flutter_dev_site/src/components/layout/menu_toggle.dart'
24+
import 'package:docs_flutter_dev_site/src/components/dartpad/dartpad_injector.dart'
2525
as prefix8;
26-
import 'package:docs_flutter_dev_site/src/components/layout/site_switcher.dart'
26+
import 'package:docs_flutter_dev_site/src/components/layout/client/pagenav.dart'
2727
as prefix9;
28-
import 'package:docs_flutter_dev_site/src/components/layout/theme_switcher.dart'
28+
import 'package:docs_flutter_dev_site/src/components/layout/menu_toggle.dart'
2929
as prefix10;
30-
import 'package:docs_flutter_dev_site/src/components/pages/archive_table.dart'
30+
import 'package:docs_flutter_dev_site/src/components/layout/site_switcher.dart'
3131
as prefix11;
32-
import 'package:docs_flutter_dev_site/src/components/pages/glossary_search_section.dart'
32+
import 'package:docs_flutter_dev_site/src/components/layout/theme_switcher.dart'
3333
as prefix12;
34-
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters.dart'
34+
import 'package:docs_flutter_dev_site/src/components/pages/archive_table.dart'
3535
as prefix13;
36-
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters_sidebar.dart'
36+
import 'package:docs_flutter_dev_site/src/components/pages/glossary_search_section.dart'
3737
as prefix14;
38-
import 'package:docs_flutter_dev_site/src/components/tutorial/client/quiz.dart'
38+
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters.dart'
3939
as prefix15;
40-
import 'package:jaspr_content/components/file_tree.dart' as prefix16;
40+
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters_sidebar.dart'
41+
as prefix16;
42+
import 'package:docs_flutter_dev_site/src/components/tutorial/client/quiz.dart'
43+
as prefix17;
44+
import 'package:jaspr_content/components/file_tree.dart' as prefix18;
4145

4246
/// Default [JasprOptions] for use with your jaspr project.
4347
///
@@ -88,49 +92,59 @@ JasprOptions get defaultJasprOptions => JasprOptions(
8892
'src/components/common/client/os_selector',
8993
),
9094

91-
prefix7.DartPadInjector: ClientTarget<prefix7.DartPadInjector>(
95+
prefix7.SimpleTooltip: ClientTarget<prefix7.SimpleTooltip>(
96+
'src/components/common/client/simple_tooltip',
97+
params: _prefix7SimpleTooltip,
98+
),
99+
100+
prefix8.DartPadInjector: ClientTarget<prefix8.DartPadInjector>(
92101
'src/components/dartpad/dartpad_injector',
93-
params: _prefix7DartPadInjector,
102+
params: _prefix8DartPadInjector,
103+
),
104+
105+
prefix9.PageNav: ClientTarget<prefix9.PageNav>(
106+
'src/components/layout/client/pagenav',
107+
params: _prefix9PageNav,
94108
),
95109

96-
prefix8.MenuToggle: ClientTarget<prefix8.MenuToggle>(
110+
prefix10.MenuToggle: ClientTarget<prefix10.MenuToggle>(
97111
'src/components/layout/menu_toggle',
98112
),
99113

100-
prefix9.SiteSwitcher: ClientTarget<prefix9.SiteSwitcher>(
114+
prefix11.SiteSwitcher: ClientTarget<prefix11.SiteSwitcher>(
101115
'src/components/layout/site_switcher',
102116
),
103117

104-
prefix10.ThemeSwitcher: ClientTarget<prefix10.ThemeSwitcher>(
118+
prefix12.ThemeSwitcher: ClientTarget<prefix12.ThemeSwitcher>(
105119
'src/components/layout/theme_switcher',
106120
),
107121

108-
prefix11.ArchiveTable: ClientTarget<prefix11.ArchiveTable>(
122+
prefix13.ArchiveTable: ClientTarget<prefix13.ArchiveTable>(
109123
'src/components/pages/archive_table',
110-
params: _prefix11ArchiveTable,
124+
params: _prefix13ArchiveTable,
111125
),
112126

113-
prefix12.GlossarySearchSection:
114-
ClientTarget<prefix12.GlossarySearchSection>(
127+
prefix14.GlossarySearchSection:
128+
ClientTarget<prefix14.GlossarySearchSection>(
115129
'src/components/pages/glossary_search_section',
116130
),
117131

118-
prefix13.LearningResourceFilters:
119-
ClientTarget<prefix13.LearningResourceFilters>(
132+
prefix15.LearningResourceFilters:
133+
ClientTarget<prefix15.LearningResourceFilters>(
120134
'src/components/pages/learning_resource_filters',
121135
),
122136

123-
prefix14.LearningResourceFiltersSidebar:
124-
ClientTarget<prefix14.LearningResourceFiltersSidebar>(
137+
prefix16.LearningResourceFiltersSidebar:
138+
ClientTarget<prefix16.LearningResourceFiltersSidebar>(
125139
'src/components/pages/learning_resource_filters_sidebar',
126140
),
127141

128-
prefix15.InteractiveQuiz: ClientTarget<prefix15.InteractiveQuiz>(
142+
prefix17.InteractiveQuiz: ClientTarget<prefix17.InteractiveQuiz>(
129143
'src/components/tutorial/client/quiz',
130-
params: _prefix15InteractiveQuiz,
144+
params: _prefix17InteractiveQuiz,
131145
),
132146
},
133-
styles: () => [...prefix16.FileTree.styles],
147+
styles: () => [...prefix18.FileTree.styles],
134148
);
135149

136150
Map<String, dynamic> _prefix2CopyButton(prefix2.CopyButton c) => {
@@ -145,17 +159,25 @@ Map<String, dynamic> _prefix3DownloadLatestButton(
145159
Map<String, dynamic> _prefix4FeedbackComponent(prefix4.FeedbackComponent c) => {
146160
'issueUrl': c.issueUrl,
147161
};
148-
Map<String, dynamic> _prefix7DartPadInjector(prefix7.DartPadInjector c) => {
162+
Map<String, dynamic> _prefix7SimpleTooltip(prefix7.SimpleTooltip c) => {
163+
'target': c.target.toId(),
164+
'content': c.content.toId(),
165+
};
166+
Map<String, dynamic> _prefix8DartPadInjector(prefix8.DartPadInjector c) => {
149167
'title': c.title,
150168
'theme': c.theme,
151169
'height': c.height,
152170
'runAutomatically': c.runAutomatically,
153171
};
154-
Map<String, dynamic> _prefix11ArchiveTable(prefix11.ArchiveTable c) => {
172+
Map<String, dynamic> _prefix9PageNav(prefix9.PageNav c) => {
173+
'title': c.title,
174+
'content': c.content.toId(),
175+
};
176+
Map<String, dynamic> _prefix13ArchiveTable(prefix13.ArchiveTable c) => {
155177
'os': c.os,
156178
'channel': c.channel,
157179
};
158-
Map<String, dynamic> _prefix15InteractiveQuiz(prefix15.InteractiveQuiz c) => {
180+
Map<String, dynamic> _prefix17InteractiveQuiz(prefix17.InteractiveQuiz c) => {
159181
'title': c.title,
160182
'questions': c.questions.map((i) => i.toJson()).toList(),
161183
};

site/lib/main.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'src/components/pages/expansion_list.dart';
2121
import 'src/components/pages/learning_resource_index.dart';
2222
import 'src/components/tutorial/progress_ring.dart';
2323
import 'src/components/tutorial/quiz.dart';
24+
import 'src/components/util/component_ref.dart';
2425
import 'src/extensions/registry.dart';
2526
import 'src/layouts/catalog_page_layout.dart';
2627
import 'src/layouts/doc_layout.dart';
@@ -36,7 +37,7 @@ void main() {
3637
// Initializes the server environment with the generated default options.
3738
Jaspr.initializeApp(options: defaultJasprOptions);
3839

39-
runApp(_docsFlutterDevSite);
40+
runApp(ComponentRefScope(child: _docsFlutterDevSite));
4041
}
4142

4243
Component get _docsFlutterDevSite => ContentApp.custom(

0 commit comments

Comments
 (0)