diff --git a/presentation/dom.nix b/presentation/dom.nix
index d64032b9..ecd096e0 100644
--- a/presentation/dom.nix
+++ b/presentation/dom.nix
@@ -55,6 +55,7 @@ let
(category:
(mapAttrs (_: e: mkOption { type = submodule e; })
# HACK: don't evaluate the submodule types, just grab the config directly
+ # TODO: we may want to do this properly and loop `categories` through the top-level `config`
(filterAttrs (_: e: elem category (e { name = "dummy"; config = { }; }).config.categories) elements))
);
@@ -521,6 +522,96 @@ let
config.categories = [ "flow" "palpable" ];
config.__toString = self: print-element name self.attrs (toString self.content);
};
+
+ dl = { config, name, ... }: {
+ imports = [ element ];
+ options = {
+ attrs = mkAttrs { };
+ content = mkOption {
+ type = with types; listOf (submodule ({ ... }: {
+ options = {
+ # TODO: wrap in `
` if set
+ div.attrs = mkOption {
+ type = with types; nullOr (submodule { options = global-attrs; });
+ default = null;
+ };
+ before = mkOption {
+ type = with types; listOf (attrTag categories.scripting);
+ default = [ ];
+ };
+ terms = mkOption {
+ type = with types; nonEmptyListOf (submodule dt);
+ };
+ between = mkOption {
+ type = with types; listOf (attrTag categories.scripting);
+ default = [ ];
+ };
+ descriptions = mkOption {
+ type = with types; nonEmptyListOf (submodule dd);
+ };
+ after = mkOption {
+ type = with types; listOf (attrTag categories.scripting);
+ default = [ ];
+ };
+ };
+ }));
+ };
+ };
+ config.categories = [ "flow" ] ++ [ "palpable" ];
+ config.__toString = self:
+ with lib;
+ let
+ content = map
+ (entry:
+ let
+ list = squash ''
+ ${join "\n" entry.before}
+ ${join "\n" entry.terms}
+ ${join "\n" entry.between}
+ ${join "\n" entry.descriptions}
+ ${join "\n" entry.after}
+ '';
+ in
+ if !isNull entry.div.attrs
+ then print-element "div" entry.div.attrs list
+ else list
+ )
+ self.content;
+ in
+ print-element name self.attrs (join "\n" content);
+ };
+
+ dt = { config, ... }: {
+ imports = [ element ];
+ options = {
+ attrs = mkAttrs { };
+ dt = mkOption {
+ type = with types; either str (submodule (attrTag (
+ # TODO: test
+ with lib; removeAttrs
+ (filterAttrs
+ (name: value: ! any (c: elem c [ "sectioning" "heading" ]) value.categories)
+ categories.flow
+ )
+ [ "header" "footer" ]
+ )));
+ };
+ };
+ config.categories = [ ];
+ config.__toString = self: print-element "dt" self.attrs self.dt;
+ };
+
+ dd = { config, ... }: {
+ imports = [ element ];
+ options = {
+ attrs = mkAttrs { };
+ dd = mkOption {
+ type = with types; either str (submodule (attrTag categories.flow));
+ };
+ };
+ config.categories = [ ];
+ config.__toString = self: print-element "dd" self.attrs self.dd;
+ };
};
in
{