diff --git a/app/lib/frontend/handlers/experimental.dart b/app/lib/frontend/handlers/experimental.dart index a61d038275..4c581e4d9a 100644 --- a/app/lib/frontend/handlers/experimental.dart +++ b/app/lib/frontend/handlers/experimental.dart @@ -6,16 +6,18 @@ import 'package:meta/meta.dart'; import '../../shared/cookie_utils.dart'; -const _publicFlags = { - 'dark', - 'download-counts', - 'search-completion', - 'search-topics', +typedef PublicFlag = ({String name, String description}); + +const _publicFlags = { + (name: 'dark', description: 'Dark mode'), + (name: 'download-counts', description: 'Download count metrics'), + (name: 'search-completion', description: 'Completions for the search bar'), + (name: 'search-topics', description: 'Show matching topics when searching'), }; -const _allFlags = { +final _allFlags = { 'dark-as-default', - ..._publicFlags, + ..._publicFlags.map((x) => x.name), }; /// The name of the experimental cookie. @@ -33,7 +35,8 @@ class ExperimentalFlags { ExperimentalFlags(Set enabled) : _enabled = enabled.intersection(_allFlags); - static final List publicFlags = _publicFlags.toList()..sort(); + static final List publicFlags = _publicFlags.toList() + ..sort((a, b) => a.name.compareTo(b.name)); static final ExperimentalFlags empty = ExperimentalFlags(const {}); factory ExperimentalFlags.parseFromCookie(String? value) { diff --git a/app/lib/frontend/handlers/misc.dart b/app/lib/frontend/handlers/misc.dart index 46599849d6..aa9eb4136f 100644 --- a/app/lib/frontend/handlers/misc.dart +++ b/app/lib/frontend/handlers/misc.dart @@ -204,29 +204,48 @@ Future experimentalHandler(shelf.Request request) async { final clearUri = Uri( path: '/experimental', queryParameters: flags.urlParametersForToggle()); - final clearLink = flags.isEmpty ? '' : '(clear).'; - final publicBlock = ExperimentalFlags.publicFlags.map((f) { - final change = flags.isEnabled(f) ? '0' : '1'; - final uri = Uri(path: '/experimental', queryParameters: {f: change}); - return 'toggle: $f
'; - }).join(); + final clearLink = flags.isEmpty ? '' : '(clear all).'; + final publicBlock = ''' +
    + ${ExperimentalFlags.publicFlags.map((f) { + final change = flags.isEnabled(f.name) ? '0' : '1'; + final uri = Uri(path: '/experimental', queryParameters: {f.name: change}); + return '
  • ${f.description} (toggle)'; + }).join()} +
+'''; return htmlResponse(''' - -
+

Experiments

+

+ Experiments are not an official part of the pub.dev site. +

+ They showcase features we are working on, that are not yet ready for + deployment, and might still not: +

    +
  • work fully or as expected, +
  • be well documented, +
  • have good accesibility, +
  • have the final polished styling. +
+

+ Enable experiments at your own discresion. +

+ An experiment is no promise of an actual later launch of that given feature. +

+ Still, feel free to provide feedback on the + issue tracker. + Be sure to mention what experiments were enabled.

Experiments enabled: $flags
$clearLink -

-

$publicBlock

+

$publicBlock

- (redirecting to pub.dev in 15 seconds). -

-
+ After enabling experiments go back to pub.dev. ''', headers: { HttpHeaders.setCookieHeader: buildSetCookieValue(