Skip to content

Commit 0fb2c19

Browse files
committed
create DownloadableSnippet component
1 parent 13645b9 commit 0fb2c19

File tree

13 files changed

+426
-101
lines changed

13 files changed

+426
-101
lines changed

site/lib/_sass/components/_button.scss

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,22 @@ button {
9494
}
9595
}
9696
}
97+
98+
.segmented-button {
99+
display: inline-flex;
100+
101+
a,
102+
button {
103+
&:not(:last-child) {
104+
border-top-right-radius: 0;
105+
border-bottom-right-radius: 0;
106+
107+
border-right: 1px solid var(--site-outline-variant);
108+
}
109+
110+
&:not(:first-child) {
111+
border-top-left-radius: 0;
112+
border-bottom-left-radius: 0;
113+
}
114+
}
115+
}

site/lib/_sass/components/_code.scss

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,29 +276,59 @@ pre {
276276
}
277277

278278
.code-block-wrapper {
279-
display: flex;
280-
flex-direction: column;
279+
display: grid;
280+
grid-template-rows: min-content 1fr;
281+
grid-template-columns: 100%;
281282

282283
margin-block-start: 1rem;
283284
margin-block-end: 1rem;
284285
border: 1px solid var(--site-inset-borderColor);
285286
background-color: var(--site-inset-bgColor);
286287

288+
transition: grid-template-rows 0.3s ease, border-bottom-width 0.3s ease;
289+
290+
&.collapsed {
291+
grid-template-rows: min-content 0fr;
292+
border-bottom-width: 0px;
293+
294+
.collapse-button > .material-symbols {
295+
transform: rotate(180deg);
296+
}
297+
}
298+
299+
.collapse-button > .material-symbols {
300+
transform: rotate(0deg);
301+
transform-origin: center;
302+
transition: transform 0.3s ease;
303+
}
304+
287305
.code-block-header {
306+
display: flex;
307+
align-items: center;
308+
288309
background-color: var(--site-raised-bgColor);
289310
border-bottom: 1px solid var(--site-inset-borderColor);
290-
font-size: 0.9375rem;
291-
font-weight: 500;
292-
overflow-x: hidden;
293-
text-overflow: ellipsis;
311+
294312
padding: 0.75rem 0.5rem 0.67rem 1rem;
313+
gap: 0.5rem;
314+
315+
> span:first-child {
316+
flex-grow: 1;
317+
overflow-x: hidden;
318+
text-overflow: ellipsis;
319+
320+
font-size: 0.9375rem;
321+
font-weight: 500;
322+
}
295323
}
296324

297325
.code-block-body {
298326
flex-grow: 1;
299327

300328
position: relative;
301329
background: none;
330+
min-height: 0;
331+
overflow: hidden;
302332

303333
.copy-button {
304334
position: absolute;

site/lib/jaspr_options.dart

Lines changed: 77 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,45 @@
77
import 'package:jaspr/jaspr.dart';
88
import 'package:docs_flutter_dev_site/src/client/global_scripts.dart'
99
as prefix0;
10-
import 'package:docs_flutter_dev_site/src/components/common/client/cookie_notice.dart'
10+
import 'package:docs_flutter_dev_site/src/components/common/client/collapse_button.dart'
1111
as prefix1;
12-
import 'package:docs_flutter_dev_site/src/components/common/client/copy_button.dart'
12+
import 'package:docs_flutter_dev_site/src/components/common/client/cookie_notice.dart'
1313
as prefix2;
14-
import 'package:docs_flutter_dev_site/src/components/common/client/download_latest_button.dart'
14+
import 'package:docs_flutter_dev_site/src/components/common/client/copy_button.dart'
1515
as prefix3;
16-
import 'package:docs_flutter_dev_site/src/components/common/client/feedback.dart'
16+
import 'package:docs_flutter_dev_site/src/components/common/client/download_button.dart'
1717
as prefix4;
18-
import 'package:docs_flutter_dev_site/src/components/common/client/on_this_page_button.dart'
18+
import 'package:docs_flutter_dev_site/src/components/common/client/download_latest_button.dart'
1919
as prefix5;
20-
import 'package:docs_flutter_dev_site/src/components/common/client/os_selector.dart'
20+
import 'package:docs_flutter_dev_site/src/components/common/client/feedback.dart'
2121
as prefix6;
22-
import 'package:docs_flutter_dev_site/src/components/common/client/simple_tooltip.dart'
22+
import 'package:docs_flutter_dev_site/src/components/common/client/on_this_page_button.dart'
2323
as prefix7;
24-
import 'package:docs_flutter_dev_site/src/components/dartpad/dartpad_injector.dart'
24+
import 'package:docs_flutter_dev_site/src/components/common/client/os_selector.dart'
2525
as prefix8;
26-
import 'package:docs_flutter_dev_site/src/components/layout/client/pagenav.dart'
26+
import 'package:docs_flutter_dev_site/src/components/common/client/simple_tooltip.dart'
2727
as prefix9;
28-
import 'package:docs_flutter_dev_site/src/components/layout/menu_toggle.dart'
28+
import 'package:docs_flutter_dev_site/src/components/dartpad/dartpad_injector.dart'
2929
as prefix10;
30-
import 'package:docs_flutter_dev_site/src/components/layout/site_switcher.dart'
30+
import 'package:docs_flutter_dev_site/src/components/layout/client/pagenav.dart'
3131
as prefix11;
32-
import 'package:docs_flutter_dev_site/src/components/layout/theme_switcher.dart'
32+
import 'package:docs_flutter_dev_site/src/components/layout/menu_toggle.dart'
3333
as prefix12;
34-
import 'package:docs_flutter_dev_site/src/components/pages/archive_table.dart'
34+
import 'package:docs_flutter_dev_site/src/components/layout/site_switcher.dart'
3535
as prefix13;
36-
import 'package:docs_flutter_dev_site/src/components/pages/glossary_search_section.dart'
36+
import 'package:docs_flutter_dev_site/src/components/layout/theme_switcher.dart'
3737
as prefix14;
38-
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters.dart'
38+
import 'package:docs_flutter_dev_site/src/components/pages/archive_table.dart'
3939
as prefix15;
40-
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters_sidebar.dart'
40+
import 'package:docs_flutter_dev_site/src/components/pages/glossary_search_section.dart'
4141
as prefix16;
42-
import 'package:docs_flutter_dev_site/src/components/tutorial/client/quiz.dart'
42+
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters.dart'
4343
as prefix17;
44-
import 'package:jaspr_content/components/file_tree.dart' as prefix18;
44+
import 'package:docs_flutter_dev_site/src/components/pages/learning_resource_filters_sidebar.dart'
45+
as prefix18;
46+
import 'package:docs_flutter_dev_site/src/components/tutorial/client/quiz.dart'
47+
as prefix19;
48+
import 'package:jaspr_content/components/file_tree.dart' as prefix20;
4549

4650
/// Default [JasprOptions] for use with your jaspr project.
4751
///
@@ -65,119 +69,136 @@ JasprOptions get defaultJasprOptions => JasprOptions(
6569
'src/client/global_scripts',
6670
),
6771

68-
prefix1.CookieNotice: ClientTarget<prefix1.CookieNotice>(
72+
prefix1.CollapseButton: ClientTarget<prefix1.CollapseButton>(
73+
'src/components/common/client/collapse_button',
74+
params: _prefix1CollapseButton,
75+
),
76+
77+
prefix2.CookieNotice: ClientTarget<prefix2.CookieNotice>(
6978
'src/components/common/client/cookie_notice',
7079
),
7180

72-
prefix2.CopyButton: ClientTarget<prefix2.CopyButton>(
81+
prefix3.CopyButton: ClientTarget<prefix3.CopyButton>(
7382
'src/components/common/client/copy_button',
74-
params: _prefix2CopyButton,
83+
params: _prefix3CopyButton,
84+
),
85+
86+
prefix4.DownloadButton: ClientTarget<prefix4.DownloadButton>(
87+
'src/components/common/client/download_button',
88+
params: _prefix4DownloadButton,
7589
),
7690

77-
prefix3.DownloadLatestButton: ClientTarget<prefix3.DownloadLatestButton>(
91+
prefix5.DownloadLatestButton: ClientTarget<prefix5.DownloadLatestButton>(
7892
'src/components/common/client/download_latest_button',
79-
params: _prefix3DownloadLatestButton,
93+
params: _prefix5DownloadLatestButton,
8094
),
8195

82-
prefix4.FeedbackComponent: ClientTarget<prefix4.FeedbackComponent>(
96+
prefix6.FeedbackComponent: ClientTarget<prefix6.FeedbackComponent>(
8397
'src/components/common/client/feedback',
84-
params: _prefix4FeedbackComponent,
98+
params: _prefix6FeedbackComponent,
8599
),
86100

87-
prefix5.OnThisPageButton: ClientTarget<prefix5.OnThisPageButton>(
101+
prefix7.OnThisPageButton: ClientTarget<prefix7.OnThisPageButton>(
88102
'src/components/common/client/on_this_page_button',
89103
),
90104

91-
prefix6.OsSelector: ClientTarget<prefix6.OsSelector>(
105+
prefix8.OsSelector: ClientTarget<prefix8.OsSelector>(
92106
'src/components/common/client/os_selector',
93107
),
94108

95-
prefix7.SimpleTooltip: ClientTarget<prefix7.SimpleTooltip>(
109+
prefix9.SimpleTooltip: ClientTarget<prefix9.SimpleTooltip>(
96110
'src/components/common/client/simple_tooltip',
97-
params: _prefix7SimpleTooltip,
111+
params: _prefix9SimpleTooltip,
98112
),
99113

100-
prefix8.DartPadInjector: ClientTarget<prefix8.DartPadInjector>(
114+
prefix10.DartPadInjector: ClientTarget<prefix10.DartPadInjector>(
101115
'src/components/dartpad/dartpad_injector',
102-
params: _prefix8DartPadInjector,
116+
params: _prefix10DartPadInjector,
103117
),
104118

105-
prefix9.PageNav: ClientTarget<prefix9.PageNav>(
119+
prefix11.PageNav: ClientTarget<prefix11.PageNav>(
106120
'src/components/layout/client/pagenav',
107-
params: _prefix9PageNav,
121+
params: _prefix11PageNav,
108122
),
109123

110-
prefix10.MenuToggle: ClientTarget<prefix10.MenuToggle>(
124+
prefix12.MenuToggle: ClientTarget<prefix12.MenuToggle>(
111125
'src/components/layout/menu_toggle',
112126
),
113127

114-
prefix11.SiteSwitcher: ClientTarget<prefix11.SiteSwitcher>(
128+
prefix13.SiteSwitcher: ClientTarget<prefix13.SiteSwitcher>(
115129
'src/components/layout/site_switcher',
116130
),
117131

118-
prefix12.ThemeSwitcher: ClientTarget<prefix12.ThemeSwitcher>(
132+
prefix14.ThemeSwitcher: ClientTarget<prefix14.ThemeSwitcher>(
119133
'src/components/layout/theme_switcher',
120134
),
121135

122-
prefix13.ArchiveTable: ClientTarget<prefix13.ArchiveTable>(
136+
prefix15.ArchiveTable: ClientTarget<prefix15.ArchiveTable>(
123137
'src/components/pages/archive_table',
124-
params: _prefix13ArchiveTable,
138+
params: _prefix15ArchiveTable,
125139
),
126140

127-
prefix14.GlossarySearchSection:
128-
ClientTarget<prefix14.GlossarySearchSection>(
141+
prefix16.GlossarySearchSection:
142+
ClientTarget<prefix16.GlossarySearchSection>(
129143
'src/components/pages/glossary_search_section',
130144
),
131145

132-
prefix15.LearningResourceFilters:
133-
ClientTarget<prefix15.LearningResourceFilters>(
146+
prefix17.LearningResourceFilters:
147+
ClientTarget<prefix17.LearningResourceFilters>(
134148
'src/components/pages/learning_resource_filters',
135149
),
136150

137-
prefix16.LearningResourceFiltersSidebar:
138-
ClientTarget<prefix16.LearningResourceFiltersSidebar>(
151+
prefix18.LearningResourceFiltersSidebar:
152+
ClientTarget<prefix18.LearningResourceFiltersSidebar>(
139153
'src/components/pages/learning_resource_filters_sidebar',
140154
),
141155

142-
prefix17.InteractiveQuiz: ClientTarget<prefix17.InteractiveQuiz>(
156+
prefix19.InteractiveQuiz: ClientTarget<prefix19.InteractiveQuiz>(
143157
'src/components/tutorial/client/quiz',
144-
params: _prefix17InteractiveQuiz,
158+
params: _prefix19InteractiveQuiz,
145159
),
146160
},
147-
styles: () => [...prefix18.FileTree.styles],
161+
styles: () => [...prefix20.FileTree.styles],
148162
);
149163

150-
Map<String, dynamic> _prefix2CopyButton(prefix2.CopyButton c) => {
164+
Map<String, dynamic> _prefix1CollapseButton(prefix1.CollapseButton c) => {
165+
'classes': c.classes,
166+
'title': c.title,
167+
};
168+
Map<String, dynamic> _prefix3CopyButton(prefix3.CopyButton c) => {
151169
'toCopy': c.toCopy,
152170
'buttonText': c.buttonText,
153171
'classes': c.classes,
154172
'title': c.title,
155173
};
156-
Map<String, dynamic> _prefix3DownloadLatestButton(
157-
prefix3.DownloadLatestButton c,
174+
Map<String, dynamic> _prefix4DownloadButton(prefix4.DownloadButton c) => {
175+
'name': c.name,
176+
};
177+
Map<String, dynamic> _prefix5DownloadLatestButton(
178+
prefix5.DownloadLatestButton c,
158179
) => {'os': c.os, 'arch': c.arch};
159-
Map<String, dynamic> _prefix4FeedbackComponent(prefix4.FeedbackComponent c) => {
180+
Map<String, dynamic> _prefix6FeedbackComponent(prefix6.FeedbackComponent c) => {
160181
'issueUrl': c.issueUrl,
161182
};
162-
Map<String, dynamic> _prefix7SimpleTooltip(prefix7.SimpleTooltip c) => {
183+
Map<String, dynamic> _prefix9SimpleTooltip(prefix9.SimpleTooltip c) => {
163184
'target': c.target.toId(),
164185
'content': c.content.toId(),
165186
};
166-
Map<String, dynamic> _prefix8DartPadInjector(prefix8.DartPadInjector c) => {
187+
Map<String, dynamic> _prefix10DartPadInjector(prefix10.DartPadInjector c) => {
167188
'title': c.title,
168189
'theme': c.theme,
169190
'height': c.height,
170191
'runAutomatically': c.runAutomatically,
171192
};
172-
Map<String, dynamic> _prefix9PageNav(prefix9.PageNav c) => {
193+
Map<String, dynamic> _prefix11PageNav(prefix11.PageNav c) => {
173194
'title': c.title,
174195
'content': c.content.toId(),
175196
};
176-
Map<String, dynamic> _prefix13ArchiveTable(prefix13.ArchiveTable c) => {
197+
Map<String, dynamic> _prefix15ArchiveTable(prefix15.ArchiveTable c) => {
177198
'os': c.os,
178199
'channel': c.channel,
179200
};
180-
Map<String, dynamic> _prefix17InteractiveQuiz(prefix17.InteractiveQuiz c) => {
201+
Map<String, dynamic> _prefix19InteractiveQuiz(prefix19.InteractiveQuiz c) => {
181202
'title': c.title,
182203
'questions': c.questions.map((i) => i.toJson()).toList(),
183204
};

site/lib/main.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'src/components/pages/archive_table.dart';
2020
import 'src/components/pages/devtools_release_notes_index.dart';
2121
import 'src/components/pages/expansion_list.dart';
2222
import 'src/components/pages/learning_resource_index.dart';
23+
import 'src/components/tutorial/downloadable_snippet.dart';
2324
import 'src/components/tutorial/progress_ring.dart';
2425
import 'src/components/tutorial/quiz.dart';
2526
import 'src/components/tutorial/summary_card.dart';
@@ -105,6 +106,7 @@ List<CustomComponent> get _embeddableComponents => [
105106
const Quiz(),
106107
const ProgressRing(),
107108
const SummaryCard(),
109+
const DownloadableSnippet(),
108110
CustomComponent(
109111
pattern: RegExp('OSSelector', caseSensitive: false),
110112
builder: (_, _, _) => const OsSelector(),

site/lib/src/components/common/button.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,17 @@ enum ButtonStyle {
9494
ButtonStyle.text => 'text-button',
9595
};
9696
}
97+
98+
class SegmentedButton extends StatelessComponent {
99+
const SegmentedButton({
100+
super.key,
101+
required this.children,
102+
});
103+
104+
final List<Component> children;
105+
106+
@override
107+
Component build(BuildContext context) {
108+
return span(classes: ['segmented-button'].toClasses, children);
109+
}
110+
}

0 commit comments

Comments
 (0)