PurgeTSS Expert
Utility-first styling toolkit for Titanium/Alloy mobile apps.
Project Detection
️ℹ️ 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
⚠️ CRITICAL: app.tss IS AUTO-GENERATED
app.tssis ALWAYS regenerated every time the app compiles.PurgeTSS scans ALL XMLs and Controllers for utility classes, then generates a fresh
app.tsscontaining only the classes actually used.NEVER edit
app.tssdirectly - your changes WILL be overwritten on the next build.
️ℹ️ THE
_app.tssBACKUP FILE On first run, PurgeTSS backs up your originalapp.tssto_app.tss.
_app.tssis 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.tssBetter approach: define custom classes in
config.cjsinstead of_app.tss.
Checking for Unused/Unsupported Classes
🚨 ALWAYS CHECK
app.tssFOR ERRORS At the end of every generatedapp.tss, look for this section:// Unused or unsupported classes // .my-typo-class // .non-existent-utilityThese 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/folderThis 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.cjsAs part of any analysis, ALWAYS check the end of
app.tssand report any unused/unsupported classes to the user!
How utilities.tss Works
️ℹ️ UTILITIES.TSS REGENERATION
./purgetss/styles/utilities.tsscontains ALL available PurgeTSS utility classes.It regenerates when
./purgetss/config.cjschanges - 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 yourconfig.cjscustomizations.
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.5.0
extendsupport for Window, View, and ImageView inconfig.cjs- Shorthand
applydirective normalization - Apply directive property deduplication
- Automatic platform resolution in apply directives
- Updated Font Awesome to 7.2.0
- Fixed:
extend.Windowwas silently ignored - Fixed: Array-type properties (
extendEdges,mediaTypes) bracket notation
What's New in v7.4.0
- 9 new Animation methods:
transition,pulse,sequence,swap,shake,snapTo,reorder,undraggable,detectCollisions(module now has 15 methods total) - Snap behavior classes:
snap-back,snap-center,snap-magnet keep-z-indexutility class- Enriched callback event object with
action,state,id,targetId,index,total,getTarget() - Delta-based drag for views with rotate/scale transforms
- Position normalization for draggable views
- Property inheritance from Animation object for all new methods
💡 NEW PROJECT: Clean Up Default app.tss For new projects created with
purgetss create, the defaultapp/styles/app.tsscontains 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.tssbackup.This prevents carrying around unnecessary commented code and ensures a fresh start.
Critical Rules (Low Freedom)
⭐ PREFER $.UI.create() for Dynamic Components
💡 RECOMMENDED FOR DYNAMIC COMPONENTS When creating components dynamically in Controllers, use
$.UI.create()instead ofTi.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
🚨 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)💡 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 withtop,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
🚨 CRITICAL: Platform-Specific Properties Require Modifiers Using
Ti.UI.iOS.*orTi.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.*constantWhen 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-500For 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.💡 LAYOUT TIP: EDGE PINNING If opposite margins cause a
Label,Button, orSwitchto stretch unexpectedly, it is due to Titanium's Edge Pinning rule (2 opposite pins = computed dimension). This applies to any component whose default size isTi.UI.SIZE.
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.<!-- WRONG: my-1 creates vertical pins → Switch stretches to fill parent height --> <Switch class="my-1 mr-2" /> <!-- CORRECT: h-auto prevents vertical stretch --> <Switch class="my-1 mr-2 h-auto" /> <Label class="my-1 ml-2 h-auto" text="Option" />
- NEVER add
compositeclass explicitly - That's the default, usehorizontal/verticalwhen needed- Arbitrary values use parentheses:
w-(100px),bg-(#ff0000)- NO square bracketsmode: 'all'required inconfig.cjsfor Ti Elements styling- Classes use
kebab-case:.my-class, IDs usecamelCase:#myIdCommon 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
🚨 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 classesSearch 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.tssAfter making changes
- Check
app.tssfor "Unused or unsupported classes" section at the end- Report any typos or non-existent classes to the user
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→ usehorizontal| |wh-16|justify-between→ use margins | |rounded-lg|w-full→ usew-screen| |m-4,gap-4|p-4on View → usem-4on 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 - Naming conventions, 416-property table, prohibited classes, verification commands (LOAD FIRST when unsure about a class)
- Class Categories - Complete prefix inventory by category (layout, colors, typography, states, etc.)
- 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 System - 15 methods including collision detection, transitions, and sequential animations
- Animation Advanced - Property inheritance, utility classes, implementation rules, complex UI example
💡 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|