Skip to main content
Use the same namespace as your ComponentPackage. Existing family registration rejects overlapping package namespaces. The public helper creates separate names for tokens, fonts and keyframes; it never loads another stylesheet or copies the implementation of a child component.
Use inherited public tokens for the shared design foundation: The slash notation above lists separate variables, for example --fff-text-sm, --fff-text-md and --fff-text-lg. Keep author selectors scoped to your own explicit classes. stylesFrom retains the actual style owner; the namespace helper does not rewrite CSS, acquire fonts, validate arbitrary third-party stylesheet contents or grant origin permissions. Declare font/binary resources in your asset graph and use your namespaced family name in @font-face. Keep native .dark, logical properties and dir support; changing appearance alone does not require a factory restart or resource fetch.

Repeated SVGs and server rendering

A gradient, mask, filter or clip path needs an instance identity. A component name alone is insufficient when the same component appears twice, in a repeater, table or suspended modal.
Render that ID and its url(#...) reference together. In JavaScript, pass the same server-rendered instance string:
PHP and JS encode the exact UTF-8 bytes identically. There is no random counter, async hash, document scan, ID cache or retained element. Namespace and local names are portable lowercase identities (48 and64 characters); the owner key accepts at most512 valid UTF-8 bytes without control characters. Give independently rendered owners different identities. Duplicating identical markup with the same owner key cannot produce distinct SVG IDs automatically.

Theme configuration admission

The existing aliases (primary, radius, field_bg and their documented related aliases) and literal --fff-*/fff_* variables remain available. Package tokens use mergePackageTheme() to generate names without overriding the core namespace. Theme updates validate atomically: invalid input leaves the previous map intact. Each complete map is limited to512 entries and64KiB of names/values, with at most2048 bytes per value. Values are strings or finite numbers. Objects, arrays, unknown aliases, malformed names, declaration delimiters, markup, escapes, comments and explicit resource-loading/executable functions reject. Ordinary var(), calc(), gradients, colors, quoted font names and comma-separated shadow values remain supported. Values are not semantically type-checked as individual CSS properties; trusted application configuration and stylesheet authors still own their values and resource permissions. Previously ignored unknown aliases and nonscalar values now fail explicitly. Remove those obsolete settings before upgrading. Theme maps remain request/job scoped and detach caller references; author helpers themselves retain no state.

Continue reading

Extension guides · Definition and registration reference
Last modified on October 17, 2026