- From: Christoph Päper via GitHub <sysbot+gh@w3.org>
- Date: Thu, 15 Feb 2024 06:56:00 +0000
- To: public-css-archive@w3.org
If, in Tab’s example, `--foo` should not be visible inside `--inner()`, then why would `--inner()` be accessible inside `--outer()`? If the answer is: ”duh, because it’s declared with the `@function` at-rule and not like a custom property within a ruleset“, we effectively are introducing global constants (with awkward parentheses to distinguish them from custom properties): ~~~~ css @function --phi() { result: calc(0.5 + sqrt(1.25)); } .foo { --phi: 1.618; /* unused */ aspect-ratio: var(--phi, 1.6); /* legacy */ aspect-ratio: --phi(); } ~~~~ I’m not saying this was bad or unexpected, but I think I vaguely remember some arguments being raised against this when variables had been proposed – using an at-rule – and hence ended up as custom properties. Nobody wants to define the function body within a property value, I guess: ~~~~ css :root { --parameter: 1; /* initial */ --function(): calc(1em * arg(1, 1) * pow(2, var(--parameter, 0) / 2)); } .foo { --parameter: 2; font-size: func(--function, 3); /* = 1em * 3 * pow(2, 2 / 2) */ } ~~~~ (It’s non-obvious whether the second argument to `func()` would be passed to the custom function or if it was the fallback value as in `var()`.) ---- I agree that global functions would be hardly manageable if local ”variables“ would intrude their scope. That is one reason why I suggested that, inside functions, named variables needed to be declared explicitly in the usual way as custom properties and would need `arg()` to use the value of parameters passed to the function. Although I’m not sure it’s a good idea, you could then still allow external variables to bleed in, but it would be obvious that the closest definition wins. Basically, the function at-rule would behave as if it inherited the custom properties from the ruleset it is used within, and could also overwrite them. ~~~~ css @function --outer() { --foo: arg(1); result: calc(var(--foo) + --inner()); } @function --inner() { result: calc(var(--foo) / 2); } .foo { --foo: 1; width: calc(--outer(10) * 1px); /* = 15px */ height: calc(--inner(10) * 1px); /* = 0.5px */ } ~~~~ Arguments could also be pre-named, but would live in a different namespace as custom properties and therefore could not be used directly in `var()`: ~~~~ css @function --outer(--foo) { --foo: arg(--foo); /* for --inner() */ result: calc(arg(--foo) + --inner()); } ~~~~ -- GitHub Notification of comment by Crissov Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/9938#issuecomment-1945469527 using your GitHub account -- Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 15 February 2024 06:56:03 UTC