craft-native 0.0.37 → 0.0.49

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 (89) hide show
  1. package/dist/android/src/index.js +268 -0
  2. package/dist/android/src/index.js.map +10 -0
  3. package/dist/android/templates/AndroidManifest.xml.template +69 -0
  4. package/dist/android/templates/CraftBridge.kt.template +3748 -0
  5. package/dist/android/templates/CraftBridgeExtensions.kt.template +383 -0
  6. package/dist/android/templates/CraftWidgetProvider.kt.template +246 -0
  7. package/dist/android/templates/MainActivity.kt.template +109 -0
  8. package/dist/android/templates/build.gradle.kts.app.template +80 -0
  9. package/dist/android/templates/build.gradle.kts.project.template +5 -0
  10. package/dist/android/templates/fastlane/Appfile +25 -0
  11. package/dist/android/templates/fastlane/Fastfile +192 -0
  12. package/dist/android/templates/fastlane/Gemfile +7 -0
  13. package/dist/android/templates/github-workflow-android.yml +248 -0
  14. package/dist/android/templates/github-workflow-test.yml +329 -0
  15. package/dist/android/templates/settings.gradle.kts.template +18 -0
  16. package/dist/android/templates/test-bridges.html +1463 -0
  17. package/dist/api/window.d.ts +18 -0
  18. package/dist/api/window.d.ts.map +1 -1
  19. package/dist/assets/index.d.ts.map +1 -1
  20. package/dist/bridge/core.d.ts +2 -0
  21. package/dist/bridge/core.d.ts.map +1 -1
  22. package/dist/cli.js +4168 -0
  23. package/dist/components/sidebar.d.ts +5 -1
  24. package/dist/components/sidebar.d.ts.map +1 -1
  25. package/dist/dev/devtools.d.ts +1 -1
  26. package/dist/dev/devtools.d.ts.map +1 -1
  27. package/dist/dev/hot-reload.d.ts +12 -3
  28. package/dist/dev/hot-reload.d.ts.map +1 -1
  29. package/dist/index.cjs +573 -208
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +585 -216
  32. package/dist/index.js.map +45 -0
  33. package/dist/ios/src/index.js +186 -0
  34. package/dist/ios/src/index.js.map +10 -0
  35. package/dist/ios/templates/CraftApp.swift +4241 -0
  36. package/dist/ios/templates/CraftAppExtensions.swift +361 -0
  37. package/dist/ios/templates/CraftWidget.swift +247 -0
  38. package/dist/ios/templates/Info.plist.template +65 -0
  39. package/dist/ios/templates/fastlane/Appfile +45 -0
  40. package/dist/ios/templates/fastlane/Fastfile +189 -0
  41. package/dist/ios/templates/fastlane/Gemfile +7 -0
  42. package/dist/ios/templates/fastlane/Matchfile +58 -0
  43. package/dist/ios/templates/github-workflow-ios.yml +192 -0
  44. package/dist/ios/templates/github-workflow-release.yml +175 -0
  45. package/dist/ios/templates/github-workflow-test.yml +272 -0
  46. package/dist/ios/templates/project.yml.template +25 -0
  47. package/dist/ios/templates/test-bridges.html +1463 -0
  48. package/dist/package.d.ts +106 -2
  49. package/dist/package.d.ts.map +1 -1
  50. package/dist/package.test.d.ts +2 -0
  51. package/dist/package.test.d.ts.map +1 -0
  52. package/dist/styles/sidebar-templates.d.ts.map +1 -1
  53. package/dist/styles/sidebars.d.ts +12 -8
  54. package/dist/styles/sidebars.d.ts.map +1 -1
  55. package/dist/templates/projects/blank/craft.config.ts +19 -0
  56. package/dist/templates/projects/blank/index.html +27 -0
  57. package/dist/templates/projects/blank/package.json +19 -0
  58. package/dist/templates/projects/blank/src/main.ts +26 -0
  59. package/dist/templates/projects/dashboard/craft.config.ts +42 -0
  60. package/dist/templates/projects/dashboard/index.html +13 -0
  61. package/dist/templates/projects/dashboard/package.json +20 -0
  62. package/dist/templates/projects/dashboard/src/main.ts +163 -0
  63. package/dist/templates/projects/dashboard/src/styles.css +280 -0
  64. package/dist/templates/projects/drawer/craft.config.ts +47 -0
  65. package/dist/templates/projects/drawer/index.html +13 -0
  66. package/dist/templates/projects/drawer/package.json +21 -0
  67. package/dist/templates/projects/drawer/src/main.ts +406 -0
  68. package/dist/templates/projects/drawer/src/styles.css +468 -0
  69. package/dist/templates/projects/ecommerce/craft.config.ts +32 -0
  70. package/dist/templates/projects/ecommerce/index.html +13 -0
  71. package/dist/templates/projects/ecommerce/package.json +19 -0
  72. package/dist/templates/projects/ecommerce/src/main.ts +194 -0
  73. package/dist/templates/projects/ecommerce/src/styles.css +169 -0
  74. package/dist/templates/projects/social/craft.config.ts +32 -0
  75. package/dist/templates/projects/social/index.html +13 -0
  76. package/dist/templates/projects/social/package.json +19 -0
  77. package/dist/templates/projects/social/src/main.ts +270 -0
  78. package/dist/templates/projects/social/src/styles.css +216 -0
  79. package/dist/templates/projects/tabs/craft.config.ts +47 -0
  80. package/dist/templates/projects/tabs/index.html +13 -0
  81. package/dist/templates/projects/tabs/package.json +21 -0
  82. package/dist/templates/projects/tabs/src/main.ts +177 -0
  83. package/dist/templates/projects/tabs/src/styles.css +163 -0
  84. package/dist/types.d.ts +29 -0
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/updater/index.d.ts +1 -0
  87. package/dist/updater/index.d.ts.map +1 -1
  88. package/package.json +5 -12
  89. package/bin/cli.ts +0 -937
@@ -0,0 +1,406 @@
1
+ /**
2
+ * {{APP_NAME}} - Drawer Navigation Template
3
+ */
4
+
5
+ import { isMobile, haptics } from 'craft-native'
6
+
7
+ interface MenuItem {
8
+ id: string
9
+ label: string
10
+ icon: string
11
+ badge?: string
12
+ }
13
+
14
+ interface MenuSection {
15
+ title?: string
16
+ items: MenuItem[]
17
+ }
18
+
19
+ const menuSections: MenuSection[] = [
20
+ {
21
+ items: [
22
+ { id: 'home', label: 'Home', icon: '<path d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/>' },
23
+ { id: 'inbox', label: 'Inbox', icon: '<path d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"/>', badge: '3' },
24
+ { id: 'starred', label: 'Starred', icon: '<path d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/>' },
25
+ { id: 'archive', label: 'Archive', icon: '<path d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4"/>' }
26
+ ]
27
+ },
28
+ {
29
+ title: 'Labels',
30
+ items: [
31
+ { id: 'personal', label: 'Personal', icon: '<circle cx="12" cy="12" r="10" fill="#4CAF50" stroke="none"/>' },
32
+ { id: 'work', label: 'Work', icon: '<circle cx="12" cy="12" r="10" fill="#2196F3" stroke="none"/>' },
33
+ { id: 'projects', label: 'Projects', icon: '<circle cx="12" cy="12" r="10" fill="#FF9800" stroke="none"/>' }
34
+ ]
35
+ },
36
+ {
37
+ items: [
38
+ { id: 'settings', label: 'Settings', icon: '<path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/><path d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>' },
39
+ { id: 'help', label: 'Help & Feedback', icon: '<path d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>' }
40
+ ]
41
+ }
42
+ ]
43
+
44
+ let activePage = 'home'
45
+ let isDrawerOpen = false
46
+
47
+ function renderIcon(path: string): string {
48
+ return `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">${path}</svg>`
49
+ }
50
+
51
+ function toggleDrawer(): void {
52
+ isDrawerOpen = !isDrawerOpen
53
+
54
+ if (isMobile()) {
55
+ haptics.impact('light')
56
+ }
57
+
58
+ document.querySelector('.drawer')?.classList.toggle('open', isDrawerOpen)
59
+ document.querySelector('.drawer-overlay')?.classList.toggle('open', isDrawerOpen)
60
+ document.body.style.overflow = isDrawerOpen ? 'hidden' : ''
61
+ }
62
+
63
+ function closeDrawer(): void {
64
+ if (!isDrawerOpen) return
65
+ isDrawerOpen = false
66
+ document.querySelector('.drawer')?.classList.remove('open')
67
+ document.querySelector('.drawer-overlay')?.classList.remove('open')
68
+ document.body.style.overflow = ''
69
+ }
70
+
71
+ function navigateTo(pageId: string): void {
72
+ if (activePage === pageId) {
73
+ closeDrawer()
74
+ return
75
+ }
76
+
77
+ activePage = pageId
78
+
79
+ if (isMobile()) {
80
+ haptics.selection()
81
+ }
82
+
83
+ // Update drawer items
84
+ document.querySelectorAll('.drawer-item').forEach(item => {
85
+ item.classList.toggle('active', item.getAttribute('data-page') === pageId)
86
+ })
87
+
88
+ // Update pages
89
+ document.querySelectorAll('.page').forEach(page => {
90
+ page.classList.toggle('active', page.id === `page-${pageId}`)
91
+ })
92
+
93
+ // Update header title
94
+ const menuItem = menuSections.flatMap(s => s.items).find(item => item.id === pageId)
95
+ const headerTitle = document.querySelector('.header h1')
96
+ if (headerTitle && menuItem) {
97
+ headerTitle.textContent = menuItem.label
98
+ }
99
+
100
+ closeDrawer()
101
+ }
102
+
103
+ function renderHomePage(): string {
104
+ return `
105
+ <div class="card">
106
+ <h3>Welcome to {{APP_NAME}}</h3>
107
+ <p>This is a drawer navigation template built with Craft. Tap the menu icon to open the navigation drawer.</p>
108
+ </div>
109
+ <div class="card">
110
+ <h3>Recent Items</h3>
111
+ <div class="list-item">
112
+ <div class="list-item-icon">📄</div>
113
+ <div class="list-item-content">
114
+ <div class="list-item-title">Project Proposal</div>
115
+ <div class="list-item-subtitle">Modified 2 hours ago</div>
116
+ </div>
117
+ <span class="list-item-action">→</span>
118
+ </div>
119
+ <div class="list-item">
120
+ <div class="list-item-icon">📊</div>
121
+ <div class="list-item-content">
122
+ <div class="list-item-title">Q4 Report</div>
123
+ <div class="list-item-subtitle">Modified yesterday</div>
124
+ </div>
125
+ <span class="list-item-action">→</span>
126
+ </div>
127
+ <div class="list-item">
128
+ <div class="list-item-icon">📝</div>
129
+ <div class="list-item-content">
130
+ <div class="list-item-title">Meeting Notes</div>
131
+ <div class="list-item-subtitle">Modified 3 days ago</div>
132
+ </div>
133
+ <span class="list-item-action">→</span>
134
+ </div>
135
+ </div>
136
+ `
137
+ }
138
+
139
+ function renderInboxPage(): string {
140
+ return `
141
+ <div class="card">
142
+ <div class="list-item">
143
+ <div class="list-item-icon">👤</div>
144
+ <div class="list-item-content">
145
+ <div class="list-item-title">New message from Alex</div>
146
+ <div class="list-item-subtitle">Hey! Just wanted to check in about the project...</div>
147
+ </div>
148
+ </div>
149
+ <div class="list-item">
150
+ <div class="list-item-icon">🔔</div>
151
+ <div class="list-item-content">
152
+ <div class="list-item-title">System notification</div>
153
+ <div class="list-item-subtitle">Your backup completed successfully</div>
154
+ </div>
155
+ </div>
156
+ <div class="list-item">
157
+ <div class="list-item-icon">📅</div>
158
+ <div class="list-item-content">
159
+ <div class="list-item-title">Meeting reminder</div>
160
+ <div class="list-item-subtitle">Team standup in 30 minutes</div>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ `
165
+ }
166
+
167
+ function renderStarredPage(): string {
168
+ return `
169
+ <div class="empty-state">
170
+ <div class="empty-state-icon">⭐</div>
171
+ <div class="empty-state-title">No starred items</div>
172
+ <div class="empty-state-text">Items you star will appear here for quick access.</div>
173
+ </div>
174
+ `
175
+ }
176
+
177
+ function renderArchivePage(): string {
178
+ return `
179
+ <div class="empty-state">
180
+ <div class="empty-state-icon">📦</div>
181
+ <div class="empty-state-title">Archive is empty</div>
182
+ <div class="empty-state-text">Archived items will be stored here.</div>
183
+ </div>
184
+ `
185
+ }
186
+
187
+ function renderLabelPage(label: string): string {
188
+ return `
189
+ <div class="empty-state">
190
+ <div class="empty-state-icon">🏷️</div>
191
+ <div class="empty-state-title">No ${label} items</div>
192
+ <div class="empty-state-text">Items labeled as ${label} will appear here.</div>
193
+ </div>
194
+ `
195
+ }
196
+
197
+ function renderSettingsPage(): string {
198
+ return `
199
+ <div class="settings-list">
200
+ <div class="settings-item">
201
+ <span class="settings-item-label">Notifications</span>
202
+ <div class="toggle on" data-setting="notifications"></div>
203
+ </div>
204
+ <div class="settings-item">
205
+ <span class="settings-item-label">Dark Mode</span>
206
+ <div class="toggle" data-setting="darkmode"></div>
207
+ </div>
208
+ <div class="settings-item">
209
+ <span class="settings-item-label">Auto-sync</span>
210
+ <div class="toggle on" data-setting="autosync"></div>
211
+ </div>
212
+ </div>
213
+ <div class="settings-list">
214
+ <div class="settings-item">
215
+ <span class="settings-item-label">Account</span>
216
+ <span class="settings-item-value">user@example.com →</span>
217
+ </div>
218
+ <div class="settings-item">
219
+ <span class="settings-item-label">Storage</span>
220
+ <span class="settings-item-value">2.4 GB used →</span>
221
+ </div>
222
+ <div class="settings-item">
223
+ <span class="settings-item-label">Privacy</span>
224
+ <span class="settings-item-value">→</span>
225
+ </div>
226
+ </div>
227
+ `
228
+ }
229
+
230
+ function renderHelpPage(): string {
231
+ return `
232
+ <div class="card">
233
+ <h3>Getting Started</h3>
234
+ <p>This template demonstrates drawer navigation, commonly used in mobile apps. Swipe from the left edge or tap the menu button to open the drawer.</p>
235
+ </div>
236
+ <div class="card">
237
+ <h3>Contact Support</h3>
238
+ <p>Have questions or feedback? We'd love to hear from you.</p>
239
+ <div class="list-item">
240
+ <div class="list-item-icon">📧</div>
241
+ <div class="list-item-content">
242
+ <div class="list-item-title">Email Support</div>
243
+ <div class="list-item-subtitle">support@example.com</div>
244
+ </div>
245
+ </div>
246
+ <div class="list-item">
247
+ <div class="list-item-icon">💬</div>
248
+ <div class="list-item-content">
249
+ <div class="list-item-title">Live Chat</div>
250
+ <div class="list-item-subtitle">Available 9am - 5pm EST</div>
251
+ </div>
252
+ </div>
253
+ </div>
254
+ `
255
+ }
256
+
257
+ function getPageContent(pageId: string): string {
258
+ switch (pageId) {
259
+ case 'home': return renderHomePage()
260
+ case 'inbox': return renderInboxPage()
261
+ case 'starred': return renderStarredPage()
262
+ case 'archive': return renderArchivePage()
263
+ case 'personal': return renderLabelPage('Personal')
264
+ case 'work': return renderLabelPage('Work')
265
+ case 'projects': return renderLabelPage('Projects')
266
+ case 'settings': return renderSettingsPage()
267
+ case 'help': return renderHelpPage()
268
+ default: return ''
269
+ }
270
+ }
271
+
272
+ function init(): void {
273
+ const app = document.getElementById('app')!
274
+
275
+ // Get all page IDs
276
+ const allPages = menuSections.flatMap(s => s.items).map(item => item.id)
277
+
278
+ app.innerHTML = `
279
+ <div class="drawer-overlay"></div>
280
+
281
+ <aside class="drawer">
282
+ <div class="drawer-header">
283
+ <div class="drawer-header-avatar">👤</div>
284
+ <div class="drawer-header-title">User Name</div>
285
+ <div class="drawer-header-subtitle">user@example.com</div>
286
+ </div>
287
+
288
+ <nav class="drawer-content">
289
+ ${menuSections.map((section, index) => `
290
+ ${index > 0 ? '<div class="drawer-divider"></div>' : ''}
291
+ <div class="drawer-section">
292
+ ${section.title ? `<div class="drawer-section-title">${section.title}</div>` : ''}
293
+ ${section.items.map(item => `
294
+ <button class="drawer-item ${item.id === activePage ? 'active' : ''}" data-page="${item.id}">
295
+ ${renderIcon(item.icon)}
296
+ <span class="drawer-item-label">${item.label}</span>
297
+ ${item.badge ? `<span class="drawer-item-badge">${item.badge}</span>` : ''}
298
+ </button>
299
+ `).join('')}
300
+ </div>
301
+ `).join('')}
302
+ </nav>
303
+
304
+ <div class="drawer-footer">
305
+ <div class="drawer-footer-version">{{APP_NAME}} v1.0.0</div>
306
+ </div>
307
+ </aside>
308
+
309
+ <header class="header">
310
+ <button class="header-menu-btn" aria-label="Open menu">
311
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
312
+ <path d="M4 6h16M4 12h16M4 18h16"/>
313
+ </svg>
314
+ </button>
315
+ <h1>Home</h1>
316
+ <button class="header-action" aria-label="Search">
317
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
318
+ <path d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
319
+ </svg>
320
+ </button>
321
+ </header>
322
+
323
+ <main class="content">
324
+ ${allPages.map(pageId => `
325
+ <div id="page-${pageId}" class="page ${pageId === activePage ? 'active' : ''}">
326
+ ${getPageContent(pageId)}
327
+ </div>
328
+ `).join('')}
329
+ </main>
330
+
331
+ <button class="fab" aria-label="Add new">
332
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
333
+ <path d="M12 4v16m8-8H4"/>
334
+ </svg>
335
+ </button>
336
+ `
337
+
338
+ // Event listeners
339
+ document.querySelector('.header-menu-btn')?.addEventListener('click', toggleDrawer)
340
+ document.querySelector('.drawer-overlay')?.addEventListener('click', closeDrawer)
341
+
342
+ document.querySelectorAll('.drawer-item').forEach(item => {
343
+ item.addEventListener('click', () => {
344
+ const pageId = item.getAttribute('data-page')
345
+ if (pageId) navigateTo(pageId)
346
+ })
347
+ })
348
+
349
+ // Toggle switches
350
+ document.querySelectorAll('.toggle').forEach(toggle => {
351
+ toggle.addEventListener('click', () => {
352
+ toggle.classList.toggle('on')
353
+ if (isMobile()) {
354
+ haptics.impact('light')
355
+ }
356
+ })
357
+ })
358
+
359
+ // FAB
360
+ document.querySelector('.fab')?.addEventListener('click', () => {
361
+ if (isMobile()) {
362
+ haptics.impact('medium')
363
+ }
364
+ alert('Add new item')
365
+ })
366
+
367
+ // Touch gesture for opening drawer (swipe from left edge)
368
+ let touchStartX = 0
369
+ let touchStartY = 0
370
+
371
+ document.addEventListener('touchstart', (e) => {
372
+ touchStartX = e.touches[0].clientX
373
+ touchStartY = e.touches[0].clientY
374
+ }, { passive: true })
375
+
376
+ document.addEventListener('touchend', (e) => {
377
+ const touchEndX = e.changedTouches[0].clientX
378
+ const touchEndY = e.changedTouches[0].clientY
379
+ const deltaX = touchEndX - touchStartX
380
+ const deltaY = Math.abs(touchEndY - touchStartY)
381
+
382
+ // Open drawer: swipe right from left edge
383
+ if (touchStartX < 30 && deltaX > 50 && deltaY < 50 && !isDrawerOpen) {
384
+ toggleDrawer()
385
+ }
386
+ // Close drawer: swipe left when open
387
+ else if (isDrawerOpen && deltaX < -50 && deltaY < 50) {
388
+ closeDrawer()
389
+ }
390
+ }, { passive: true })
391
+
392
+ // Keyboard shortcuts
393
+ document.addEventListener('keydown', (e) => {
394
+ if (e.key === 'Escape' && isDrawerOpen) {
395
+ closeDrawer()
396
+ }
397
+ })
398
+ }
399
+
400
+ // Start app
401
+ if (document.readyState === 'loading') {
402
+ document.addEventListener('DOMContentLoaded', init)
403
+ }
404
+ else {
405
+ init()
406
+ }