PurgeTSS Expert
Utility-first styling toolkit for Titanium/Alloy mobile apps.
Project Detection
:::info AUTO-DETECTS PURGETSS PROJECTS This skill automatically detects PurgeTSS usage when invoked and provides utility-first styling guidance.
Detection occurs automatically - no manual command needed.
PurgeTSS project indicators:
purgetss/folderpurgetss/config.cjsconfiguration filepurgetss/styles/utilities.tssutility classesapp/styles/app.tss(auto-generated)
Behavior based on detection:
- PurgeTSS detected → Provides PurgeTSS-specific guidance, recommends utility classes, suggests
$.UI.create()for dynamic components - Not detected → Does NOT suggest PurgeTSS utility classes, does NOT recommend
$.UI.create(), does NOT reference PurgeTSS-specific patterns :::
Core Workflow
- Setup:
purgetss create 'name'orpurgetss initfor existing projects - Build: Write XML with utility classes → PurgeTSS auto-generates
app.tss - Configure: Customize via
purgetss/config.cjs
Project Structure
./purgetss/
├─ fonts/ # Custom font files (.ttf, .otf)
├─ styles/
│ ├─ definitions.css # For VS Code IntelliSense
│ └─ utilities.tss # All PurgeTSS utility classes
└─ config.cjs # Theme configuration
./app/styles/
├─ app.tss # AUTO-GENERATED - DO NOT EDIT DIRECTLY
└─ _app.tss # YOUR CUSTOM STYLES (persists across runs)
Understanding app.tss vs _app.tss
:::warning CRITICAL: app.tss IS AUTO-GENERATED
app.tss is ALWAYS regenerated every time the app compiles.
PurgeTSS scans ALL XMLs and Controllers for utility classes, then generates a fresh app.tss containing only the classes actually used.
NEVER edit app.tss directly - your changes WILL be overwritten on the next build.
:::
:::info THE _app.tss BACKUP FILE
On first run, PurgeTSS backs up your original app.tss to _app.tss.
_app.tss is your custom styles file - it persists across all PurgeTSS runs.
Every build, PurgeTSS:
- Scans XMLs and Controllers for used classes
- Regenerates
app.tssfrom scratch - Copies
_app.tsscontent into the generatedapp.tss
Better approach: define custom classes in config.cjs instead of _app.tss.
:::
Checking for Unused/Unsupported Classes
:::danger ALWAYS CHECK app.tss FOR ERRORS
At the end of every generated app.tss, look for this section:
// Unused or unsupported classes
// .my-typo-class
// .non-existent-utility
These are classes used in your XMLs or Controllers that have NO definition anywhere:
- Not in
utilities.tss(generated from PurgeTSS utilities) - Not in
_app.tss(your custom styles) - Not in any other
.tssfile in thestyles/folder
This means:
- You have a typo in your class name
- You're using a class that doesn't exist in PurgeTSS
- You need to define the class in
_app.tssorconfig.cjs
As part of any analysis, ALWAYS check the end of app.tss and report any unused/unsupported classes to the user!
:::
How utilities.tss Works
:::info UTILITIES.TSS REGENERATION
./purgetss/styles/utilities.tss contains ALL available PurgeTSS utility classes.
It regenerates when ./purgetss/config.cjs changes - this is where you define:
- Custom colors
- Custom spacing scales
- Ti Element styles
- Any project-specific utilities
If a class appears in "Unused or unsupported classes" in app.tss, it means it's truly not defined anywhere - not even in your config.cjs customizations.
:::
Quick Start
purgetss create 'MyApp' -d -v fa
# -d: Install dev dependencies (ESLint, Tailwind)
# -v: Copy icon fonts (fa, mi, ms, f7)
What's New in v7.3.x
utilities.tssis the current generated utilities file (update any scripts or references that still use the old filename).- XML syntax validation now runs before processing and reports line-level errors (for example, missing
<). deviceInfo()works in both Alloy and Classic (noAlloy.isTablet/Alloy.isHandhelddependency).- Node.js 20+ is required.
- Font Awesome 7 is supported, including the new
--fa:CSS custom properties. - VS Code:
KevinYouu.tailwind-raw-reorder-tw4is recommended for class ordering. - If you hit issues after upgrading, try:
npm uninstall -g purgetss && npm install -g purgetss.
:::tip NEW PROJECT: Clean Up Default app.tss
For new projects created with purgetss create, the default app/styles/app.tss contains a large commented template.
You can safely DELETE this file - PurgeTSS will regenerate it on the first build with only the classes you actually use, and create a clean _app.tss backup.
This prevents carrying around unnecessary commented code and ensures a fresh start. :::
Critical Rules (Low Freedom)
⭐ PREFER $.UI.create() for Dynamic Components
:::tip RECOMMENDED FOR DYNAMIC COMPONENTS
When creating components dynamically in Controllers, use $.UI.create() instead of Ti.UI.create() to get full PurgeTSS utility class support:
// ✅ RECOMMENDED - Full PurgeTSS support
const view = $.UI.create('View', {
classes: ['w-screen', 'h-auto', 'bg-white', 'rounded-lg']
})
// ❌ AVOID - No PurgeTSS classes
const view = Ti.UI.createView({
width: Ti.UI.FILL,
height: Ti.UI.SIZE,
backgroundColor: '#ffffff',
borderRadius: 8
})
See Dynamic Component Creation for complete guide. :::
🚨 RESPECT USER FILES
NEVER delete any existing .tss files (like index.tss, detail.tss) or other project files without explicit user consent.
How to handle migration to PurgeTSS:
- ONLY replace custom classes with PurgeTSS utility classes if the user explicitly requests it.
- When requested:
- Analyze the definitions in the existing
.tssfiles. - Update the XML/Controller components with equivalent PurgeTSS utility classes.
- WAIT for user confirmation before suggesting or performing any file deletion.
- Analyze the definitions in the existing
- If the user prefers keeping manual
.tssfiles for specific styles, respect that choice and only use PurgeTSS for new or requested changes.
🚨 NO FLEXBOX - Titanium Doesn't Support It
:::danger FLEXBOX CLASSES DO NOT EXIST The following are NOT supported:
- ❌
flex,flex-row,flex-col - ❌
justify-between,justify-center,justify-start,justify-end - ❌
items-centerfor alignment (exists but setswidth/height: FILL)
Use Titanium layouts instead:
- ✅
horizontal- Children left to right - ✅
vertical- Children top to bottom - ✅ Omit layout class - Defaults to
composite(absolute positioning)
:::tip CRITICAL: Understanding Layout Composition When building complex UIs, carefully choose the layout mode for each container:
vertical - Stack elements top to bottom (most common):
<ScrollView class="vertical">
<View class="mb-4">Item 1</View>
<View class="mb-4">Item 2</View>
<View>Item 3</View>
</ScrollView>
horizontal - Arrange elements left to right:
<View class="horizontal w-screen">
<Label text="Left" />
<View class="w-screen" /> <!-- Spacer -->
<Label text="Right" />
</View>
composite (default) - Absolute positioning with top, left, etc.:
<View class="h-screen w-screen">
<View class="wh-12 absolute left-0 top-0 bg-red-500" />
<View class="wh-12 absolute bottom-0 right-0 bg-blue-500" />
</View>
Common Issue: If you see elements appearing in unexpected positions (e.g., a header bar "behind" content), check if parent containers have conflicting layout modes. Each container's layout affects its direct children only. :::
🚨 PLATFORM-SPECIFIC PROPERTIES REQUIRE MODIFIERS
:::danger CRITICAL: Platform-Specific Properties Require Modifiers
Using Ti.UI.iOS.* or Ti.UI.Android.* properties WITHOUT platform modifiers causes cross-platform compilation failures.
WRONG - Adds iOS code to Android (causes failure):
// ❌ BAD - Adds Ti.UI.iOS to Android project
"#mainWindow": {
statusBarStyle: Ti.UI.iOS.StatusBar.LIGHT_CONTENT
}
CORRECT - Use platform modifiers in TSS:
// ✅ GOOD - Only adds to iOS
"#mainWindow[platform=ios]": {
statusBarStyle: Ti.UI.iOS.StatusBar.LIGHT_CONTENT
}
OR use PurgeTSS platform modifier classes:
<!-- ✅ GOOD - Platform-specific classes -->
<Window class="ios:status-bar-light android:status-bar-dark">
Properties that ALWAYS require platform modifiers:
- iOS:
statusBarStyle,modalStyle,modalTransitionStyle,systemButton - Android:
actionBarconfiguration - ANY
Ti.UI.iOS.*,Ti.UI.Android.*constant
When suggesting platform-specific code:
- Check if user's project supports that platform
- ALWAYS use
[platform=ios]or[platform=android]TSS modifier - OR use PurgeTSS platform classes like
ios:bg-blue-500
For complete reference on platform modifiers, see Platform Modifiers. :::
Other Mandatory Rules
- NO
p-padding classes: Titanium does NOT support a nativepaddingproperty onView,Window,ScrollView, orTableView. Always use margins on children (m-) to simulate internal spacing. - View defaults to
SIZE: Usew-screen/h-screento fill space when needed. rounded-full: To get a perfect circle, userounded-full-XX(where XX is the width/height of the square element).rounded-full-XXincludes size: These classes already setwidth,height, andborderRadius. Do not addw-XX h-XX/wh-XXunless you need to override.m-xxon FILL elements: Addingm-4to aw-screenelement pins it to all four edges (top, bottom, left, right). This will stretch the component vertically to fill the parent unless you explicitly addh-auto(Ti.UI.SIZE) to constrain it to its content.w-XX+h-XX→wh-XX: If both width and height use the same scale value, prefer a singlewh-XX(order doesn't matter:w-10 h-10andh-10 w-10are equivalent).- Use
wh-shortcuts: PurgeTSS provides a complete scale of combined width/height utilities:- Numeric Scale:
wh-0towh-96(e.g.,wh-16sets both to 64px). - Fractions:
wh-1/2,wh-3/4, up towh-11/12for proportional sizing. - Special Values:
wh-auto(explicitSIZE),wh-full(100%), andwh-screen(FILL). - Using these instead of separate
w-andh-classes improves XML readability and reduces generated TSS size.
- Numeric Scale:
:::tip LAYOUT TIP: EDGE PINNING
If opposite margins cause a Label or Button to stretch unexpectedly, it is due to Titanium's Edge Pinning rule (2 opposite pins = computed dimension).
-
mt-*+mb-*ormy-*can stretch the component vertically. Addh-auto. -
ml-*+mr-*ormx-*can stretch the component horizontally. Addw-auto. -
If margins affect both axes, use
wh-autoto forceSIZEfor both width and height. ::: -
NEVER add
compositeclass explicitly - That's the default, usehorizontal/verticalwhen needed -
Arbitrary values use parentheses:
w-(100px),bg-(#ff0000)- NO square brackets -
mode: 'all'required inconfig.cjsfor Ti Elements styling -
Classes use
kebab-case:.my-class, IDs usecamelCase:#myId
Common Anti-Patterns
WRONG:
<View class="flex-row justify-between"> <!-- Flexbox doesn't exist -->
<View class="p-4"> <!-- No padding on Views -->
<View class="composite"> <!-- Never add composite explicitly -->
CORRECT:
<View class="horizontal">
<View class="m-4"> <!-- Use margins on children -->
<View> <!-- Omit layout = composite by default -->
WRONG (Dynamic Components):
// Manual styling with Ti.UI.create()
const view = Ti.UI.createView({
width: Ti.UI.FILL,
backgroundColor: '#fff',
borderRadius: 8
})
CORRECT (Dynamic Components):
// PurgeTSS classes with $.UI.create()
const view = $.UI.create('View', {
classes: ['w-screen', 'bg-white', 'rounded-lg']
})
Class Verification Workflow
:::danger CRITICAL: VERIFY CLASSES BEFORE SUGGESTING NEVER guess or hallucinate classes based on other CSS Frameworks knowledge!
PurgeTSS shares naming with some CSS Frameworks but has DIFFERENT classes for Titanium. Always verify a class exists before suggesting it. :::
Verification Steps
-
Check if it's a KNOWN anti-pattern
- See PROHIBITED Classes
- Common mistakes:
flex-row,justify-between,p-4on Views (p-* not supported on Views)
-
Check the Class Index
- See Class Index for available patterns
- Constant properties like
keyboard-type-*,return-key-type-*have dedicated classes
-
Search the project when unsure
# Search for a class pattern in the project's utilities.tss grep -E "keyboard-type-" ./purgetss/styles/utilities.tss grep -E "return-key-type-" ./purgetss/styles/utilities.tss grep -E "^'bg-" ./purgetss/styles/utilities.tss -
After making changes
- Check
app.tssfor "Unused or unsupported classes" section at the end - Report any typos or non-existent classes to the user
- Check
What HAS Classes vs What DOESN'T
| Has Classes in PurgeTSS | Does NOT Have Classes |
|---|---|
keyboard-type-email | hintText (use attribute) |
return-key-type-next | passwordMask (use attribute) |
text-center | autocorrect (use attribute) |
bg-blue-500 | autocapitalization (use attribute) |
w-screen | flex-row → use horizontal |
wh-16 | justify-between → use margins |
rounded-lg | w-full → use w-screen |
m-4, gap-4 | p-4 on View → use m-4 on children |
:::tip When in doubt, prefer using the search command above to verify. It's better to spend 5 seconds verifying than suggesting a class that doesn't exist and will appear in the "unused classes" warning. :::
Reference Guides
Load these only when needed:
Essential References
- Class Index - Quick patterns, prohibited classes, verification commands (LOAD FIRST when unsure about a class)
- Dynamic Component Creation -
$.UI.create()andAlloy.createStyle()for creating components in Controllers (READ FIRST for dynamic components)
Setup & Configuration
- Installation & Setup - First run, VS Code, LiveView
- CLI Commands - All
purgetsscommands - Migration Guide - Migrating existing apps from manual TSS to PurgeTSS
Customization
- Deep Customization - config.cjs, colors, spacing, Ti Elements
- Custom Rules - Styling Ti Elements, IDs, classes
- Apply Directive - Extracting utility combinations
- Configurable Properties - All 80+ customizable properties
Layout & Styling
- UI/UX Design Patterns - Complete guide to mobile UI components with PurgeTSS (cards, lists, forms, buttons, navigation, modals, accessibility)
- Grid Layout System - 12-column grid, responsive layouts
- Smart Mappings - How gap, shadows, and grid work under the hood
- Arbitrary Values - Parentheses notation for custom values
- Platform Modifiers - ios:, android:, tablet:, handheld:
- Opacity Modifier - Color transparency with /50 syntax
- Titanium Resets - Default styles for Ti elements
Performance
- Performance Tips - Optimizing PurgeTSS apps (bridge crossings, ListView, animations)
Components
- TiKit UI Components - Ready-to-use Alerts, Avatars, Buttons, Cards, Tabs built with PurgeTSS
Fonts & Animations
- Icon Fonts - Font Awesome 7, Material Icons, custom icon libraries
- Animation Component - Declarative
<Animation>API
:::tip TEXT FONTS (Google Fonts, Roboto, etc.) For text fonts, see CLI Commands → build-fonts. :::
Examples
For complete WRONG vs CORRECT examples including:
- Titanium layout patterns (horizontal, vertical, composite)
- Grid with percentages
- Gap usage
- Manual .tss anti-patterns
- Dynamic component creation with
$.UI.create()andAlloy.createStyle()
See EXAMPLES.md and Dynamic Component Creation
Related Skills
For tasks beyond styling, use these complementary skills:
| Task | Use This Skill |
|---|---|
| Project architecture, services, controllers | ti-expert |
| Complex UI components, ListViews, gestures | ti-ui |
| Alloy MVC concepts, data binding, TSS syntax | alloy-guides |
| Native features (camera, location, push) | ti-howtos |