@maccesar/titools 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/package.json +1 -1
  2. package/skills/purgetss/SKILL.md +36 -0
  3. package/skills/purgetss/references/EXAMPLES.md +86 -24
  4. package/skills/purgetss/references/app-branding.md +554 -0
  5. package/skills/purgetss/references/appearance-module.md +161 -0
  6. package/skills/purgetss/references/apply-directive.md +87 -31
  7. package/skills/purgetss/references/arbitrary-values.md +4 -0
  8. package/skills/purgetss/references/class-categories.md +10 -7
  9. package/skills/purgetss/references/class-index.md +25 -18
  10. package/skills/purgetss/references/cli-commands.md +309 -8
  11. package/skills/purgetss/references/configurable-properties.md +11 -7
  12. package/skills/purgetss/references/custom-rules.md +7 -3
  13. package/skills/purgetss/references/customization-deep-dive.md +73 -4
  14. package/skills/purgetss/references/dynamic-component-creation.md +29 -14
  15. package/skills/purgetss/references/grid-layout.md +20 -8
  16. package/skills/purgetss/references/icon-fonts.md +4 -0
  17. package/skills/purgetss/references/installation-setup.md +3 -8
  18. package/skills/purgetss/references/ios-large-titles.md +141 -0
  19. package/skills/purgetss/references/migration-guide.md +162 -25
  20. package/skills/purgetss/references/multi-density-images.md +363 -0
  21. package/skills/purgetss/references/opacity-modifier.md +4 -0
  22. package/skills/purgetss/references/performance-tips.md +5 -0
  23. package/skills/purgetss/references/platform-modifiers.md +4 -0
  24. package/skills/purgetss/references/semantic-colors.md +386 -0
  25. package/skills/purgetss/references/smart-mappings.md +50 -28
  26. package/skills/purgetss/references/tikit-components.md +3 -1
  27. package/skills/purgetss/references/titanium-resets.md +46 -15
  28. package/skills/purgetss/references/ui-ux-design.md +32 -6
  29. package/skills/purgetss/references/values-and-units.md +120 -0
@@ -2,9 +2,6 @@
2
2
 
3
3
  The grid system is a small layout tool that lets you build rows and columns with utility classes.
4
4
 
5
- > **WARNING**
6
- > PurgeTSS grid is not CSS Grid. It is a Titanium-oriented layout helper built around horizontal and vertical layout behavior.
7
-
8
5
  The snippet below shows the simplest layout. From there, you can mix columns and rows as needed.
9
6
 
10
7
  ```xml
@@ -85,10 +82,25 @@ These are the available utilities to control the grid.
85
82
 
86
83
  Control horizontal alignment of elements within a row:
87
84
 
88
- | Class | Effect | Use case |
89
- | --- | --- | --- |
90
- | `start` | Align to the start of the row | Left-aligned content |
91
- | `end` | Align to the end of the row | Right-aligned buttons or labels |
92
- | `center` | Align to the center of the row | Centered content blocks |
85
+ | Class | Effect |
86
+ | --- | --- |
87
+ | `start` | Align to the start of the row |
88
+ | `end` | Align to the end of the row |
89
+ | `center` | Align to the center of the row |
93
90
 
94
91
  These apply to child views inside a `grid-cols-*` container and control horizontal placement within the grid cell.
92
+
93
+ ## Community-Discovered Patterns
94
+
95
+ The following notes come from community experience using the PurgeTSS grid system in Titanium projects. They clarify how the grid relates to Titanium's layout engine (not CSS Grid) and offer common use cases for row placement.
96
+
97
+ > **WARNING**
98
+ > PurgeTSS grid is not CSS Grid. It is a Titanium-oriented layout helper built around horizontal and vertical layout behavior.
99
+
100
+ ### Common Use Cases for Row Placement
101
+
102
+ | Class | Use case |
103
+ | --- | --- |
104
+ | `start` | Left-aligned content |
105
+ | `end` | Right-aligned buttons or labels |
106
+ | `center` | Centered content blocks |
@@ -166,5 +166,9 @@ exports.icons = icons;
166
166
  > **DANGER**
167
167
  > Make sure the new prefix remains unique to avoid conflicts with other class prefixes.
168
168
 
169
+ ## Community-Discovered Patterns
170
+
171
+ The following note reflects community experience working with icon fonts that depend on multiple glyphs per icon.
172
+
169
173
  > **Font Awesome Duotone**
170
174
  > Titanium cannot render Font Awesome duotone icons correctly because each icon uses two glyphs. If you work with Font Awesome Pro, avoid documenting duotone as supported.
@@ -12,16 +12,11 @@ Install PurgeTSS globally on your machine using [NPM](https://www.npmjs.com/).
12
12
  > Node.js 20+ required.
13
13
  > PurgeTSS requires Node 20.0.0 or higher.
14
14
 
15
- ## Upgrade Notes
15
+ ## XML Validation
16
16
 
17
- - `utilities.tss` is the generated utilities file. Update any scripts or docs that still use the previous output filename.
18
- - `deviceInfo()` now works in Alloy and Classic Titanium projects.
19
- - If an upgrade behaves unexpectedly, a clean reinstall is the recommended recovery step:
17
+ PurgeTSS v7.5.3 added XML validation that flags any `--` (double-dash) sequence inside XML comments. Titanium's XML parser treats `--` in comments as invalid, and PurgeTSS now detects those sequences before they break the compile step.
20
18
 
21
- ```bash
22
- npm uninstall -g purgetss
23
- npm install -g purgetss
24
- ```
19
+ If you see a validation warning from PurgeTSS pointing at a view file, replace the offending comment with an alternative marker (for example, `//` or `==`) and re-run the build.
25
20
 
26
21
  ## Run PurgeTSS the First Time
27
22
 
@@ -0,0 +1,141 @@
1
+ # iOS Large Titles
2
+
3
+ Enabling Large Titles on a Window is not a single-property change. When you pair `largeTitleEnabled` with a `ScrollView` inside a `NavigationWindow` or `TabGroup`, **three interdependent iOS Window properties** must work together — otherwise you get either content hidden behind the nav bar or a visible rendering delay when the window opens.
4
+
5
+ | Property | Value | Why it matters |
6
+ | --- | --- | --- |
7
+ | `autoAdjustScrollViewInsets` | `true` | iOS automatically adjusts the ScrollView content insets so content starts below the nav bar instead of behind it. |
8
+ | `extendEdges` | `[Ti.UI.EXTEND_EDGE_ALL]` | Content extends under the nav/tab bars, producing the translucent blur effect Large Titles depend on. |
9
+ | `largeTitleEnabled` | `true` | Shows the large title that collapses to the standard nav bar title as the user scrolls. |
10
+
11
+ Using only `largeTitleEnabled` causes the nav bar region to render empty for a moment before the title draws. Using `extendEdges` without `autoAdjustScrollViewInsets` pushes content behind the nav bar without compensating the ScrollView insets. All three must be present.
12
+
13
+ ## iOS-only — use the `ios:` modifier
14
+
15
+ Large Title properties are iOS-only. On Android they either do nothing or raise compile-time errors. Always scope them with the `ios:` platform block in `config.cjs`, not as defaults that leak to Android.
16
+
17
+ ## Global defaults in `config.cjs`
18
+
19
+ Rather than repeating the three classes on every `Window`, set them once at the Ti Element level so every iOS Window inherits the base behavior:
20
+
21
+ `./purgetss/config.cjs`
22
+ ```js
23
+ module.exports = {
24
+ theme: {
25
+ Window: {
26
+ ios: {
27
+ apply: 'auto-adjust-scroll-view-insets extend-edges-all large-title-enabled'
28
+ }
29
+ }
30
+ }
31
+ };
32
+ ```
33
+
34
+ Generated style in `./purgetss/styles/utilities.tss`:
35
+
36
+ ```tss
37
+ 'Window[platform=ios]': { autoAdjustScrollViewInsets: true, extendEdges: [ Ti.UI.EXTEND_EDGE_ALL ], largeTitleEnabled: true }
38
+ ```
39
+
40
+ Individual windows now only need to override `largeTitleDisplayMode` when they want different collapse behavior (e.g. detail windows).
41
+
42
+ > **Why an `ios:` block and not an inline `ios:` prefix?** `auto-adjust-scroll-view-insets` and `extend-edges-all` are platform-specific classes — they only exist with `[platform=ios]` suffix in `utilities.tss`. The `ios:` block ensures PurgeTSS resolves the platform-suffixed version. See [apply-directive.md](apply-directive.md) → "Platform-Specific Classes".
43
+
44
+ ## NavigationWindow example
45
+
46
+ `./app/views/index.xml`
47
+ ```xml
48
+ <Alloy>
49
+ <NavigationWindow id="navWin">
50
+ <Window title="Home">
51
+ <ScrollView class="vertical content-w-screen content-h-auto">
52
+ <!-- Content starts below the nav bar automatically -->
53
+ </ScrollView>
54
+ </Window>
55
+ </NavigationWindow>
56
+ </Alloy>
57
+ ```
58
+
59
+ The Window inherits `auto-adjust-scroll-view-insets`, `extend-edges-all`, and `large-title-enabled` from the `theme.Window.ios.apply` defaults above.
60
+
61
+ ## TabGroup example
62
+
63
+ On iOS, `TabGroup` wraps each `Tab`'s Window in an **implicit NavigationWindow**. You do not declare the inner `NavigationWindow` yourself — iOS adds it. The three-property pattern applies identically:
64
+
65
+ `./app/views/index.xml`
66
+ ```xml
67
+ <Alloy>
68
+ <TabGroup>
69
+ <Tab title="Home">
70
+ <Window title="Home">
71
+ <ScrollView class="vertical content-w-screen content-h-auto">
72
+ <!-- Each tab gets its own implicit NavigationWindow -->
73
+ </ScrollView>
74
+ </Window>
75
+ </Tab>
76
+ </TabGroup>
77
+ </Alloy>
78
+ ```
79
+
80
+ ## Controlling the collapse behavior: `largeTitleDisplayMode`
81
+
82
+ `largeTitleDisplayMode` controls how the title behaves in the navigation stack:
83
+
84
+ | Mode | Constant | Behavior |
85
+ | --- | --- | --- |
86
+ | Automatic | `Ti.UI.iOS.LARGE_TITLE_DISPLAY_MODE_AUTOMATIC` | Inherits from previous window; collapses on scroll. |
87
+ | Always | `Ti.UI.iOS.LARGE_TITLE_DISPLAY_MODE_ALWAYS` | Title stays large regardless of scroll position. |
88
+ | Never | `Ti.UI.iOS.LARGE_TITLE_DISPLAY_MODE_NEVER` | Always uses the standard (small) title size. |
89
+
90
+ ### Detail windows: use `large-title-display-mode-never`
91
+
92
+ Detail windows typically should not show a large title — it looks oversized for a secondary screen. PurgeTSS ships a utility class for this:
93
+
94
+ ```xml
95
+ <Window class="large-title-display-mode-never" title="Detail">
96
+ <!-- Standard nav bar title, regardless of global largeTitleEnabled default -->
97
+ </Window>
98
+ ```
99
+
100
+ This overrides only the display mode, so the window still benefits from the inherited `autoAdjustScrollViewInsets` and `extendEdges` defaults.
101
+
102
+ ## ScrollView pairing: `content-w-screen content-h-auto`
103
+
104
+ When Large Titles are active, the paired ScrollView needs its content area sized so iOS can shrink/grow the title as the user scrolls. The canonical pattern:
105
+
106
+ ```xml
107
+ <ScrollView class="vertical content-w-screen content-h-auto">
108
+ <!-- children -->
109
+ </ScrollView>
110
+ ```
111
+
112
+ - `content-w-screen` → `contentWidth: Ti.UI.FILL`
113
+ - `content-h-auto` → `contentHeight: Ti.UI.SIZE`
114
+
115
+ Sizing the content height to `Ti.UI.SIZE` is what lets iOS determine whether there is enough content to allow the large title to collapse on scroll.
116
+
117
+ ## Quick reference — class to property map
118
+
119
+ | Class | Property | Value |
120
+ | --- | --- | --- |
121
+ | `auto-adjust-scroll-view-insets` | `autoAdjustScrollViewInsets` | `true` |
122
+ | `extend-edges-all` | `extendEdges` | `[Ti.UI.EXTEND_EDGE_ALL]` |
123
+ | `large-title-enabled` | `largeTitleEnabled` | `true` |
124
+ | `large-title-enabled-false` | `largeTitleEnabled` | `false` |
125
+ | `large-title-display-mode-never` | `largeTitleDisplayMode` | `Ti.UI.iOS.LARGE_TITLE_DISPLAY_MODE_NEVER` |
126
+ | `content-w-screen` | `contentWidth` | `Ti.UI.FILL` |
127
+ | `content-h-auto` | `contentHeight` | `Ti.UI.SIZE` |
128
+
129
+ ## Community-Discovered Patterns
130
+
131
+ ### TabGroup implicit-NavigationWindow wrapping
132
+
133
+ A recurring source of confusion: iOS `TabGroup` already wraps each `Tab` in an implicit `NavigationWindow`. Manually nesting a `NavigationWindow` inside a `Tab` can produce a double nav bar or break `openWindow()` push transitions. Keep the markup flat — `Tab > Window` — and rely on the implicit wrapper.
134
+
135
+ ### Detail windows should opt out, not opt in
136
+
137
+ When `theme.Window.ios.apply` sets `large-title-enabled` as a default, every pushed window inherits it. Apply `large-title-display-mode-never` on detail windows pushed via `openWindow()` so the parent keeps the collapse animation while detail screens render with a standard title. This mirrors Apple's own first-party app conventions (Settings, Mail).
138
+
139
+ ### Cross-reference
140
+
141
+ The three-property pairing (`autoAdjustScrollViewInsets` + `extendEdges` + `largeTitleEnabled`) is also documented as a reusable global-defaults recipe in [apply-directive.md](apply-directive.md) under *Community-Discovered Patterns → Global Window defaults for Large Titles + ScrollView (iOS)*. Prefer that recipe over per-window repetition whenever the whole app uses Large Titles.
@@ -1,52 +1,138 @@
1
1
  # Migration Guide
2
2
 
3
- This guide is based on the PurgeTSS changelog sections in the official `README.md`. It covers the documented upgrade changes for recent versions.
3
+ This guide mirrors the official PurgeTSS changelog (see the project `README.md` / `docs/index.md`). It walks through the upgrade-relevant changes from v7.2.6 through v7.6.0, flags breaking changes, and links each section to the reference files that cover the new surface area in depth.
4
4
 
5
- ## Upgrade to v7.4.0
5
+ Changelog source of truth: [https://github.com/macCesar/purgeTSS](https://github.com/macCesar/purgeTSS).
6
+
7
+ ---
8
+
9
+ ## Upgrade to v7.6.0
10
+
11
+ v7.6.0 introduces three new CLI commands for app-asset generation plus two new `config.cjs` sections. None of the additions are breaking — existing projects continue to work untouched, and the new config sections are auto-injected on first run.
12
+
13
+ ### New CLI commands
14
+
15
+ - **`brand` command** — generates the complete Titanium branding set (launcher icons, adaptive icons, iOS 18+ Dark and Tinted variants, marketplace artwork, optional notification and splash images) from logos auto-discovered in `./purgetss/brand/`. Works on both Alloy and Classic projects.
16
+ - **`images` command** — generates multi-density UI images (Android `res-*` densities plus iPhone `@1x` / `@2x` / `@3x` scales) from sources dropped into `./purgetss/images/`. Subdirectories are preserved, and short-path scope targeting lets you re-process individual files.
17
+ - **`semantic` command** — generates Titanium semantic colors (Light/Dark mode) into `app/assets/semantic.colors.json`. Two dispatch modes:
18
+ - **Tonal palette** (default): one base hex → 11 shades with mirror inversion and auto config mapping.
19
+ - **Single purpose-based color** (`--single`): explicit per-mode hex plus optional alpha; writes both the JSON entry AND a class mapping in `config.cjs` in one shot. Class name is auto-derived by stripping the `Color` suffix (e.g. `surfaceColor` → class `surface`). Smart in-place updates when a single name matches an existing palette shade.
20
+
21
+ ### New `config.cjs` sections
22
+
23
+ - **`brand:` section** — configures padding percentages, background colors, and platform targets for the `brand` command.
24
+ - **`images:` section** — configures scale factors and output density mapping for the `images` command.
25
+
26
+ Percentages can be written as self-documenting strings (e.g. `'15%'`) or plain numbers. Both are accepted. These sections are auto-injected into older `config.cjs` files on the first run of v7.6.0.
27
+
28
+ ### What to review
29
+
30
+ - If you previously generated app icons or multi-density images manually (or with third-party tooling), plan a migration session to replace that workflow with `brand` and `images`.
31
+ - If you maintain a `semantic.colors.json` by hand, back it up before running `semantic` — the command does smart in-place updates, but a backup is cheap insurance.
32
+
33
+ ### Cross-references
34
+
35
+ - [`app-branding.md`](./app-branding.md) — full walkthrough of the `brand` command and the `./purgetss/brand/` convention.
36
+ - [`multi-density-images.md`](./multi-density-images.md) — `images` command, density mapping, and subdirectory behavior.
37
+ - [`semantic-colors.md`](./semantic-colors.md) — palette vs single-color modes, alpha handling, and config mapping.
38
+ - [`cli-commands.md#brand-command`](./cli-commands.md#brand-command)
39
+ - [`cli-commands.md#images-command`](./cli-commands.md#images-command)
40
+ - [`cli-commands.md#semantic-command`](./cli-commands.md#semantic-command)
41
+
42
+ ---
43
+
44
+ ## Upgrade to v7.5.3
45
+
46
+ v7.5.3 is a feature-and-polish release. No breaking changes.
6
47
 
7
- PurgeTSS v7.4.0 includes a bug fix and documentation improvements.
48
+ ### Added
49
+
50
+ - **Appearance module** — a new `Appearance` export for Light/Dark/System mode switching with persistence. Exposed methods: `init()`, `set(mode)`, `get()`, `toggle()`.
51
+ - **Default font family classes** — `font-sans`, `font-serif`, and `font-mono` are generated automatically with platform-appropriate values (system sans, serif, and monospace stacks for iOS and Android).
52
+ - **XML validation** — the pre-validation pass now detects illegal `--` sequences inside XML comments, which previously produced cryptic downstream errors.
53
+
54
+ ### What to review
55
+
56
+ - If you want runtime theme switching, wire up `Appearance.init()` at app boot and use `Appearance.toggle()` or `Appearance.set('dark')` where the UI exposes the control.
57
+ - If you had custom `font-sans` / `font-serif` / `font-mono` classes in `config.cjs`, check for collisions with the new auto-generated ones.
58
+
59
+ ### Cross-references
60
+
61
+ - [`appearance-module.md`](./appearance-module.md) — full `Appearance` API, persistence behavior, and integration patterns.
62
+
63
+ ---
64
+
65
+ ## Upgrade to v7.5.0
66
+
67
+ v7.5.0 adds `extend` support for component defaults and improves how `apply` directives are normalized. It also bumps Font Awesome. No breaking changes.
68
+
69
+ ### Added
70
+
71
+ - **`extend` support for Window, View, and ImageView** — customize component defaults from `theme.extend` in `config.cjs`. Previously only a subset of components supported `extend`.
72
+ - **Shorthand `apply`** — `{ apply: '...' }` is automatically normalized, so the `default:` wrapper is now optional.
73
+ - **Property deduplication** — values pulled in via `apply` now win over static defaults instead of producing duplicate property entries in the generated TSS.
74
+ - **Automatic platform resolution** — classes referenced inside `ios:` / `android:` blocks automatically find their platform-specific version instead of requiring explicit disambiguation.
75
+ - **Font Awesome 7.2.0** bundled.
8
76
 
9
77
  ### Fixed
10
78
 
11
- - `backgroundGradient.colors` serialization now correctly handles arrays of objects in custom rules.
79
+ - `extend.Window` was silently ignored in earlier versions now honored.
80
+ - Duplicate `font` properties in generated output.
81
+ - Array-type properties generating output without `[ ]` notation.
12
82
 
13
- Before the fix, a config such as:
83
+ ### What to review
14
84
 
15
- ```javascript
16
- colors: [
17
- { color: '#132C50', offset: 0 },
18
- { color: '#0A1529', offset: 1 }
19
- ]
20
- ```
85
+ - If you previously worked around the `extend.Window` bug with manual TSS overrides, you can remove those now.
86
+ - If you previously wrote `{ default: { apply: '...' } }`, the shorter `{ apply: '...' }` form is equivalent.
87
+ - Diff your generated `utilities.tss` against the pre-upgrade version: property deduplication and the array-notation fix may produce cleaner output, which is expected.
88
+
89
+ ### Cross-references
21
90
 
22
- could produce broken output in `utilities.tss`.
91
+ - [`customization-deep-dive.md`](./customization-deep-dive.md) `theme.extend` patterns for Window, View, and ImageView defaults.
92
+ - [`apply-directive.md`](./apply-directive.md) — shorthand `apply` syntax and deduplication behavior.
23
93
 
24
- Now it serializes correctly.
94
+ ---
25
95
 
26
- ### What to Review
96
+ ## Upgrade to v7.4.0
27
97
 
28
- - Re-test any custom classes that define `backgroundGradient.colors` with `{ color, offset }` objects.
29
- - Rebuild and inspect `utilities.tss` if you previously worked around this bug manually.
98
+ v7.4.0 is the **Animation module expansion**. Nine new methods bring the Animation module to 15 total.
99
+
100
+ ### Added
101
+
102
+ - **New methods**: `transition`, `pulse`, `sequence`, `swap`, `shake`, `snapTo`, `reorder`, `undraggable`, `detectCollisions`.
103
+ - **New utility classes**: `snap-back`, `snap-center`, `snap-magnet`, `keep-z-index`.
104
+ - **Delta-based drag for transformed views** — drag math now works correctly when the view already has a 2D transform applied.
105
+ - **Position normalization** and **property inheritance** from the Animation object — reduces boilerplate when sequencing multiple animations on the same view.
106
+
107
+ ### What to review
108
+
109
+ - If you previously hand-rolled sequential animations with `Ti.UI.createAnimation` callbacks, consider porting them to `sequence` for readability.
110
+ - If you implemented ad-hoc drag/snap logic, compare it with `snapTo` + `detectCollisions` — the new pipeline handles z-index, collision detection, and snap-back without manual bookkeeping.
111
+
112
+ ### Cross-references
113
+
114
+ - [`animation-system.md`](./animation-system.md) — full Animation module reference including all 15 methods and the snap / drag / collision utilities.
115
+
116
+ ---
30
117
 
31
118
  ## Upgrade to v7.3.x
32
119
 
33
- PurgeTSS v7.3 introduced a file rename and improved error handling.
120
+ v7.3.0 introduced a **breaking file rename** plus XML validation and Classic Titanium compatibility improvements.
34
121
 
35
122
  ### Breaking Changes
36
123
 
37
- - The generated utilities output is now `utilities.tss`.
124
+ - **`tailwind.tss` → `utilities.tss`** — the generated utilities output was renamed to reflect that PurgeTSS is a standalone toolkit, not a Tailwind port.
38
125
  - Generated file: `purgetss/styles/utilities.tss`
39
126
  - Distribution file: `dist/utilities.tss`
40
127
 
41
128
  ### Major Improvements
42
129
 
43
- - XML syntax validation now catches malformed Alloy XML before processing.
44
- - `deviceInfo()` now works in both Alloy and Classic Titanium projects.
45
- - The dependency on `Alloy.isTablet` and `Alloy.isHandheld` was removed.
130
+ - **XML syntax validation** — pre-validation now catches malformed Alloy XML before processing, with line numbers and fix suggestions.
131
+ - **Classic Titanium compatibility** — `deviceInfo()` now works in both Alloy and Classic projects. The dependency on `Alloy.isTablet` and `Alloy.isHandheld` was removed.
46
132
 
47
133
  ### Required Actions
48
134
 
49
- 1. Update any scripts, docs, or project references that still point to the previous output filename.
135
+ 1. Update any scripts, docs, or project references that still point to the previous `tailwind.tss` filename.
50
136
  2. Ensure your environment is running Node.js 20 or higher.
51
137
  3. If you use Font Awesome 7, verify the project after upgrade so PurgeTSS can handle the new `--fa:` properties.
52
138
 
@@ -55,7 +141,7 @@ PurgeTSS v7.3 introduced a file rename and improved error handling.
55
141
  purgetss/styles/utilities.tss
56
142
  ```
57
143
 
58
- ### Recommended Upgrade Command
144
+ ### Recommended upgrade command
59
145
 
60
146
  ```bash
61
147
  npm install -g purgetss@latest
@@ -68,9 +154,60 @@ npm uninstall -g purgetss
68
154
  npm install -g purgetss
69
155
  ```
70
156
 
157
+ ---
158
+
159
+ ## Upgrade to v7.2.7
160
+
161
+ v7.2.7 is a security and maintenance release.
162
+
163
+ ### Added / Updated
164
+
165
+ - **Security fixes** — command injection in `glob`, prototype pollution in `js-yaml`.
166
+ - **Dependency cleanup** — reduces installation size by ~45MB, removed unused packages.
167
+ - **Titanium SDK 13.1.0.GA** — new utility classes for `navBarColor`, `forceBottomPosition`, `multipleWindows`.
168
+
169
+ ### What to review
170
+
171
+ - If you pinned PurgeTSS to a pre-7.2.7 version for reproducibility, plan the bump: the security advisories affect any environment that resolves transitive `glob` or `js-yaml`.
172
+
173
+ ---
174
+
175
+ ## Upgrade to v7.2.6
176
+
177
+ v7.2.6 is a minor refresh release.
178
+
179
+ ### Updated
180
+
181
+ - Font Awesome bumped to version 7.1.0.
182
+ - Simplified flag property names in `utilities.tss`.
183
+
184
+ ---
185
+
186
+ ## Community-Discovered Patterns
187
+
188
+ Issues reported and patched outside the official changelog. These are documented here so users upgrading through multiple versions know to re-test the affected surface area. **Needs confirmation** — the version in which each fix shipped has not been verified against the official changelog at time of writing.
189
+
190
+ ### `backgroundGradient.colors` serialization with arrays of objects
191
+
192
+ Certain versions of PurgeTSS could produce broken output in `utilities.tss` when a custom rule defined `backgroundGradient.colors` as an array of `{ color, offset }` objects, for example:
193
+
194
+ ```javascript
195
+ const colors = [
196
+ { color: '#132C50', offset: 0 },
197
+ { color: '#0A1529', offset: 1 },
198
+ ];
199
+ ```
200
+
201
+ If you previously worked around this by inlining the gradient directly in TSS, re-test after upgrading: current versions serialize the array correctly. The exact version in which this was patched is not called out in the official changelog — treat this as a user-observed fix until confirmed.
202
+
203
+ ---
204
+
71
205
  ## Quick Checklist
72
206
 
73
- - Replace every legacy utilities filename reference with `utilities.tss`.
74
- - Verify Node.js 20+ before upgrading.
207
+ - Replace every legacy `tailwind.tss` reference with `utilities.tss`.
208
+ - Verify Node.js 20+ before upgrading past v7.3.0.
75
209
  - Rebuild after updating `config.cjs` or custom gradient rules.
76
210
  - Re-test any Classic Titanium code that depends on `deviceInfo()`.
211
+ - After v7.5.0: diff generated `utilities.tss` to confirm property deduplication produces the expected output.
212
+ - After v7.5.3: consider wiring `Appearance.init()` at app boot if you want runtime Light/Dark switching.
213
+ - After v7.6.0: run `brand`, `images`, and `semantic` once in a scratch project before pointing them at production assets, so you can preview the output layout.