orange-opensource/ouds-ios/ouds-ios-guide-create-theme

Claude Code and agent skill by orange-opensource/ouds-ios

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Use when the user wants to create a custom OUDS theme or brand theme for an iOS app — covers subclassing OrangeTheme, building a theme from scratch on OUDSTheme, mixing existing providers, local custom fonts (.ttf registration), and tuning.

Install

npx vskill@latest install orange-opensource/ouds-ios/ouds-ios-guide-create-theme

SKILL.md

Skill: ouds-ios-guide-create-theme

Step-by-step guide to create a custom OUDS theme for an iOS/iPadOS app.


0. Prerequisites — ask the user first

Before writing any code, ask the user these two questions:

Question 1 — Which strategy?

StrategyWhen to choose
A — Subclass `OrangeTheme` (recommended)Orange brand assets are needed; only some tokens differ from Orange defaults
B — From scratch on `OUDSTheme`Fully independent brand (no Orange assets); all tokens are custom
C — Mix existing providersCompose providers from existing themes without creating a new subclass

Question 2 — Custom fonts?

Does the theme need to embed .ttf font files? If yes, collect:

  • Font family name (as shown in Font Book)
  • PostScript name for each weight used

📚 Reference documentation

To get the full list of properties / tokens by protocols:

  • General OUDS documentation : https://ios.unified-design-system.orange.com
  • Semantic tokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensSemantic/
  • ColorSemanticTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensSemantic/ColorSemanticTokens
  • BorderSemanticTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensSemantic/BorderSemanticTokens
  • DimensionSemanticTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensSemantic/DimensionSemanticTokens
  • SizeSemanticTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensSemantic/SizeSemanticTokens
  • SpaceSemanticTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensSemantic/SpaceSemanticTokens
  • FontSemanticTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensSemantic/FontSemanticTokens
  • etc.
  • Component tokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensComponent/
  • ButtonComponentTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensComponent/ButtonComponentTokens
  • TextInputComponentTokens : https://ios.unified-design-system.orange.com/documentation/oudsTokensComponent/TextInputComponentTokens
  • etc.
Tip : To see all properties / tokens of a provider, look in files Values/SemanticTokens/ or Values/ComponentTokens/ in Orange theme from OUDS iOS repository.

1. Inheritance hierarchy

OUDSTheme ← base "abstract" class (open)
│
└── OrangeTheme ← open, the ONLY publicly subclassable theme
│
└── YourTheme ← your app's custom theme (Strategy A)
OUDSTheme
└── YourTheme ← from-scratch theme (Strategy B)
Rule: Only OrangeTheme can be subclassed by external code.
SoshTheme, OrangeCompactTheme, and WireframeTheme are all final
but their tokens providers can be reused.

2. Strategy A — Subclass OrangeTheme (recommended)

2.1 Import
swift
import OUDSThemesOrange
// or the umbrella product that includes it:
import OUDSSwiftUIOrange
2.2 Override only the providers you need

Each provider inherits from an OrangeThemeXxxProvider class. Override @objc open properties.

Semantic token providers available to override (Layer 2 — generic tokens):

What to overrideOrange base class to inherit
Borders (style / width / radius)OrangeThemeBorderSemanticTokensProvider
Colors (light + dark via MultipleColorSemanticToken)OrangeThemeColorSemanticTokensProvider
Color modes (for OUDSColoredSurface)OrangeThemeColorModeSemanticTokensProvider
Color chartsOrangeThemeColorChartSemanticTokensProvider
Color decorativeOrangeThemeColorDecorativeSemanticTokensProvider
EffectsOrangeThemeEffectSemanticTokensProvider
Elevations / shadowsOrangeThemeElevationSemanticTokensProvider
Typography / fontsOrangeThemeFontSemanticTokensProvider
GridsOrangeThemeGridSemanticTokensProvider
OpacitiesOrangeThemeOpacitySemanticTokensProvider
Dimensions (base scale)OrangeThemeDimensionSemanticTokensProvider
Sizes (icon, component)OrangeThemeSizeSemanticTokensProvider
Spaces (fixed, scaled)OrangeThemeSpaceSemanticTokensProvider

Component token providers available to override (Layer 3 — component-specific tokens):

ComponentOrange base class
Alert messagesOrangeThemeAlertComponentTokensProvider
BadgeOrangeThemeBadgeComponentTokensProvider
Bar (tab bar / toolbar)OrangeThemeBarComponentTokensProvider
Bullet listOrangeThemeBulletListComponentTokensProvider
ButtonOrangeThemeButtonComponentTokensProvider
CheckboxOrangeThemeCheckboxComponentTokensProvider
ChipOrangeThemeChipComponentTokensProvider
DividerOrangeThemeDividerComponentTokensProvider
IconOrangeThemeIconComponentTokensProvider
LinkOrangeThemeLinkComponentTokensProvider
List itemOrangeThemeListItemComponentTokensProvider
Pin code inputOrangeThemePinCodeInputComponentTokensProvider
Quantity inputOrangeThemeQuantityInputComponentTokensProvider
Radio buttonOrangeThemeRadioButtonComponentTokensProvider
Select inputOrangeThemeSelectInputComponentTokensProvider
SkeletonOrangeThemeSkeletonComponentTokensProvider
SwitchOrangeThemeSwitchComponentTokensProvider
TagOrangeThemeTagComponentTokensProvider
Input tagOrangeThemeInputTagComponentTokensProvider
Text areaOrangeThemeTextAreaComponentTokensProvider
Text inputOrangeThemeTextInputComponentTokensProvider

Etc.

2.3 Example provider overrides
swift
import OUDSTokensRaw
// Colors
class YourThemeColorProvider: OrangeThemeColorSemanticTokensProvider {
override var bgSecondary: MultipleColorSemanticToken {
MultipleColorSemanticToken(
light: ColorRawTokens.colorDecorativeAmber500,
dark: OrangeBrandColorRawTokens.colorOrange900)
}
override var actionEnabled: MultipleColorSemanticToken {
MultipleColorSemanticToken(
light: ColorRawTokens.colorDecorativeShockingPink100,
dark: ColorRawTokens.functionalScarlet600)
}
}
// Borders
class YourThemeBorderProvider: OrangeThemeBorderSemanticTokensProvider {
override var styleDefault: BorderStyleSemanticToken { BorderRawTokens.styleDashed }
override var radiusLarge: BorderRadiusSemanticToken { BorderRawTokens.radius800 }
}
// Elevations
class YourThemeElevationProvider: OrangeThemeElevationSemanticTokensProvider {
override var stickyEmphasized: ElevationCompositeSemanticToken {
ElevationCompositeSemanticToken(ElevationRawTokens.bottom_4_600)
}
}
// Opacities
class YourThemeOpacityProvider: OrangeThemeOpacitySemanticTokensProvider {
override var strong: OpacitySemanticToken { OpacityRawTokens._920 }
}
// Spaces
class YourThemeSpaceProvider: OrangeThemeSpaceSemanticTokensProvider {
override var fixedMedium: SpaceSemanticToken { DimensionRawTokens._400 }
override var scaledSmall: MultipleSpaceSemanticToken {
MultipleSpaceSemanticToken(compact: fixed5xl, regular: fixed5xl)
}
}
// Sizes
class YourThemeSizeProvider: OrangeThemeSizeSemanticTokensProvider {
override var iconDecorative2xl: SizeSemanticToken { DimensionRawTokens._300 }
}
// Grids
class YourThemeGridProvider: OrangeThemeGridSemanticTokensProvider {
override var extraCompactColumnGap: GridSemanticToken { GridRawTokens.columnGap200 }
override var compactColumnGap: GridSemanticToken { GridRawTokens.columnGap200 }
override var regularColumnGap: GridSemanticToken { GridRawTokens.columnGap200 }
}
// Font (typography scale)
class YourThemeFontProvider: OrangeThemeFontSemanticTokensProvider {
override var displayLarge: MultipleFontCompositeSemanticToken {
MultipleFontCompositeSemanticToken(FontCompositeSemanticToken(
size: sizeDisplayLargeMobile,
lineHeight: lineHeightDisplayLargeMobile,
weight: weightDisplay,
letterSpacing: letterSpacingDisplayLargeMobile))
}
}
2.4 Theme class skeleton
swift
import OUDSThemesContract
import OUDSTokensRaw
class YourTheme: OUDSTheme {
static let name = "YourBrand"
override init() {
// Only instantiate providers you need to override.
// All other parameters default to the Orange equivalents.
let colors = YourThemeColorProvider()
let borders = YourThemeBorderProvider()
let fonts = YourThemeFontProvider()
// … add only the providers you override …
super.init(
colors: colors,
borders: borders,
fonts: fonts,
// Leave unspecified parameters as nil → Orange defaults are used if OrangeTheme used as super class.
name: Self.name,
tuning: Tuning.default) // see §5 for tuning options
)
}
}
All super.init parameters are optional (? = nil). Omit those you don't override.

3. Strategy B — From scratch on OUDSTheme

Warning: This requires implementing all providers — potentially hundreds of @objc open
property overrides. Use only for fully independent brands with no Orange assets.
See SoshTheme in the OUDS source as the canonical reference.
3.1 Import
swift
import OUDSThemesContract // OUDSTheme base + AllXxx protocols
import SwiftUI
import CoreText // only if registering custom fonts
3.2 Provider instantiation order

Respect dependency order — some providers take others as constructor arguments:

1. borders, colors, effects, elevations, fonts, grids, opacities
2. dimensions ← standalone
3. colorModes(colors:) ← depends on colors
4. sizes(dimensions:), spaces(dimensions:) ← depend on dimensions
5. All component providers ← depend on the semantic providers above
3.3 Full AllXxx protocol list

Semantic providers (all mandatory except ✦):

super.init parameterProtocol to implementNotes
bordersAllBorderSemanticTokensProvider
colorsAllColorSemanticTokensProvider
colorModesAllColorModeSemanticTokensProviderdepends on colors
colorsChartsAllColorChartSemanticTokensProvider✦ optional, may be nil
colorsDecorativeAllColorDecorativeSemanticTokensProvider✦ optional, may be nil
effectsAllEffectSemanticTokensProvider
elevationsAllElevationSemanticTokensProvider
fontsAllFontSemanticTokensProvider
gridsAllGridSemanticTokensProvider
opacitiesAllOpacitySemanticTokensProvider
dimensionsAllDimensionSemanticTokensProvider
sizesAllSizeSemanticTokensProviderdepends on dimensions
spacesAllSpaceSemanticTokensProviderdepends on dimensions

Component providers (all mandatory):

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
34
Repository forks
9
7-day trend score
18

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/orange-opensource/ouds-ios/ouds-ios-guide-create-theme/badge)](https://verified-skill.com/skills/orange-opensource/ouds-ios/ouds-ios-guide-create-theme)

Something wrong with this skill or its page? Tell us.