- From: James Nash via GitHub <sysbot+gh@w3.org>
- Date: Thu, 13 Jan 2022 23:28:10 +0000
- To: public-design-tokens-log@w3.org
@TravisSpomer In light of the recent comments on the reserved words issue (#61), I wonder if combination of the prefix idea there and what you've suggested could work:
Let's imagine for a moment we use a special prefix like `$` or `_` for all properties in our spec that have a special meaning (value, type, description, etc.) across both groups and tokens. Then we could have a "special" property on groups, for example `$default`, that can be used when you want a token in that group which shares the same name in some contexts (e.g. when being exported as code).
So, it could look like this (if we assume `_` as our universal reserved word prefix):
```jsonc
{
"color": {
"accent": {
"_default": {
"_type": "color",
"_value": "#dd0000"
},
"light": {
"_type": "color",
"_value": "#ff2222"
},
"dark": {
"_type": "color",
"_value": "#aa0000"
}
}
}
}
```
I've been thinking lately about the tree data model that our token files describe (similar to how HTML files define a DOM) and, in the context of this issue, was wondering if that default color token is logically a child of the accent group or a child of the color group. Personally, I'm leaning towards the latter. In this example it makes more sense to me to think of all 3 are accent colors, as opposed to 1 arbitrary color + 2 accent colors. It's just so happens that one of those accent colors doesn't need a further suffix appended to its name when exported as code.
I therefore like this kind of approach, where that default token is still something _within_ the group. The hybrid approaches lift it up a level in the hierarchy and that doesn't feel right to me.
If we did something like `_default`, I think it could referenced as `{color.accent._default}`, but perhaps as a convenient shorthand you'd also be allowed to do `{color.accent}`. The rule that parsers could follow could be that a reference pointing to a group would resolve to the `_default` token in that group if it exists or be invalid otherwise.
But, I am intrigued by @TravisSpomer's desire to be able reference groups some day. I think there is a way that could co-exist with the `_default` referencing shorthand I've just proposed. My reading of his example is that `button.text` is actually a _group_ referencing another group as a shortcut to create a batch of alias tokens.
So, rather than make the value of `button.text` be something that looks like a token (since it has a `value` property), why not do this:
```jsonc
{
"neutralcontrol": {
"foreground": {
"_type": "color",
"rest": { "_value": "{...}" },
"hover": { "_value": "{...}" },
"pressed": { "_value": "{...}" },
"disabled": { "_value": "{...}" }
},
"background": {
"_type": "color",
"rest": { "_value": "{...}" },
"hover": { "_value": "{...}" },
"pressed": { "_value": "{...}" },
"disabled": { "_value": "{...}" }
}
},
"button":
{
"text": {
// The value is no longer an object with a token property and therefore
// not a token. So, when a "bare" reference like this is encountered parsers
// are required to interpret it as a *group* reference.
"color": "{neutralcontrol.foreground}"
},
"base": {
"color": "{neutralcontrol.background}"
}
}
}
```
Even if `{neutralcontrol.foreground}` contained a `_default` token, parsers would know not treat the _group_ reference as a shortcut to that default token. Instead, you'd get `button.text.color._default` being an alias token for `neutralcontrol.foreground._default`.
That could actually be quite nice if you'd prefer to use `_default` instead of `rest` in your naming:
```jsonc
{
"neutralcontrol": {
"foreground": {
"_type": "color",
"_default": { "_value": "{...}" },
"hover": { "_value": "{...}" },
"pressed": { "_value": "{...}" },
"disabled": { "_value": "{...}" }
},
"background": {
"_type": "color",
"_default": { "_value": "{...}" },
"hover": { "_value": "{...}" },
"pressed": { "_value": "{...}" },
"disabled": { "_value": "{...}" }
}
},
"button":
{
"text": {
// The value is no longer an object with a token property and therefore
// not a token. So, when a "bare" reference like this is encountered parsers
// are required to interpret it as a *group* reference.
"color": "{neutralcontrol.foreground}"
},
"base": {
"color": "{neutralcontrol.background}"
}
}
}
```
An export tool outputting SASS might then produce something along the lines of:
```scss
$neutralcontrol-foreground: #... ;
$neutralcontrol-foreground-hover: #...;
$neutralcontrol-foreground-pressed: #...;
// etc...
$button-text-color: $neutralcontrol-foreground;
$button-text-color-hover: $neutralcontrol-foreground-hover;
$button-text-color-pressed: $neutralcontrol-foreground-pressed;
// etc...
```
What do you think?
--
GitHub Notification of comment by c1rrus
Please view or discuss this issue at https://github.com/design-tokens/community-group/issues/97#issuecomment-1012611941 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 13 January 2022 23:28:12 UTC