@maccesar/titools 4.4.0 → 4.5.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.
- package/README.md +10 -13
- package/package.json +1 -1
- package/skills/purgetss/SKILL.md +4 -9
- package/skills/ti-api/references/api-core.md +24 -69
- package/skills/ti-api/references/api-data-network.md +18 -63
- package/skills/ti-api/references/api-media.md +225 -107
- package/skills/ti-api/references/api-modules-coremotion-urlsession.md +6 -20
- package/skills/ti-api/references/api-modules-map.md +45 -58
- package/skills/ti-api/references/api-modules-nfc.md +23 -56
- package/skills/ti-api/references/api-modules-social-misc.md +23 -3
- package/skills/ti-api/references/api-ui-android.md +16 -37
- package/skills/ti-api/references/api-ui-extras.md +106 -87
- package/skills/ti-api/references/api-ui-lists.md +103 -57
- package/skills/ti-api/references/api-ui-text-input.md +13 -39
- package/skills/ti-api/references/api-ui-windows-navigation.md +95 -93
- package/skills/ti-api/references/api-xml-global.md +25 -60
- package/skills/ti-expert/SKILL.md +8 -11
- package/skills/ti-expert/references/adaptive-layouts.md +15 -43
- package/skills/ti-expert/references/alloy-builtins.md +1 -4
- package/skills/ti-expert/references/alloy-structure.md +4 -12
- package/skills/ti-expert/references/anti-patterns.md +16 -45
- package/skills/ti-expert/references/code-conventions.md +2 -6
- package/skills/ti-expert/references/controller-patterns.md +1 -3
- package/skills/ti-expert/references/examples.md +3 -10
- package/skills/ti-expert/references/feedback-migration.md +17 -39
- package/skills/ti-expert/references/feedback-surfaces.md +19 -48
- package/skills/ti-expert/references/feedback-widget-contracts.md +31 -69
- package/skills/ti-expert/references/file-type-association.md +265 -0
- package/skills/ti-expert/references/migration-patterns.md +8 -18
- package/skills/ti-expert/references/sharing.md +227 -0
- package/skills/ti-expert/references/theming.md +20 -45
- package/skills/ti-guides/SKILL.md +5 -1
- package/skills/ti-guides/references/coding-best-practices.md +1 -2
- package/skills/ti-guides/references/compatibility-matrix.md +89 -0
- package/skills/ti-guides/references/resources.md +7 -1
- package/skills/ti-guides/references/sdk-release-notes.md +75 -0
- package/skills/ti-guides/references/style-and-conventions.md +1 -2
- package/skills/ti-howtos/references/debugging-profiling.md +1 -2
- package/skills/ti-howtos/references/location-and-maps.md +1 -2
- package/skills/ti-howtos/references/using-modules.md +1 -2
- package/skills/ti-howtos/references/web-content-integration.md +1 -2
- package/skills/ti-howtos/references/webpack-build-pipeline.md +1 -2
- package/skills/ti-ui/references/listviews-and-performance.md +5 -10
- package/skills/ti-ui/references/orientation.md +1 -2
- package/skills/ti-ui/references/scrolling-views.md +7 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Sharing content out
|
|
2
|
+
|
|
3
|
+
How to hand a link, a text or a file from your app to the rest of the system — the share sheet on iOS, the intent chooser on Android.
|
|
4
|
+
|
|
5
|
+
The two platforms are not symmetric and have not been for years, which is the single fact that explains every confusing implementation you will find in an older codebase. Android does this with the core SDK and no module. iOS does not: the SDK exposes no wrapper for `UIActivityViewController`, so a native module is still required. Code written before that split settled tends to route both platforms through the module, or through a cross-platform helper that only ever needed to exist for iOS.
|
|
6
|
+
|
|
7
|
+
This file is about sending content **out**. For receiving files — declaring a custom extension, UTIs, intent filters, `handleurl` — see [File type association](file-type-association.md).
|
|
8
|
+
|
|
9
|
+
## Contents
|
|
10
|
+
|
|
11
|
+
1. [The platform split](#1-the-platform-split)
|
|
12
|
+
2. [Android: the core SDK is enough](#2-android-the-core-sdk-is-enough)
|
|
13
|
+
3. [iOS: which module, and why one is still needed](#3-ios-which-module-and-why-one-is-still-needed)
|
|
14
|
+
4. [Text is not a file](#4-text-is-not-a-file)
|
|
15
|
+
5. [Do not pass text alongside a file](#5-do-not-pass-text-alongside-a-file)
|
|
16
|
+
6. [iPad needs an anchor](#6-ipad-needs-an-anchor)
|
|
17
|
+
7. [Knowing whether the user actually shared](#7-knowing-whether-the-user-actually-shared)
|
|
18
|
+
8. [Failing without an exception](#8-failing-without-an-exception)
|
|
19
|
+
9. [Verify instead of assuming](#9-verify-instead-of-assuming)
|
|
20
|
+
10. [Symptom to cause](#10-symptom-to-cause)
|
|
21
|
+
|
|
22
|
+
## 1. The platform split
|
|
23
|
+
|
|
24
|
+
| | Text or link | File |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| **Android** | `Ti.Android.createIntent` + `createIntentChooser` | Same, with `putExtraUri` |
|
|
27
|
+
| **iOS** | Native module — no SDK API | Native module, or `DocumentViewer` if the type is previewable |
|
|
28
|
+
|
|
29
|
+
The asymmetry is historical, not architectural. Sharing on Titanium used to go through `com.alcoapps.socialshare`, a CommonJS wrapper by Ricardo Alcocer that split by platform and drove the same iOS module underneath. Once Android could open the system sheet directly, the Android branch stopped needing anything and the module became iOS-only — but the wrapper stayed in projects, and with it a layer of indirection that no longer buys anything.
|
|
30
|
+
|
|
31
|
+
**When you find one of those wrappers,** check what it still does. The usual finding is dead weight: version-comparison helpers, Facebook app-id variables, `image_blob` / `image_url` normalization for an argument shape nobody passes anymore. Adapting the old helper costs more than writing the two branches.
|
|
32
|
+
|
|
33
|
+
## 2. Android: the core SDK is enough
|
|
34
|
+
|
|
35
|
+
`Ti.Android.createIntent` and `Ti.Android.createIntentChooser` are core SDK APIs and are not deprecated. No module, no widget.
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
function shareTextAndroid (text, chooserTitle) {
|
|
39
|
+
const activity = Ti.Android.rootActivity || Ti.Android.currentActivity
|
|
40
|
+
|
|
41
|
+
// No activity, no chooser to present. Calling startActivity on null throws in
|
|
42
|
+
// the face of whoever tapped Share.
|
|
43
|
+
if (!activity) {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const intent = Ti.Android.createIntent({
|
|
48
|
+
action: Ti.Android.ACTION_SEND,
|
|
49
|
+
type: 'text/plain'
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
intent.putExtra(Ti.Android.EXTRA_TEXT, text)
|
|
53
|
+
activity.startActivity(Ti.Android.createIntentChooser(intent, chooserTitle))
|
|
54
|
+
|
|
55
|
+
return true
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
For a file, two things change and both are mandatory:
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
intent.putExtraUri(Ti.Android.EXTRA_STREAM, file.nativePath)
|
|
63
|
+
intent.addFlags(Ti.Android.FLAG_GRANT_READ_URI_PERMISSION)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`putExtraUri` makes the SDK convert the path into a `content://` URI served by `TiFileProvider`, which ships declared in the merged manifest — nothing to configure. **Without `FLAG_GRANT_READ_URI_PERMISSION` the receiving app cannot read the file.** It is granted a URI it has no permission for, so the share appears to work and the other app shows an error or an empty attachment.
|
|
67
|
+
|
|
68
|
+
Set `type` to the real MIME type rather than `*/*`. An unknown type falls back to `application/octet-stream`, which offers every app on the device instead of the ones that can do something useful.
|
|
69
|
+
|
|
70
|
+
## 3. iOS: which module, and why one is still needed
|
|
71
|
+
|
|
72
|
+
There is no share sheet API in the SDK. This is verifiable rather than folklore — see [Verify instead of assuming](#9-verify-instead-of-assuming). The SDK offers `Ti.UI.iOS.DocumentViewer`, which is a previewer, and `Ti.App.iOS.UserActivity`, which is Handoff. Neither presents `UIActivityViewController`.
|
|
73
|
+
|
|
74
|
+
**The module is `dk.napp.social`**, and its provenance matters because the obvious repository is the wrong one:
|
|
75
|
+
|
|
76
|
+
| Repository | Status |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| [viezel/TiSocial.Framework](https://github.com/viezel/TiSocial.Framework) | **Archived April 2021.** Last release 2.0.0. This is the one search engines surface. |
|
|
79
|
+
| [hansemannn/TiSocial.Framework](https://github.com/hansemannn/TiSocial.Framework) | **The maintained fork.** Its 3.0.0 release states "Moved to this fork as the base repository". |
|
|
80
|
+
|
|
81
|
+
Releases on the fork: 3.0.0 (macOS support), 3.0.1 (fixes a possible iPad crash), 3.0.2 (restores iOS 12 compatibility). **3.0.2 is the highest published version.** If a project declares something higher in `tiapp.xml`, that build came from somewhere other than a release — treat the local copy as irreplaceable and say so in the project's install instructions, because nobody can download it.
|
|
82
|
+
|
|
83
|
+
```javascript
|
|
84
|
+
function shareTextIos (text, subject) {
|
|
85
|
+
const social = require('dk.napp.social')
|
|
86
|
+
|
|
87
|
+
if (!social.isActivityViewSupported()) {
|
|
88
|
+
return false
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
social.activityView({ subject: subject || '', text }, [])
|
|
92
|
+
return true
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Require the module inside the iOS branch, not at the top of the file. A module-level `require` runs on Android too, where it resolves to nothing useful.
|
|
97
|
+
|
|
98
|
+
## 4. Text is not a file
|
|
99
|
+
|
|
100
|
+
`DocumentViewer` takes the URL of a file; there is no way to hand it a string. So a file has two possible routes on iOS and a text has one.
|
|
101
|
+
|
|
102
|
+
**The file route via `DocumentViewer` works only when iOS can preview the type.** The viewer presents the document and its action button opens the real system sheet — no module involved. But "presents" is conditional: with a type the system cannot render, it presents nothing and reports no error. Silence, and the user sees a tap that did nothing.
|
|
103
|
+
|
|
104
|
+
So the decision is about the type, not about the file:
|
|
105
|
+
|
|
106
|
+
- **Type the system knows** (PDF, image, ZIP, plain text) → `DocumentViewer` is enough, and it saves you the module on this path.
|
|
107
|
+
- **Opaque type** — anything conforming to `public.data`, which is what a custom document type usually declares so that Files hands it over instead of previewing it (see [File type association](file-type-association.md)) → the viewer has nothing to show. Use the module's `activityView({ file })`.
|
|
108
|
+
|
|
109
|
+
This is the trap worth naming: **the same declaration that makes tapping the file open your app is what stops `DocumentViewer` from presenting it.** The two behaviors pull in opposite directions and both are correct.
|
|
110
|
+
|
|
111
|
+
## 5. Do not pass text alongside a file
|
|
112
|
+
|
|
113
|
+
When sharing a file, pass only the file. Adding `text` to the same payload makes iOS treat the string as a **second item** in the sheet, and "Save to Files" writes two files: the document, plus a `.txt` holding the caption.
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
// wrong — "Save to Files" leaves the backup AND a stray text file
|
|
117
|
+
social.activityView({ file: file.nativePath, text: title }, [])
|
|
118
|
+
|
|
119
|
+
// right — the subject rides along without becoming an item
|
|
120
|
+
social.activityView({ file: file.nativePath, subject: title }, [])
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The symptom shows up only in destinations that write to disk. Sharing to a messaging app looks fine, which is why this survives testing.
|
|
124
|
+
|
|
125
|
+
## 6. iPad needs an anchor
|
|
126
|
+
|
|
127
|
+
On iPad the sheet is a popover and must be anchored to the view that was tapped, or it has nowhere to attach:
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
if (Ti.Platform.osname === 'ipad') {
|
|
131
|
+
options.view = sourceView
|
|
132
|
+
social.activityPopover(options, [])
|
|
133
|
+
return true
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
social.activityView(options, [])
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
This means the controller has to pass the source view down to the sharing service — usually `event.source` from the tap handler. Services that take only a URL cannot support iPad without changing their signature, which is why the parameter is worth adding before the app ships on tablets.
|
|
140
|
+
|
|
141
|
+
## 7. Knowing whether the user actually shared
|
|
142
|
+
|
|
143
|
+
Both platforms open a sheet and return immediately. Neither the intent chooser nor a bare `activityView` call tells you what happened next.
|
|
144
|
+
|
|
145
|
+
On iOS the module emits it:
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
const social = require('dk.napp.social')
|
|
149
|
+
|
|
150
|
+
social.addEventListener('complete', event => {
|
|
151
|
+
// event.activityName — where it went
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
social.addEventListener('cancelled', () => {})
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Register these **once**, at module scope inside the iOS branch, not per share — re-adding on every tap leaks listeners.
|
|
158
|
+
|
|
159
|
+
Android has no equivalent through the chooser. If the product needs to know, that asymmetry is the design constraint, and treating "sheet opened" as success is the honest fallback.
|
|
160
|
+
|
|
161
|
+
Skip all of this when nothing depends on the answer. An analytics event or a "Shared!" confirmation is a reason; symmetry with iOS is not.
|
|
162
|
+
|
|
163
|
+
## 8. Failing without an exception
|
|
164
|
+
|
|
165
|
+
Sharing fails for reasons that are not bugs: no activity, a device without sheet support, a file that was deleted between the tap and the call. **Return a boolean and let the caller decide whether to warn.** Throwing from a share function means an exception reaches whoever tapped a button.
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
function share (payload, sourceView) {
|
|
169
|
+
try {
|
|
170
|
+
return OS_ANDROID
|
|
171
|
+
? shareAndroid(payload)
|
|
172
|
+
: shareIos(payload, sourceView)
|
|
173
|
+
} catch (error) {
|
|
174
|
+
Ti.API.error(`[sharing] Could not share: ${error.message}`)
|
|
175
|
+
return false
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The failure worth auditing in an existing codebase is a **mixed contract**: one branch returning `false` while its sibling throws or returns nothing. It usually means one path was hardened after a crash and the other was never revisited.
|
|
181
|
+
|
|
182
|
+
## 9. Verify instead of assuming
|
|
183
|
+
|
|
184
|
+
Whether the SDK exposes something is checkable in the installed SDK's API metadata, and takes less time than the argument about it:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
JSCA=~/Library/Application\ Support/Titanium/mobilesdk/osx/<version>/api.jsca
|
|
188
|
+
|
|
189
|
+
python3 - "$JSCA" <<'PY'
|
|
190
|
+
import json, sys
|
|
191
|
+
d = json.load(open(sys.argv[1]))
|
|
192
|
+
for t in d.get('types', []):
|
|
193
|
+
if any(k in t['name'] for k in ('Activity', 'Share', 'Social', 'DocumentViewer')):
|
|
194
|
+
print(t['name'])
|
|
195
|
+
PY
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
On 13.4.0.GA this returns `Titanium.UI.iOS.DocumentViewer`, `Titanium.App.iOS.UserActivity`, `Titanium.UI.ActivityIndicator` and the Android `Activity` types — and nothing wrapping `UIActivityViewController`. The same query tells you whether an API you are about to rely on is marked deprecated.
|
|
199
|
+
|
|
200
|
+
For the module, check what is actually installed rather than what `tiapp.xml` claims:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
ls ~/Library/Application\ Support/Titanium/modules/iphone/dk.napp.social/
|
|
204
|
+
cat ~/Library/Application\ Support/Titanium/modules/iphone/dk.napp.social/*/manifest
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Do not verify a suspicion by comparing against a sibling project.** Two codebases that share a lineage share its mistakes, so agreement between them proves nothing. The control is the platform documentation or the SDK metadata.
|
|
208
|
+
|
|
209
|
+
## 10. Symptom to cause
|
|
210
|
+
|
|
211
|
+
| Symptom | Cause |
|
|
212
|
+
| --- | --- |
|
|
213
|
+
| Tapping Share does nothing on iOS, no error | File type is not previewable and the code used `DocumentViewer`. Use the module for opaque types. |
|
|
214
|
+
| Receiving app shows an error or an empty attachment (Android) | Missing `FLAG_GRANT_READ_URI_PERMISSION`. |
|
|
215
|
+
| "Save to Files" writes two files | `text` passed alongside `file`. Use `subject`. |
|
|
216
|
+
| Sheet does not appear on iPad | `activityView` used instead of `activityPopover`, or no `view` anchor. |
|
|
217
|
+
| Crash when tapping Share on Android | `startActivity` on a null activity. Guard `rootActivity || currentActivity`. |
|
|
218
|
+
| Chooser offers every app on the device | `type` left as `*/*` or an unknown extension falling back to `application/octet-stream`. |
|
|
219
|
+
| `Couldn't find module: dk.napp.social` | Module not installed, or `require` at file scope running on Android. |
|
|
220
|
+
| Module version in `tiapp.xml` has no matching release | Locally built copy. It cannot be downloaded; document it as an install requirement. |
|
|
221
|
+
|
|
222
|
+
## Sources
|
|
223
|
+
|
|
224
|
+
- Titanium SDK 13.4.0.GA `api.jsca` — the absence of a share sheet API on iOS and the non-deprecated status of `Ti.Android.createIntentChooser`.
|
|
225
|
+
- [hansemannn/TiSocial.Framework](https://github.com/hansemannn/TiSocial.Framework) — maintained fork, releases 3.0.0 through 3.0.2.
|
|
226
|
+
- [viezel/TiSocial.Framework](https://github.com/viezel/TiSocial.Framework) — original, archived April 2021.
|
|
227
|
+
- [ricardoalcocer/socialshare](https://github.com/ricardoalcocer/socialshare) — the historical cross-platform wrapper, for recognizing it in old code.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Theming and dark mode
|
|
2
2
|
|
|
3
|
-
Choose the styling path from the project, not from personal memory. Semantic
|
|
4
|
-
roles are the shared contract; PurgeTSS or standard Alloy materializes them.
|
|
3
|
+
Choose the styling path from the project, not from personal memory. Semantic roles are the shared contract; PurgeTSS or standard Alloy materializes them.
|
|
5
4
|
|
|
6
5
|
## Contents
|
|
7
6
|
|
|
@@ -19,16 +18,13 @@ roles are the shared contract; PurgeTSS or standard Alloy materializes them.
|
|
|
19
18
|
1. Detect `purgetss/` or `purgetss/config.cjs`.
|
|
20
19
|
2. If detected, invoke the `purgetss` skill before writing any class or style.
|
|
21
20
|
3. If not detected, use standard Alloy TSS and Titanium semantic colors.
|
|
22
|
-
4. Use `Alloy.Globals` for a runtime palette only when the product requires
|
|
23
|
-
custom themes beyond the semantic light/dark/system model.
|
|
21
|
+
4. Use `Alloy.Globals` for a runtime palette only when the product requires custom themes beyond the semantic light/dark/system model.
|
|
24
22
|
|
|
25
|
-
Do not mix these paths accidentally. In particular, never teach a PurgeTSS
|
|
26
|
-
project to maintain the generated `app/styles/app.tss` by hand.
|
|
23
|
+
Do not mix these paths accidentally. In particular, never teach a PurgeTSS project to maintain the generated `app/styles/app.tss` by hand.
|
|
27
24
|
|
|
28
25
|
## Semantic color contract
|
|
29
26
|
|
|
30
|
-
Name colors by purpose rather than appearance. A practical design-system
|
|
31
|
-
contract includes:
|
|
27
|
+
Name colors by purpose rather than appearance. A practical design-system contract includes:
|
|
32
28
|
|
|
33
29
|
- app background and elevated surface;
|
|
34
30
|
- primary and secondary text;
|
|
@@ -62,28 +58,20 @@ Example:
|
|
|
62
58
|
}
|
|
63
59
|
```
|
|
64
60
|
|
|
65
|
-
Titanium resolves a semantic color name when a color-accepting property uses
|
|
66
|
-
that name. Keep component APIs tone-based (`neutral`, `success`, `warning`,
|
|
67
|
-
`error`) and map tones to semantic roles inside the visual layer. Do not pass
|
|
68
|
-
raw brand hex values through business controllers.
|
|
61
|
+
Titanium resolves a semantic color name when a color-accepting property uses that name. Keep component APIs tone-based (`neutral`, `success`, `warning`, `error`) and map tones to semantic roles inside the visual layer. Do not pass raw brand hex values through business controllers.
|
|
69
62
|
|
|
70
63
|
## PurgeTSS projects
|
|
71
64
|
|
|
72
|
-
The `purgetss` skill is the source of truth for supported classes, configuration,
|
|
73
|
-
appearance behavior, and commands. Apply these integration rules:
|
|
65
|
+
The `purgetss` skill is the source of truth for supported classes, configuration, appearance behavior, and commands. Apply these integration rules:
|
|
74
66
|
|
|
75
|
-
- Map semantic color names under `theme.extend.colors` in
|
|
76
|
-
`purgetss/config.cjs`.
|
|
67
|
+
- Map semantic color names under `theme.extend.colors` in `purgetss/config.cjs`.
|
|
77
68
|
- Use verified utility classes in Alloy XML.
|
|
78
69
|
- Configure `options.widgets: true` when Widgets contain utility classes.
|
|
79
70
|
- Prefer `config.cjs` for reusable custom rules.
|
|
80
71
|
- Treat `app/styles/app.tss` as generated output and never edit it.
|
|
81
|
-
- Keep only truly specific properties in Widget/controller TSS when no verified
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
-
creating a competing mode service.
|
|
85
|
-
- Read the current PurgeTSS references before naming any utility. Similarity to
|
|
86
|
-
Tailwind is not evidence that a class exists.
|
|
72
|
+
- Keep only truly specific properties in Widget/controller TSS when no verified utility exists.
|
|
73
|
+
- Use the PurgeTSS Appearance module for light/dark/system selection instead of creating a competing mode service.
|
|
74
|
+
- Read the current PurgeTSS references before naming any utility. Similarity to Tailwind is not evidence that a class exists.
|
|
87
75
|
|
|
88
76
|
Conceptual mapping only; verify the actual PurgeTSS syntax before use:
|
|
89
77
|
|
|
@@ -102,8 +90,7 @@ module.exports = {
|
|
|
102
90
|
}
|
|
103
91
|
```
|
|
104
92
|
|
|
105
|
-
After generation, inspect the final `app.tss` section for unused or unsupported
|
|
106
|
-
classes. A clean build that still lists a new unsupported class is not complete.
|
|
93
|
+
After generation, inspect the final `app.tss` section for unused or unsupported classes. A clean build that still lists a new unsupported class is not complete.
|
|
107
94
|
|
|
108
95
|
## Standard Alloy projects
|
|
109
96
|
|
|
@@ -133,23 +120,17 @@ Example:
|
|
|
133
120
|
}
|
|
134
121
|
```
|
|
135
122
|
|
|
136
|
-
Do not copy a large utility system into manual TSS. Create only the small set of
|
|
137
|
-
selectors the app actually uses.
|
|
123
|
+
Do not copy a large utility system into manual TSS. Create only the small set of selectors the app actually uses.
|
|
138
124
|
|
|
139
125
|
## Alloy build-time themes
|
|
140
126
|
|
|
141
|
-
Alloy's `app/themes/<name>/` folders can override views, styles, and assets at
|
|
142
|
-
build time. Select a theme through `app/config.json`. This is appropriate for
|
|
143
|
-
separate branded builds or compile-time variants.
|
|
127
|
+
Alloy's `app/themes/<name>/` folders can override views, styles, and assets at build time. Select a theme through `app/config.json`. This is appropriate for separate branded builds or compile-time variants.
|
|
144
128
|
|
|
145
|
-
Do not describe an Alloy build-time theme as runtime light/dark switching.
|
|
146
|
-
Semantic colors are the default for appearance changes while the app runs.
|
|
129
|
+
Do not describe an Alloy build-time theme as runtime light/dark switching. Semantic colors are the default for appearance changes while the app runs.
|
|
147
130
|
|
|
148
131
|
## Runtime custom themes
|
|
149
132
|
|
|
150
|
-
Use a centralized runtime palette or theme service only when semantic
|
|
151
|
-
light/dark/system colors cannot model the requirement, such as multiple user
|
|
152
|
-
selectable brand themes.
|
|
133
|
+
Use a centralized runtime palette or theme service only when semantic light/dark/system colors cannot model the requirement, such as multiple user selectable brand themes.
|
|
153
134
|
|
|
154
135
|
If that exception applies:
|
|
155
136
|
|
|
@@ -157,11 +138,9 @@ If that exception applies:
|
|
|
157
138
|
- expose semantic roles, not control IDs;
|
|
158
139
|
- document how already-created proxies receive updates;
|
|
159
140
|
- remove all listeners in controller cleanup;
|
|
160
|
-
- avoid rebuilding the entire window tree unless the app has measured and
|
|
161
|
-
accepted that tradeoff.
|
|
141
|
+
- avoid rebuilding the entire window tree unless the app has measured and accepted that tradeoff.
|
|
162
142
|
|
|
163
|
-
`Alloy.Globals` is a legacy/advanced interoperability option, not the first
|
|
164
|
-
recommendation for ordinary dark mode.
|
|
143
|
+
`Alloy.Globals` is a legacy/advanced interoperability option, not the first recommendation for ordinary dark mode.
|
|
165
144
|
|
|
166
145
|
## Component rules
|
|
167
146
|
|
|
@@ -169,10 +148,8 @@ recommendation for ordinary dark mode.
|
|
|
169
148
|
- Widgets own anatomy and behavior, not the product palette.
|
|
170
149
|
- Localized strings and business callbacks come from the host.
|
|
171
150
|
- Destructive styling must remain distinguishable in both appearances.
|
|
172
|
-
- Overlays, focus indicators, disabled states, and text must retain usable
|
|
173
|
-
|
|
174
|
-
- Do not create separate light/dark controller branches when a semantic color
|
|
175
|
-
can express the difference.
|
|
151
|
+
- Overlays, focus indicators, disabled states, and text must retain usable contrast in light, dark, and system modes.
|
|
152
|
+
- Do not create separate light/dark controller branches when a semantic color can express the difference.
|
|
176
153
|
|
|
177
154
|
## Verification
|
|
178
155
|
|
|
@@ -185,6 +162,4 @@ For every supported platform and form factor:
|
|
|
185
162
|
5. run PurgeTSS generation when detected and resolve unsupported classes;
|
|
186
163
|
6. compile and build both platform targets before claiming completion.
|
|
187
164
|
|
|
188
|
-
For exact PurgeTSS behavior, load its current `semantic-colors.md` and
|
|
189
|
-
`appearance-module.md` references. For Titanium property availability, verify
|
|
190
|
-
against the current `ti-api` skill.
|
|
165
|
+
For exact PurgeTSS behavior, load its current `semantic-colors.md` and `appearance-module.md` references. For Titanium property availability, verify against the current `ti-api` skill.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ti-guides
|
|
3
|
-
description: 'Use when working on Titanium SDK fundamentals: project configuration (`tiapp.xml`, `timodule.xml`), CommonJS modules, Hyperloop native access, app distribution (App Store / Google Play, certificates, provisioning), Titanium CLI usage, memory management, bridge optimization, SQLite transactions, image memory,
|
|
3
|
+
description: 'Use when working on Titanium SDK fundamentals: project configuration (`tiapp.xml`, `timodule.xml`), CommonJS modules, Hyperloop native access, app distribution (App Store / Google Play, certificates, provisioning), Titanium CLI usage, memory management, bridge optimization, SQLite transactions, image memory, coding standards, the compatibility matrix (which JDK, Node.js, Xcode or Android SDK a given Titanium SDK needs), or what changed in a Titanium SDK release. Triggers include `tiapp.xml` in the project root, for either Alloy (`app/`) or Classic (`Resources/`) Titanium projects.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ti-guides
|
|
@@ -19,6 +19,8 @@ Use this skill when:
|
|
|
19
19
|
- Using Hyperloop to call native APIs (Objective-C / Swift / Java)
|
|
20
20
|
- Optimizing memory: removing global listeners, caching native properties, image memory footprints
|
|
21
21
|
- Working with the Titanium CLI (`ti build`, `ti sdk install`, `ti sdk select`)
|
|
22
|
+
- Checking which JDK, Node.js, Xcode or Android SDK a Titanium SDK version requires
|
|
23
|
+
- Finding out what changed in a Titanium SDK release and whether it affects existing code
|
|
22
24
|
- Writing CommonJS modules (stateful caching, ES6+ patterns, antipatterns)
|
|
23
25
|
- Authoring `AndroidManifest.xml` overrides
|
|
24
26
|
- Following TiDev style and naming conventions
|
|
@@ -47,6 +49,8 @@ Do NOT use for:
|
|
|
47
49
|
| Google Play (APK / AAB), App Store (IPA), certificates, provisioning, deployment | [app-distribution.md](references/app-distribution.md) |
|
|
48
50
|
| Complete `tiapp.xml` and `timodule.xml` reference | [tiapp-config.md](references/tiapp-config.md) |
|
|
49
51
|
| Titanium CLI commands, options, tasks, configuration, build processes | [cli-reference.md](references/cli-reference.md) |
|
|
52
|
+
| JDK, Node.js, Xcode and Android SDK versions each Titanium SDK supports | [compatibility-matrix.md](references/compatibility-matrix.md) |
|
|
53
|
+
| What changed per 13.x release, and which changes affect your code | [sdk-release-notes.md](references/sdk-release-notes.md) |
|
|
50
54
|
| Community support, modules, sample code, Slack, learning materials | [resources.md](references/resources.md) |
|
|
51
55
|
|
|
52
56
|
## Core practices
|
|
@@ -66,8 +66,7 @@ if (isAndroid) { /* Android path */ } else { /* iOS path */ }
|
|
|
66
66
|
- Avoid extending the `Ti` namespace. Three reasons:
|
|
67
67
|
1. Ti objects are proxies to native OS components — your extensions may conflict with native functionality.
|
|
68
68
|
2. Arrays stored on the namespace may be immutable; objects may be null unexpectedly.
|
|
69
|
-
3. There is no guarantee properties persist across SDK versions.
|
|
70
|
-
Use your own namespace or CommonJS module instead of modifying `Ti`.
|
|
69
|
+
3. There is no guarantee properties persist across SDK versions. Use your own namespace or CommonJS module instead of modifying `Ti`.
|
|
71
70
|
|
|
72
71
|
## 5. App architecture recommendations
|
|
73
72
|
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Compatibility matrix
|
|
2
|
+
|
|
3
|
+
Which JDK, Node.js, Xcode and Android SDK versions a given Titanium SDK release can build with. Components outside the min/max ranges below are not compatible.
|
|
4
|
+
|
|
5
|
+
Only the currently supported ranges are reproduced here. Upstream also keeps collapsed tables of long-unsupported ranges (back to Titanium 1.7); if a project is pinned to something older than the rows below, consult the upstream matrix directly.
|
|
6
|
+
|
|
7
|
+
<!-- TOC-START -->
|
|
8
|
+
## Contents
|
|
9
|
+
|
|
10
|
+
- [1. Operating system](#1-operating-system)
|
|
11
|
+
- [2. Java Development Kit](#2-java-development-kit)
|
|
12
|
+
- [3. Node.js](#3-nodejs)
|
|
13
|
+
- [4. Android](#4-android)
|
|
14
|
+
- [5. iOS and Xcode](#5-ios-and-xcode)
|
|
15
|
+
- [6. Which platform can build what](#6-which-platform-can-build-what)
|
|
16
|
+
|
|
17
|
+
<!-- TOC-END -->
|
|
18
|
+
|
|
19
|
+
## 1. Operating system
|
|
20
|
+
|
|
21
|
+
| Operating system | Version |
|
|
22
|
+
|---|---|
|
|
23
|
+
| macOS | 10.11.5 and later |
|
|
24
|
+
| Windows | Windows 7 and later (Android) |
|
|
25
|
+
| Linux | Tested on Fedora and (K)Ubuntu; others should work |
|
|
26
|
+
|
|
27
|
+
## 2. Java Development Kit
|
|
28
|
+
|
|
29
|
+
The JDK is required to build Titanium apps and modules for Android. OpenJDK or Oracle both work.
|
|
30
|
+
|
|
31
|
+
| Titanium SDK version | Min JDK | Max JDK |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| 13.3.0 - latest | 18 | 25 |
|
|
34
|
+
| 12.8.0 - 13.2.0 | 18 | 21 |
|
|
35
|
+
|
|
36
|
+
`12.0.0 - 12.7.0` (JDK 11-17) moved to the unsupported table when 13.3.0 shipped.
|
|
37
|
+
|
|
38
|
+
## 3. Node.js
|
|
39
|
+
|
|
40
|
+
Node.js is required to install and run the Titanium SDK. On Windows, enable `dev mode` in Windows settings for Node to work correctly.
|
|
41
|
+
|
|
42
|
+
| Titanium SDK version | Min Node | Max Node |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| 13.1.1 - latest | 20.x | 24.x |
|
|
45
|
+
| 13.0.0 - 13.1.0 | 20.x | 22.x |
|
|
46
|
+
| 12.6.0 - 12.8.0 | 18.x | 22.x |
|
|
47
|
+
|
|
48
|
+
## 4. Android
|
|
49
|
+
|
|
50
|
+
As of Titanium 9.0.0 the build system downloads the needed Android SDK platforms and tools automatically. Upgrade those packages only between major projects — changes there have broken the Titanium toolchain several times.
|
|
51
|
+
|
|
52
|
+
| Titanium SDK version | Min target (`android:targetSdkVersion`) | Max target | Min supported (`android:minSdkVersion`) |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| 13.1.0+ | 15.x (API 35) | 15.x (API 35) | 7.x (API 24) |
|
|
55
|
+
| 12.8.0 - 13.0.1 | 15.x (API 35) | 15.x (API 35) | 5.x (API 21) |
|
|
56
|
+
| 12.5.0 - 12.8.0 | 14.x (API 34) | 14.x (API 34) | 5.x (API 21) |
|
|
57
|
+
| 12.0.0 - 12.5.0 | 13.x (API 33) | 13.x (API 33) | 5.x (API 21) |
|
|
58
|
+
|
|
59
|
+
A `android:targetSDKVersion` set in `tiapp.xml` must fall inside the min/max target range of the SDK in use.
|
|
60
|
+
|
|
61
|
+
> **Note:** Titanium SDK 13.4.0 is described in its release note as *preparing the SDK for Android target SDK 36*. The matrix above still lists API 35 as the maximum; treat API 36 as in-progress rather than as a supported target until the matrix says otherwise.
|
|
62
|
+
|
|
63
|
+
Developing native Android add-on modules on macOS also requires the Xcode command line tools.
|
|
64
|
+
|
|
65
|
+
## 5. iOS and Xcode
|
|
66
|
+
|
|
67
|
+
Building for iOS requires macOS — Apple's license agreement allows iOS development only on Apple hardware.
|
|
68
|
+
|
|
69
|
+
| Titanium SDK version | Min Xcode | Max Xcode | Notes |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| 12.6.3 - latest | 12.0.0 | 16.x | Full support for iOS 18.4 |
|
|
72
|
+
| 12.2.0 - 12.6.2 | 12.0.0 | 16.2 | Full support for iOS 17 |
|
|
73
|
+
| 10.1.0 - 12.1.2 | 11.0.0 | 13.x | Full support for iOS 15 |
|
|
74
|
+
|
|
75
|
+
| Titanium SDK version | Min iOS SDK | Max iOS SDK | Min target iOS | Max target iOS |
|
|
76
|
+
|---|---|---|---|---|
|
|
77
|
+
| 12.2.0 - latest | 13.0.0 | 17.x | 12.0 | 17.x |
|
|
78
|
+
| 10.1.0 - 12.1.2 | 13.0.0 | 15.x | 12.0 | 15.x |
|
|
79
|
+
|
|
80
|
+
> **Note:** these two tables lag behind the release notes. Titanium SDK 13.3.0 shipped *support for Xcode 27 and iOS 27*, which no row above reflects. Where they disagree, the release note is the newer statement — see [sdk-release-notes.md](sdk-release-notes.md).
|
|
81
|
+
|
|
82
|
+
## 6. Which platform can build what
|
|
83
|
+
|
|
84
|
+
| Target | macOS | Windows | Linux |
|
|
85
|
+
|---|---|---|---|
|
|
86
|
+
| Android | Yes | Yes | Yes |
|
|
87
|
+
| iOS | Yes | No | No |
|
|
88
|
+
|
|
89
|
+
Anything marked *pre-release* upstream — Beta, Developer Preview, Release Candidate, and continuous builds — is not officially supported.
|
|
@@ -111,7 +111,13 @@ See `hyperloop-native-access.md` for native module development:
|
|
|
111
111
|
|
|
112
112
|
### IDE support
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
Titanium has no IDE of its own; the CLI is the common denominator and every editor below drives it.
|
|
115
|
+
|
|
116
|
+
| Editor | Integration |
|
|
117
|
+
|---|---|
|
|
118
|
+
| Visual Studio Code | Titanium extension — https://code.visualstudio.com/ |
|
|
119
|
+
| JetBrains IDEs | Community plugin — https://github.com/devloopsnet/titanium-jetbrains |
|
|
120
|
+
| Atom | Titanium package (Atom itself is discontinued) |
|
|
115
121
|
|
|
116
122
|
### CLI tools
|
|
117
123
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# SDK release notes: what changes your code
|
|
2
|
+
|
|
3
|
+
Condensed 13.x release history, filtered down to what actually affects how you write or configure an app. Full changelogs (every commit, every credit) live upstream under `Titanium_SDK_Release_Notes/`.
|
|
4
|
+
|
|
5
|
+
Each GA release desupports the previous patch release. Running an unsupported version is allowed, but bug reports against it are not accepted.
|
|
6
|
+
|
|
7
|
+
<!-- TOC-START -->
|
|
8
|
+
## Contents
|
|
9
|
+
|
|
10
|
+
- [1. Version timeline](#1-version-timeline)
|
|
11
|
+
- [2. 13.4.0 — Android target SDK 36 groundwork](#2-1340--android-target-sdk-36-groundwork)
|
|
12
|
+
- [3. 13.3.1 — patch](#3-1331--patch)
|
|
13
|
+
- [4. 13.3.0 — Xcode 27, iOS 27, multi-scene](#4-1330--xcode-27-ios-27-multi-scene)
|
|
14
|
+
- [5. 13.2.0 — ViewPager2, keepHardwareMode](#5-1320--viewpager2-keephardwaremode)
|
|
15
|
+
- [6. Bundled module versions](#6-bundled-module-versions)
|
|
16
|
+
|
|
17
|
+
<!-- TOC-END -->
|
|
18
|
+
|
|
19
|
+
## 1. Version timeline
|
|
20
|
+
|
|
21
|
+
| Version | Date | Headline |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| 13.4.0.GA | 28 July 2026 | Prepares the SDK for Android target SDK 36; v8 memory cleanup |
|
|
24
|
+
| 13.3.1.GA | 20 July 2026 | Patch — iOS restart and LiveView fixes |
|
|
25
|
+
| 13.3.0.GA | 01 July 2026 | Xcode 27 and iOS 27, Hyperloop 8.0.0, iOS multi-scene apps |
|
|
26
|
+
| 13.2.0.GA | 08 April 2026 | iOS core changes, Node.js 24 support, Android fixes |
|
|
27
|
+
| 13.1.0.GA | — | Minor release, high-priority fixes |
|
|
28
|
+
| 13.0.0.GA | — | Major release: iOS 26 / Xcode 26, Android 16 KB page size |
|
|
29
|
+
|
|
30
|
+
## 2. 13.4.0 — Android target SDK 36 groundwork
|
|
31
|
+
|
|
32
|
+
- **Prepares the SDK for Android target SDK 36.** Groundwork only; the compatibility matrix still lists API 35 as the maximum target. See [compatibility-matrix.md](compatibility-matrix.md) § Android.
|
|
33
|
+
- v8 memory cleanup (Android).
|
|
34
|
+
- `Window.rect` now reflects pre-open `left`/`top` instead of reporting zeros before the window opens (Android).
|
|
35
|
+
- Build paths adjusted for Windows hosts.
|
|
36
|
+
- iOS: fixed the dimming area in a TableView SearchBar.
|
|
37
|
+
- The debug-only selector for `Ti.App._restart()` was removed, making the method callable outside debug builds.
|
|
38
|
+
|
|
39
|
+
## 3. 13.3.1 — patch
|
|
40
|
+
|
|
41
|
+
iOS-only fixes: the `restart` method, and LiveView restart. Hyperloop bumped to 8.0.1.
|
|
42
|
+
|
|
43
|
+
## 4. 13.3.0 — Xcode 27, iOS 27, multi-scene
|
|
44
|
+
|
|
45
|
+
- **Xcode 27 and iOS 27 support.** This postdates the Xcode/iOS rows in the compatibility matrix, which still cap at Xcode 16.x.
|
|
46
|
+
- **iOS multi-scene applications** are supported.
|
|
47
|
+
- **Hyperloop 8.0.0.**
|
|
48
|
+
- ScrollableView (Android): a deprecation note was added for its older events. As of SDK 13.4.0 no ScrollableView event is actually flagged deprecated in the API metadata — `scroll`, `scrollend` and `dragend` all remain current — so treat this as advance warning, not as a removal.
|
|
49
|
+
- ImageView: pinch-and-zoom improved on Android; the remote-image fade-in animation was removed on iOS.
|
|
50
|
+
- TabGroup (iOS): `focus` is now emitted separately from `selected`. Code that assumed one event covered both cases needs checking.
|
|
51
|
+
- `borderWidth` no longer renders at double thickness when `borderRadius` is an array (iOS).
|
|
52
|
+
- Android: Material 3 BottomNavigation theme and dark/light switching fixes, CameraX rotation fix under orientation lock, WebView fix for URLs carrying large GET data, `Ti.Preferences` optimized.
|
|
53
|
+
|
|
54
|
+
## 5. 13.2.0 — ViewPager2, keepHardwareMode
|
|
55
|
+
|
|
56
|
+
- **ScrollableView moved to ViewPager2 on Android.** A backing-widget swap; verify paging, nested scrolling and any custom paging control against it.
|
|
57
|
+
- **`keepHardwareMode` added to `Ti.UI.View`** (Android) — controls the view's render mode.
|
|
58
|
+
- **`hideKeyboardAccessoryView` added to WebView** (iOS) to hide the keyboard accessory bar.
|
|
59
|
+
- **AttributedString support on Android**, previously iOS-only.
|
|
60
|
+
- Images can be dragged horizontally inside a ScrollableView (Android).
|
|
61
|
+
- ListView caches `searchText` (Android).
|
|
62
|
+
- The app name in `AndroidManifest.xml` now uses the i18n value.
|
|
63
|
+
- Node.js 24 support; core-js upgraded, removing the `baseline-browser-mapping` warning.
|
|
64
|
+
- iOS: Mac Catalyst fixes for `Ti.UI.Button` styling and events, and module builds with `mac=true`.
|
|
65
|
+
|
|
66
|
+
## 6. Bundled module versions
|
|
67
|
+
|
|
68
|
+
Versions shipped with each SDK. Unchanged rows are omitted.
|
|
69
|
+
|
|
70
|
+
| Module | 13.2.0 (Android / iOS) | 13.3.0+ (Android / iOS) |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| facebook | 14.0.0 / 15.0.0 | 15.0.0 / 16.0.0 |
|
|
73
|
+
| hyperloop | 7.1.0 / 7.1.0 | 8.0.1 / 8.0.1 (8.0.0 in 13.3.0) |
|
|
74
|
+
|
|
75
|
+
Stable across 13.2.0–13.4.0: `ti.map` 5.7.0 / 7.3.1, `ti.webdialog` 2.5.0 / 3.0.2, `ti.playservices` 18.6.0 (Android only), `ti.identity` 3.2.0 / 5.0.0, `urlSession` 4.0.1 (iOS only), `ti.coremotion` 4.0.1 (iOS only), `ti.applesignin` 3.1.2 (iOS only).
|
|
@@ -46,8 +46,7 @@ else
|
|
|
46
46
|
const fullName = firstName + ' ' + lastName
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
Return statement placement:
|
|
50
|
-
Do not put `return` on its own line followed by an object literal. JavaScript will insert a semicolon automatically and return `undefined`.
|
|
49
|
+
Return statement placement: Do not put `return` on its own line followed by an object literal. JavaScript will insert a semicolon automatically and return `undefined`.
|
|
51
50
|
```javascript
|
|
52
51
|
// Wrong
|
|
53
52
|
return
|
|
@@ -382,8 +382,7 @@ Android Studio (GUI): Tools → Device Manager → Create Device.
|
|
|
382
382
|
|
|
383
383
|
### Modifying emulators
|
|
384
384
|
|
|
385
|
-
Increase disk space:
|
|
386
|
-
Edit `~/.android/avd/<NAME>.avd/config.ini`:
|
|
385
|
+
Increase disk space: Edit `~/.android/avd/<NAME>.avd/config.ini`:
|
|
387
386
|
```
|
|
388
387
|
disk.dataPartition.size=1024m
|
|
389
388
|
```
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
## 1. GPS position tracking
|
|
4
4
|
|
|
5
5
|
### FusedLocationProvider (Android)
|
|
6
|
-
Since TiSDK 7.1.0, Titanium supports `FusedLocationProvider` for significant battery savings.
|
|
7
|
-
Requirement: include the `ti.playservices` module in your project.
|
|
6
|
+
Since TiSDK 7.1.0, Titanium supports `FusedLocationProvider` for significant battery savings. Requirement: include the `ti.playservices` module in your project.
|
|
8
7
|
|
|
9
8
|
### Accuracy configuration
|
|
10
9
|
|
|
@@ -25,8 +25,7 @@ Community modules:
|
|
|
25
25
|
- From Zero To App list: https://fromzerotoapp.com/modules/
|
|
26
26
|
- Curated list of modules maintained by Michael Gangolf
|
|
27
27
|
|
|
28
|
-
Marketplace:
|
|
29
|
-
The original Appcelerator Marketplace is no longer available. Find community modules on GitHub and npm. A curated list is at https://fromzerotoapp.com/modules/.
|
|
28
|
+
Marketplace: The original Appcelerator Marketplace is no longer available. Find community modules on GitHub and npm. A curated list is at https://fromzerotoapp.com/modules/.
|
|
30
29
|
|
|
31
30
|
### Pre-installed modules
|
|
32
31
|
Some modules ship with the SDK and do not need separate installation: `ti.map`, `ti.identity`, `ti.webdialog`, `ti.applesignin`.
|
|
@@ -53,8 +53,7 @@ Example:
|
|
|
53
53
|
When you `import { func } from '@/utils'`, Webpack picks the correct version for the build target.
|
|
54
54
|
|
|
55
55
|
## 5. Diagnostic web UI
|
|
56
|
-
Webpack includes a web interface to analyze builds and asset sizes.
|
|
57
|
-
Default URL: `http://localhost:1732/webpack/latest/web`
|
|
56
|
+
Webpack includes a web interface to analyze builds and asset sizes. Default URL: `http://localhost:1732/webpack/latest/web`
|
|
58
57
|
|
|
59
58
|
## 6. Project plugins
|
|
60
59
|
Webpack support is powered by plugins chosen based on project type:
|