{"record":{"id":"9dcd599acdee12a4","repo":"d2lang/d2","slug":"expected-text-transform-to-be-one-of-s","errorCode":null,"errorMessage":"expected \"text-transform\" to be one of (%s)","messagePattern":"expected \"text-transform\" to be one of \\((.+?)\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"d2graph/d2graph.go","lineNumber":488,"sourceCode":"\t\tif err != nil {\n\t\t\treturn errors.New(`expected \"filled\" to be true or false`)\n\t\t}\n\t\ts.Filled.Value = value\n\tcase \"double-border\":\n\t\tif s.DoubleBorder == nil {\n\t\t\tbreak\n\t\t}\n\t\t_, err := strconv.ParseBool(value)\n\t\tif err != nil {\n\t\t\treturn errors.New(`expected \"double-border\" to be true or false`)\n\t\t}\n\t\ts.DoubleBorder.Value = value\n\tcase \"text-transform\":\n\t\tif s.TextTransform == nil {\n\t\t\tbreak\n\t\t}\n\t\tif !go2.Contains(d2ast.TextTransforms, strings.ToLower(value)) {\n\t\t\treturn fmt.Errorf(`expected \"text-transform\" to be one of (%s)`, strings.Join(d2ast.TextTransforms, \", \"))\n\t\t}\n\t\ts.TextTransform.Value = value\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown style key: %s\", key)\n\t}\n\n\treturn nil\n}\n\ntype ContainerLevel int\n\nfunc (l ContainerLevel) LabelSize() int {\n\t// Largest to smallest\n\tif l == 1 {\n\t\treturn d2fonts.FONT_SIZE_XXL\n\t} else if l == 2 {\n\t\treturn d2fonts.FONT_SIZE_XL\n\t} else if l == 3 {","sourceCodeStart":470,"sourceCodeEnd":506,"githubUrl":"https://github.com/d2lang/d2/blob/0d69dca6f532ceaeacd615d35d1eaa41a238ffdb/d2graph/d2graph.go#L470-L506","documentation":"The \"text-transform\" style key must be one of d2ast.TextTransforms (e.g. uppercase, lowercase, title, none). Matching is case-insensitive; anything else returns this error listing the valid options.","triggerScenarios":"Assigning style key \"text-transform\" with a value not in d2ast.TextTransforms — e.g. \"capitalize\", \"UPPER CASE\", or CSS-style values like \"initial\".","commonSituations":"Porting CSS text-transform habits into .d2 files, typos such as \"titel\", or expecting values CSS supports that D2 does not implement.","solutions":["Use one of: uppercase, lowercase, title, none (see joined list in the message)","Lowercase the value (matching is case-insensitive, but use canonical form)","Remove the key if no transform is wanted"],"exampleFix":"// before\nx.style.text-transform: capitalize\n// after\nx.style.text-transform: title","handlingStrategy":"validation","validationCode":"var textTransforms = map[string]bool{\"uppercase\":true, \"lowercase\":true, \"title\":true, \"none\":true}\nif !textTransforms[strings.ToLower(v)] { /* reject before SetStyle */ }","typeGuard":"func validTextTransform(v string) bool {\n\treturn slices.Contains(d2ast.TextTransforms, strings.ToLower(v))\n}","tryCatchPattern":"if err := obj.SetStyle(\"text-transform\", v); err != nil {\n\treturn fmt.Errorf(\"text-transform invalid: %v\", err)\n}","preventionTips":["Use only uppercase/lowercase/title/none","Do not copy CSS text-transform values into .d2","Keep values lowercase"],"tags":["d2","style-validation","text-transform"],"backgroundTag":"invalid-style-value","analyzedSha":"0d69dca6f532ceaeacd615d35d1eaa41a238ffdb","analyzedAt":"2026-08-31T12:19:21.182Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}