craft-native 0.0.55 → 0.0.74

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 (146) hide show
  1. package/dist/android/src/index.d.ts +73 -0
  2. package/dist/android/src/index.js +177 -37
  3. package/dist/android/templates/AndroidManifest.xml.template +10 -36
  4. package/dist/android/templates/CraftBridge.kt.template +192 -60
  5. package/dist/android/templates/CraftHealthConnect.kt.template +200 -0
  6. package/dist/android/templates/CraftHealthConnectStub.kt.template +28 -0
  7. package/dist/android/templates/LocationRecordingService.kt.template +160 -0
  8. package/dist/android/templates/MainActivity.kt.template +140 -19
  9. package/dist/android/templates/build.gradle.kts.app.template +23 -1
  10. package/dist/android/templates/build.gradle.kts.project.template +3 -2
  11. package/dist/android/templates/proguard-rules.pro.template +9 -0
  12. package/dist/api/android-advanced.d.ts +5 -6
  13. package/dist/api/app.d.ts +0 -1
  14. package/dist/api/clipboard.d.ts +0 -1
  15. package/dist/api/crypto.d.ts +1 -2
  16. package/dist/api/db.d.ts +1 -2
  17. package/dist/api/dialog.d.ts +0 -1
  18. package/dist/api/fs.d.ts +1 -2
  19. package/dist/api/gestures.d.ts +66 -0
  20. package/dist/api/http.d.ts +1 -2
  21. package/dist/api/index.d.ts +37 -34
  22. package/dist/api/ios-advanced.d.ts +6 -7
  23. package/dist/api/macos-advanced.d.ts +2 -3
  24. package/dist/api/media.d.ts +0 -1
  25. package/dist/api/mobile.d.ts +109 -1
  26. package/dist/api/process.d.ts +0 -1
  27. package/dist/api/sidebar.d.ts +3 -20
  28. package/dist/api/spaces.d.ts +83 -0
  29. package/dist/api/tray.d.ts +2 -3
  30. package/dist/api/window.d.ts +1 -2
  31. package/dist/api/windows-advanced.d.ts +6 -7
  32. package/dist/assets/index.d.ts +0 -1
  33. package/dist/binary-resolver.d.ts +23 -1
  34. package/dist/bridge/android.d.ts +0 -1
  35. package/dist/bridge/core.d.ts +0 -38
  36. package/dist/bridge/ids.d.ts +0 -1
  37. package/dist/bridge/ios.d.ts +0 -1
  38. package/dist/bridge/webkit-pending.d.ts +0 -1
  39. package/dist/build/bundle-optimizer.d.ts +0 -1
  40. package/dist/cli.js +666 -90
  41. package/dist/components/index.d.ts +6 -7
  42. package/dist/components/native.d.ts +0 -1
  43. package/dist/components/sidebar.d.ts +2 -81
  44. package/dist/dev/devtools.d.ts +0 -1
  45. package/dist/dev/error-overlay.d.ts +0 -1
  46. package/dist/dev/hot-reload.d.ts +0 -1
  47. package/dist/index.cjs +113 -3
  48. package/dist/index.d.cts +16 -16
  49. package/dist/index.d.ts +16 -16
  50. package/dist/index.js +112 -4
  51. package/dist/ios/src/index.d.ts +172 -0
  52. package/dist/ios/src/index.js +440 -42
  53. package/dist/ios/templates/CraftActivityAttributes.swift +14 -0
  54. package/dist/ios/templates/CraftApp.swift +1001 -73
  55. package/dist/ios/templates/CraftLiveActivityWidget.swift.template +62 -0
  56. package/dist/ios/templates/CraftWatchApp.swift.template +155 -0
  57. package/dist/ios/templates/Info.plist.template +10 -9
  58. package/dist/ios/templates/WatchApp.Info.plist.template +26 -0
  59. package/dist/ios/templates/WidgetExtension.Info.plist +31 -0
  60. package/dist/ios/templates/project.yml.template +12 -1
  61. package/dist/logging/index.d.ts +0 -1
  62. package/dist/mobile.d.ts +8 -0
  63. package/dist/mobile.js +755 -0
  64. package/dist/optimizations/index.d.ts +3 -4
  65. package/dist/package.d.ts +11 -1
  66. package/dist/performance/runtime.d.ts +0 -1
  67. package/dist/performance/startup.d.ts +0 -1
  68. package/dist/plugins/index.d.ts +0 -1
  69. package/dist/security/index.d.ts +0 -1
  70. package/dist/sidebar-types.d.ts +102 -0
  71. package/dist/signing/index.d.ts +0 -1
  72. package/dist/styles/headwind.d.ts +0 -1
  73. package/dist/styles/index.d.ts +9 -10
  74. package/dist/styles/sidebar-templates.d.ts +0 -1
  75. package/dist/styles/sidebars.d.ts +0 -1
  76. package/dist/types.d.ts +131 -1
  77. package/dist/updater/index.d.ts +0 -1
  78. package/dist/utils/audio.d.ts +0 -1
  79. package/dist/utils/index.d.ts +4 -5
  80. package/dist/utils/native.d.ts +1 -2
  81. package/dist/utils/react.d.ts +0 -1
  82. package/dist/utils/storage.d.ts +0 -1
  83. package/dist/utils/svelte.d.ts +0 -1
  84. package/dist/utils/timer.d.ts +0 -1
  85. package/dist/utils/vue.d.ts +0 -1
  86. package/package.json +32 -4
  87. package/dist/android/src/index.js.map +0 -10
  88. package/dist/api/android-advanced.d.ts.map +0 -1
  89. package/dist/api/app.d.ts.map +0 -1
  90. package/dist/api/clipboard.d.ts.map +0 -1
  91. package/dist/api/crypto.d.ts.map +0 -1
  92. package/dist/api/db.d.ts.map +0 -1
  93. package/dist/api/dialog.d.ts.map +0 -1
  94. package/dist/api/fs.d.ts.map +0 -1
  95. package/dist/api/http.d.ts.map +0 -1
  96. package/dist/api/index.d.ts.map +0 -1
  97. package/dist/api/ios-advanced.d.ts.map +0 -1
  98. package/dist/api/macos-advanced.d.ts.map +0 -1
  99. package/dist/api/media.d.ts.map +0 -1
  100. package/dist/api/mobile.d.ts.map +0 -1
  101. package/dist/api/process.d.ts.map +0 -1
  102. package/dist/api/sidebar.d.ts.map +0 -1
  103. package/dist/api/tray.d.ts.map +0 -1
  104. package/dist/api/window.d.ts.map +0 -1
  105. package/dist/api/windows-advanced.d.ts.map +0 -1
  106. package/dist/assets/index.d.ts.map +0 -1
  107. package/dist/binary-resolver.d.ts.map +0 -1
  108. package/dist/bridge/android.d.ts.map +0 -1
  109. package/dist/bridge/core.d.ts.map +0 -1
  110. package/dist/bridge/ids.d.ts.map +0 -1
  111. package/dist/bridge/ios.d.ts.map +0 -1
  112. package/dist/bridge/webkit-pending.d.ts.map +0 -1
  113. package/dist/build/bundle-optimizer.d.ts.map +0 -1
  114. package/dist/components/index.d.ts.map +0 -1
  115. package/dist/components/native.d.ts.map +0 -1
  116. package/dist/components/sidebar.d.ts.map +0 -1
  117. package/dist/dev/devtools.d.ts.map +0 -1
  118. package/dist/dev/error-overlay.d.ts.map +0 -1
  119. package/dist/dev/hot-reload.d.ts.map +0 -1
  120. package/dist/index.d.ts.map +0 -1
  121. package/dist/index.js.map +0 -45
  122. package/dist/ios/src/index.js.map +0 -10
  123. package/dist/logging/index.d.ts.map +0 -1
  124. package/dist/optimizations/index.d.ts.map +0 -1
  125. package/dist/package.d.ts.map +0 -1
  126. package/dist/package.test.d.ts +0 -2
  127. package/dist/package.test.d.ts.map +0 -1
  128. package/dist/performance/runtime.d.ts.map +0 -1
  129. package/dist/performance/startup.d.ts.map +0 -1
  130. package/dist/plugins/index.d.ts.map +0 -1
  131. package/dist/security/index.d.ts.map +0 -1
  132. package/dist/signing/index.d.ts.map +0 -1
  133. package/dist/styles/headwind.d.ts.map +0 -1
  134. package/dist/styles/index.d.ts.map +0 -1
  135. package/dist/styles/sidebar-templates.d.ts.map +0 -1
  136. package/dist/styles/sidebars.d.ts.map +0 -1
  137. package/dist/types.d.ts.map +0 -1
  138. package/dist/updater/index.d.ts.map +0 -1
  139. package/dist/utils/audio.d.ts.map +0 -1
  140. package/dist/utils/index.d.ts.map +0 -1
  141. package/dist/utils/native.d.ts.map +0 -1
  142. package/dist/utils/react.d.ts.map +0 -1
  143. package/dist/utils/storage.d.ts.map +0 -1
  144. package/dist/utils/svelte.d.ts.map +0 -1
  145. package/dist/utils/timer.d.ts.map +0 -1
  146. package/dist/utils/vue.d.ts.map +0 -1
@@ -0,0 +1,62 @@
1
+ import ActivityKit
2
+ import SwiftUI
3
+ import WidgetKit
4
+
5
+ @main
6
+ struct CraftLiveActivityBundle: WidgetBundle {
7
+ var body: some Widget {
8
+ CraftLiveActivityWidget()
9
+ }
10
+ }
11
+
12
+ struct CraftLiveActivityWidget: Widget {
13
+ var body: some WidgetConfiguration {
14
+ ActivityConfiguration(for: CraftActivityAttributes.self) { context in
15
+ HStack(spacing: 12) {
16
+ Image(systemName: "figure.run")
17
+ .foregroundStyle(.green)
18
+ VStack(alignment: .leading, spacing: 3) {
19
+ Text(context.attributes.title).font(.headline)
20
+ Text(context.state.status).font(.caption).foregroundStyle(.secondary)
21
+ }
22
+ Spacer()
23
+ VStack(alignment: .trailing, spacing: 3) {
24
+ Text(distance(context.state.distanceMeters)).font(.headline.monospacedDigit())
25
+ Text(duration(context.state.durationSeconds)).font(.caption.monospacedDigit())
26
+ }
27
+ }
28
+ .padding()
29
+ .activityBackgroundTint(Color(red: 0, green: 0.24, blue: 0.18))
30
+ .activitySystemActionForegroundColor(.white)
31
+ } dynamicIsland: { context in
32
+ DynamicIsland {
33
+ DynamicIslandExpandedRegion(.leading) {
34
+ Label(context.state.status, systemImage: "figure.run")
35
+ }
36
+ DynamicIslandExpandedRegion(.trailing) {
37
+ Text(distance(context.state.distanceMeters)).monospacedDigit()
38
+ }
39
+ DynamicIslandExpandedRegion(.bottom) {
40
+ ProgressView(value: context.state.progress)
41
+ .tint(.green)
42
+ }
43
+ } compactLeading: {
44
+ Image(systemName: "figure.run")
45
+ } compactTrailing: {
46
+ Text(distance(context.state.distanceMeters)).monospacedDigit()
47
+ } minimal: {
48
+ Image(systemName: "figure.run")
49
+ }
50
+ .keylineTint(.green)
51
+ }
52
+ }
53
+
54
+ private func distance(_ meters: Double) -> String {
55
+ String(format: "%.2f km", meters / 1000)
56
+ }
57
+
58
+ private func duration(_ seconds: Double) -> String {
59
+ let value = max(Int(seconds), 0)
60
+ return String(format: "%02d:%02d", value / 60, value % 60)
61
+ }
62
+ }
@@ -0,0 +1,155 @@
1
+ import SwiftUI
2
+ import WatchConnectivity
3
+
4
+ @main
5
+ struct {{APP_NAME}}WatchApp: App {
6
+ @StateObject private var session = CraftWatchSession()
7
+
8
+ var body: some Scene {
9
+ WindowGroup {
10
+ CraftWatchRecordingView()
11
+ .environmentObject(session)
12
+ }
13
+ }
14
+ }
15
+
16
+ @MainActor
17
+ final class CraftWatchSession: NSObject, ObservableObject {
18
+ @Published private(set) var isPhoneReachable = false
19
+ @Published private(set) var isRecording = false
20
+ @Published private(set) var isPaused = false
21
+ @Published private(set) var distanceMeters = 0.0
22
+ @Published private(set) var durationSeconds = 0.0
23
+ @Published private(set) var status = "Ready"
24
+
25
+ private let session: WCSession?
26
+
27
+ override init() {
28
+ if WCSession.isSupported() {
29
+ session = .default
30
+ } else {
31
+ session = nil
32
+ }
33
+ super.init()
34
+ session?.delegate = self
35
+ session?.activate()
36
+ }
37
+
38
+ func toggleRecording() {
39
+ let action: String
40
+ if !isRecording {
41
+ action = "start"
42
+ } else if isPaused {
43
+ action = "resume"
44
+ } else {
45
+ action = "pause"
46
+ }
47
+ send(action: action)
48
+ }
49
+
50
+ func finishRecording() {
51
+ send(action: "finish")
52
+ }
53
+
54
+ private func send(action: String) {
55
+ guard let session, session.activationState == .activated else {
56
+ status = "Open WildLoop on iPhone"
57
+ return
58
+ }
59
+ let message: [String: Any] = ["type": "recording-control", "action": action]
60
+ if session.isReachable {
61
+ session.sendMessage(message, replyHandler: { [weak self] reply in
62
+ Task { @MainActor in self?.apply(reply) }
63
+ }, errorHandler: { [weak self] _ in
64
+ Task { @MainActor in self?.status = "Could not reach iPhone" }
65
+ })
66
+ } else {
67
+ session.transferUserInfo(message)
68
+ status = "Command queued"
69
+ }
70
+ }
71
+
72
+ private func apply(_ payload: [String: Any]) {
73
+ if let recording = payload["recording"] as? Bool { isRecording = recording }
74
+ if let paused = payload["paused"] as? Bool { isPaused = paused }
75
+ if let distance = payload["distanceMeters"] as? Double { distanceMeters = max(distance, 0) }
76
+ if let duration = payload["durationSeconds"] as? Double { durationSeconds = max(duration, 0) }
77
+ if let value = payload["status"] as? String { status = value }
78
+ }
79
+ }
80
+
81
+ extension CraftWatchSession: WCSessionDelegate {
82
+ nonisolated func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
83
+ Task { @MainActor in
84
+ isPhoneReachable = session.isReachable
85
+ status = error == nil ? "Ready" : "Connection unavailable"
86
+ apply(session.receivedApplicationContext)
87
+ }
88
+ }
89
+
90
+ nonisolated func sessionReachabilityDidChange(_ session: WCSession) {
91
+ Task { @MainActor in isPhoneReachable = session.isReachable }
92
+ }
93
+
94
+ nonisolated func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String: Any]) {
95
+ Task { @MainActor in apply(applicationContext) }
96
+ }
97
+
98
+ nonisolated func session(_ session: WCSession, didReceiveMessage message: [String: Any]) {
99
+ Task { @MainActor in apply(message) }
100
+ }
101
+
102
+ nonisolated func session(_ session: WCSession, didReceiveUserInfo userInfo: [String: Any] = [:]) {
103
+ Task { @MainActor in apply(userInfo) }
104
+ }
105
+ }
106
+
107
+ struct CraftWatchRecordingView: View {
108
+ @EnvironmentObject private var session: CraftWatchSession
109
+
110
+ var body: some View {
111
+ ScrollView {
112
+ VStack(spacing: 12) {
113
+ Image(systemName: "figure.run.circle.fill")
114
+ .font(.system(size: 34))
115
+ .foregroundStyle(.green)
116
+ .accessibilityHidden(true)
117
+ Text(session.status)
118
+ .font(.headline)
119
+ .multilineTextAlignment(.center)
120
+ HStack {
121
+ metric(distance, label: "Distance")
122
+ metric(duration, label: "Time")
123
+ }
124
+ Button(session.isRecording && !session.isPaused ? "Pause" : session.isPaused ? "Resume" : "Start") {
125
+ session.toggleRecording()
126
+ }
127
+ .buttonStyle(.borderedProminent)
128
+ .tint(.green)
129
+ if session.isRecording {
130
+ Button("Finish", role: .destructive) { session.finishRecording() }
131
+ }
132
+ Text(session.isPhoneReachable ? "iPhone connected" : "Commands sync when iPhone reconnects")
133
+ .font(.caption2)
134
+ .foregroundStyle(.secondary)
135
+ .multilineTextAlignment(.center)
136
+ }
137
+ .padding(.horizontal, 8)
138
+ }
139
+ }
140
+
141
+ private var distance: String { String(format: "%.2f km", session.distanceMeters / 1000) }
142
+ private var duration: String {
143
+ let seconds = max(Int(session.durationSeconds), 0)
144
+ return String(format: "%02d:%02d", seconds / 60, seconds % 60)
145
+ }
146
+
147
+ private func metric(_ value: String, label: String) -> some View {
148
+ VStack(spacing: 2) {
149
+ Text(value).font(.headline.monospacedDigit())
150
+ Text(label).font(.caption2).foregroundStyle(.secondary)
151
+ }
152
+ .frame(maxWidth: .infinity)
153
+ .accessibilityElement(children: .combine)
154
+ }
155
+ }
@@ -22,17 +22,18 @@
22
22
  <string>{{BUILD_NUMBER}}</string>
23
23
  <key>LSRequiresIPhoneOS</key>
24
24
  <true/>
25
- <key>UILaunchStoryboardName</key>
26
- <string>LaunchScreen</string>
25
+ <key>UILaunchScreen</key>
26
+ <dict>
27
+ <key>UIColorName</key>
28
+ <string>LaunchBackground</string>
29
+ </dict>
27
30
  <key>UIRequiredDeviceCapabilities</key>
28
31
  <array>
29
32
  <string>arm64</string>
30
33
  </array>
31
34
  <key>UISupportedInterfaceOrientations</key>
32
35
  <array>
33
- <string>UIInterfaceOrientationPortrait</string>
34
- <string>UIInterfaceOrientationLandscapeLeft</string>
35
- <string>UIInterfaceOrientationLandscapeRight</string>
36
+ {{ORIENTATIONS}}
36
37
  </array>
37
38
  <key>UIUserInterfaceStyle</key>
38
39
  <string>{{UI_STYLE}}</string>
@@ -40,10 +41,10 @@
40
41
  <string>UIStatusBarStyleLightContent</string>
41
42
  <key>UIViewControllerBasedStatusBarAppearance</key>
42
43
  <false/>
43
- <key>NSSpeechRecognitionUsageDescription</key>
44
- <string>{{APP_NAME}} uses speech recognition for voice commands.</string>
45
- <key>NSMicrophoneUsageDescription</key>
46
- <string>{{APP_NAME}} needs microphone access for voice input.</string>
44
+ {{USAGE_DESCRIPTIONS}}
45
+ {{URL_TYPES}}
46
+ {{BACKGROUND_MODES}}
47
+ {{LIVE_ACTIVITY_SUPPORT}}
47
48
  <key>NSAppTransportSecurity</key>
48
49
  <dict>
49
50
  <key>NSAllowsLocalNetworking</key>
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
7
+ <key>CFBundleDisplayName</key>
8
+ <string>{{APP_NAME}}</string>
9
+ <key>CFBundleExecutable</key>
10
+ <string>$(EXECUTABLE_NAME)</string>
11
+ <key>CFBundleIdentifier</key>
12
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+ <key>CFBundleInfoDictionaryVersion</key>
14
+ <string>6.0</string>
15
+ <key>CFBundleName</key>
16
+ <string>$(PRODUCT_NAME)</string>
17
+ <key>CFBundlePackageType</key>
18
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
19
+ <key>CFBundleShortVersionString</key>
20
+ <string>$(MARKETING_VERSION)</string>
21
+ <key>CFBundleVersion</key>
22
+ <string>$(CURRENT_PROJECT_VERSION)</string>
23
+ <key>WKCompanionAppBundleIdentifier</key>
24
+ <string>{{BUNDLE_ID}}</string>
25
+ </dict>
26
+ </plist>
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
7
+ <key>CFBundleDisplayName</key>
8
+ <string>Live Activity</string>
9
+ <key>CFBundleExecutable</key>
10
+ <string>$(EXECUTABLE_NAME)</string>
11
+ <key>CFBundleIdentifier</key>
12
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+ <key>CFBundleInfoDictionaryVersion</key>
14
+ <string>6.0</string>
15
+ <key>CFBundleName</key>
16
+ <string>$(PRODUCT_NAME)</string>
17
+ <key>CFBundlePackageType</key>
18
+ <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
19
+ <key>CFBundleShortVersionString</key>
20
+ <string>$(MARKETING_VERSION)</string>
21
+ <key>CFBundleVersion</key>
22
+ <string>$(CURRENT_PROJECT_VERSION)</string>
23
+ <key>NSExtension</key>
24
+ <dict>
25
+ <key>NSExtensionPointIdentifier</key>
26
+ <string>com.apple.widgetkit-extension</string>
27
+ </dict>
28
+ <key>NSSupportsLiveActivities</key>
29
+ <true/>
30
+ </dict>
31
+ </plist>
@@ -14,12 +14,23 @@ targets:
14
14
  platform: iOS
15
15
  sources:
16
16
  - Sources
17
- resources:
17
+ - Shared
18
18
  - path: dist
19
19
  type: folder
20
+ buildPhase: resources
20
21
  - path: craft.config.json
21
22
  optional: true
23
+ buildPhase: resources
24
+ - path: Assets.xcassets
25
+ buildPhase: resources
26
+ - path: PrivacyInfo.xcprivacy
27
+ buildPhase: resources
22
28
  settings:
23
29
  INFOPLIST_FILE: Info.plist
30
+ CODE_SIGN_ENTITLEMENTS: Craft.entitlements
24
31
  PRODUCT_BUNDLE_IDENTIFIER: {{BUNDLE_ID}}
32
+ TARGETED_DEVICE_FAMILY: "{{DEVICE_FAMILIES}}"
25
33
  SWIFT_VERSION: "5.0"
34
+ ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
35
+ {{NATIVE_DEPENDENCIES}}
36
+ {{NATIVE_TARGETS}}
@@ -149,4 +149,3 @@ export declare const log: {
149
149
  fatal: (message: string, context?: Record<string, unknown>) => void;
150
150
  };
151
151
  export default Logger;
152
- //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Browser-safe Craft mobile runtime.
3
+ *
4
+ * Import this entrypoint from code that is bundled into an STX, web, or mobile
5
+ * application. The root SDK also contains desktop packaging and process APIs,
6
+ * which intentionally target Bun and must not enter a browser bundle.
7
+ */
8
+ export * from './api/mobile.js';