bare-ui-kit 0.2.0 → 0.3.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 (89) hide show
  1. package/CMakeLists.txt +7 -1
  2. package/README.md +42 -1
  3. package/binding.m +558 -2
  4. package/index.d.ts +41 -0
  5. package/index.js +16 -0
  6. package/lib/activity-indicator-view.d.ts +29 -0
  7. package/lib/activity-indicator-view.h +181 -0
  8. package/lib/activity-indicator-view.js +56 -0
  9. package/lib/alert-action.d.ts +33 -0
  10. package/lib/alert-action.js +48 -0
  11. package/lib/alert-controller.d.ts +20 -0
  12. package/lib/alert-controller.h +199 -0
  13. package/lib/alert-controller.js +33 -0
  14. package/lib/attributed-string.d.ts +45 -0
  15. package/lib/attributed-string.h +176 -0
  16. package/lib/attributed-string.js +51 -0
  17. package/lib/attributes.js +34 -0
  18. package/lib/bezier-path.d.ts +26 -0
  19. package/lib/bezier-path.h +145 -0
  20. package/lib/bezier-path.js +51 -0
  21. package/lib/bridging.h +600 -2
  22. package/lib/color.d.ts +86 -0
  23. package/lib/color.h +286 -0
  24. package/lib/color.js +170 -0
  25. package/lib/events.js +35 -0
  26. package/lib/font-descriptor.d.ts +30 -0
  27. package/lib/font-descriptor.h +96 -0
  28. package/lib/font-descriptor.js +47 -0
  29. package/lib/font-metrics.d.ts +38 -0
  30. package/lib/font-metrics.h +109 -0
  31. package/lib/font-metrics.js +58 -0
  32. package/lib/font.d.ts +59 -0
  33. package/lib/font.h +424 -0
  34. package/lib/font.js +100 -0
  35. package/lib/handle.d.ts +5 -0
  36. package/lib/handle.js +6 -0
  37. package/lib/image-view.d.ts +15 -0
  38. package/lib/image-view.h +75 -0
  39. package/lib/image-view.js +27 -0
  40. package/lib/image.d.ts +37 -0
  41. package/lib/image.h +205 -0
  42. package/lib/image.js +60 -0
  43. package/lib/label.d.ts +51 -0
  44. package/lib/label.h +331 -0
  45. package/lib/label.js +94 -0
  46. package/lib/paragraph-style.d.ts +20 -0
  47. package/lib/paragraph-style.h +94 -0
  48. package/lib/paragraph-style.js +42 -0
  49. package/lib/pasteboard.d.ts +31 -0
  50. package/lib/pasteboard.h +123 -0
  51. package/lib/pasteboard.js +63 -0
  52. package/lib/retain.js +12 -0
  53. package/lib/runtime.m +92 -15
  54. package/lib/scene.d.ts +30 -0
  55. package/lib/scene.h +87 -0
  56. package/lib/scene.js +48 -0
  57. package/lib/scratch.js +4 -0
  58. package/lib/screen.d.ts +26 -0
  59. package/lib/screen.h +194 -0
  60. package/lib/screen.js +52 -0
  61. package/lib/scroll-view.d.ts +39 -0
  62. package/lib/scroll-view.h +246 -0
  63. package/lib/scroll-view.js +64 -0
  64. package/lib/switch.d.ts +22 -0
  65. package/lib/switch.h +166 -0
  66. package/lib/switch.js +42 -0
  67. package/lib/text-field.d.ts +103 -0
  68. package/lib/text-field.h +562 -0
  69. package/lib/text-field.js +183 -0
  70. package/lib/text-view.d.ts +59 -0
  71. package/lib/text-view.h +497 -0
  72. package/lib/text-view.js +138 -0
  73. package/lib/view-controller.d.ts +37 -0
  74. package/lib/view-controller.h +108 -20
  75. package/lib/view-controller.js +50 -5
  76. package/lib/view.d.ts +158 -0
  77. package/lib/view.h +1385 -20
  78. package/lib/view.js +276 -7
  79. package/lib/window.d.ts +44 -0
  80. package/lib/window.h +167 -27
  81. package/lib/window.js +62 -9
  82. package/lib/wrap.js +7 -0
  83. package/package.json +12 -3
  84. package/prebuilds/ios-arm64/bare +0 -0
  85. package/prebuilds/ios-arm64/bare-ui-kit.bare +0 -0
  86. package/prebuilds/ios-arm64-simulator/bare +0 -0
  87. package/prebuilds/ios-arm64-simulator/bare-ui-kit.bare +0 -0
  88. package/prebuilds/ios-x64-simulator/bare +0 -0
  89. package/prebuilds/ios-x64-simulator/bare-ui-kit.bare +0 -0
package/lib/bridging.h CHANGED
@@ -1,8 +1,606 @@
1
+ #pragma once
2
+
3
+ #import <assert.h>
1
4
  #import <js.h>
5
+ #import <stdlib.h>
6
+ #import <utf.h>
2
7
 
8
+ #import <CoreGraphics/CoreGraphics.h>
3
9
  #import <Foundation/Foundation.h>
10
+ #import <UIKit/UIKit.h>
11
+
12
+ #import "registry.h"
13
+
14
+ // UIKit keeps the same `UITouch` while a finger is down but gives it no number,
15
+ // where other platforms do. The slot a touch takes here is its number.
16
+ enum {
17
+ bare_ui_kit_touches_max = 16
18
+ };
19
+
20
+ // What the addon keeps between calls. It belongs to one instantiation, because
21
+ // an addon can be loaded more than once in a process. Bindings reach it through
22
+ // their data pointer.
23
+ typedef struct {
24
+ bare_foundation_registry_t *registry;
25
+
26
+ UITouch *touches[bare_ui_kit_touches_max];
27
+ } bare_ui_kit_state_t;
4
28
 
5
29
  static void
6
- bare_ui_kit__on_bridged_release(js_env_t *env, void *data, void *finalize_hint) {
7
- CFBridgingRelease(data);
30
+ bare_ui_kit__on_state_release(js_env_t *env, void *data, void *finalize_hint) {
31
+ bare_ui_kit_state_t *state = data;
32
+
33
+ bare_foundation_registry_release(state->registry);
34
+
35
+ free(state);
36
+ }
37
+
38
+ static bare_ui_kit_state_t *
39
+ bare_ui_kit_state_create(js_env_t *env, js_value_t *exports) {
40
+ int err;
41
+
42
+ bare_ui_kit_state_t *state = calloc(1, sizeof(bare_ui_kit_state_t));
43
+
44
+ state->registry = bare_foundation_registry_create(env, exports);
45
+
46
+ err = js_add_finalizer(env, exports, state, bare_ui_kit__on_state_release, NULL, NULL);
47
+ assert(err == 0);
48
+
49
+ return state;
50
+ }
51
+
52
+ @protocol BareEventTarget
53
+
54
+ - (int32_t)eventMask;
55
+ - (void)setEventMask:(int32_t)mask;
56
+
57
+ @end
58
+
59
+ // These throw a JavaScript error for a value of the wrong type. Without them,
60
+ // V8 would abort the whole process.
61
+ static bool
62
+ bare_ui_kit__read_number(js_env_t *env, js_value_t *value, const char *name) {
63
+ int err;
64
+
65
+ js_value_type_t type;
66
+ err = js_typeof(env, value, &type);
67
+ assert(err == 0);
68
+
69
+ if (type == js_number) return true;
70
+
71
+ err = js_throw_type_errorf(env, NULL, "Expected a number for '%s'", name);
72
+ assert(err == 0);
73
+
74
+ return false;
75
+ }
76
+
77
+ static bool
78
+ bare_ui_kit__read_bool(js_env_t *env, js_value_t *value, const char *name, bool *result) {
79
+ int err;
80
+
81
+ js_value_type_t type;
82
+ err = js_typeof(env, value, &type);
83
+ assert(err == 0);
84
+
85
+ if (type != js_boolean) {
86
+ err = js_throw_type_errorf(env, NULL, "Expected a boolean for '%s'", name);
87
+ assert(err == 0);
88
+
89
+ return false;
90
+ }
91
+
92
+ err = js_get_value_bool(env, value, result);
93
+ assert(err == 0);
94
+
95
+ return true;
96
+ }
97
+
98
+ static bool
99
+ bare_ui_kit__read_int32(js_env_t *env, js_value_t *value, const char *name, int32_t *result) {
100
+ if (!bare_ui_kit__read_number(env, value, name)) return false;
101
+
102
+ int err = js_get_value_int32(env, value, result);
103
+ assert(err == 0);
104
+
105
+ return true;
106
+ }
107
+
108
+ static bool
109
+ bare_ui_kit__read_uint32(js_env_t *env, js_value_t *value, const char *name, uint32_t *result) {
110
+ if (!bare_ui_kit__read_number(env, value, name)) return false;
111
+
112
+ int err = js_get_value_uint32(env, value, result);
113
+ assert(err == 0);
114
+
115
+ return true;
116
+ }
117
+
118
+ static bool
119
+ bare_ui_kit__read_double(js_env_t *env, js_value_t *value, const char *name, double *result) {
120
+ if (!bare_ui_kit__read_number(env, value, name)) return false;
121
+
122
+ int err = js_get_value_double(env, value, result);
123
+ assert(err == 0);
124
+
125
+ return true;
126
+ }
127
+
128
+ // Building a JavaScript object is the most expensive thing a binding does, and
129
+ // a typed callback cannot do it. So the caller passes a buffer and the values
130
+ // are written into it. Reading the buffer needs no handle scope.
131
+ static bool
132
+ bare_ui_kit__buffer(js_env_t *env, js_value_t *value, uint32_t offset, uint32_t count, double **result) {
133
+ int err;
134
+
135
+ bool is_arraybuffer;
136
+ err = js_is_arraybuffer(env, value, &is_arraybuffer);
137
+ assert(err == 0);
138
+
139
+ if (!is_arraybuffer) return false;
140
+
141
+ void *data;
142
+ size_t len;
143
+ err = js_get_arraybuffer_info(env, value, &data, &len);
144
+ assert(err == 0);
145
+
146
+ if ((uint64_t) offset + (uint64_t) count * sizeof(double) > len) return false;
147
+
148
+ *result = (double *) ((uint8_t *) data + offset);
149
+
150
+ return true;
151
+ }
152
+
153
+ static js_value_t *
154
+ bare_ui_kit__from_string(js_env_t *env, NSString *string) {
155
+ int err;
156
+
157
+ js_value_t *result;
158
+
159
+ if (string == nil) {
160
+ err = js_get_null(env, &result);
161
+ assert(err == 0);
162
+ } else {
163
+ err = js_create_string_utf8(env, (const utf8_t *) [string UTF8String], -1, &result);
164
+ assert(err == 0);
165
+ }
166
+
167
+ return result;
168
+ }
169
+
170
+ static NSString *
171
+ bare_ui_kit__to_string(js_env_t *env, js_value_t *value) {
172
+ int err;
173
+
174
+ js_value_type_t type;
175
+ err = js_typeof(env, value, &type);
176
+ assert(err == 0);
177
+
178
+ if (type == js_null || type == js_undefined) return nil;
179
+
180
+ size_t len;
181
+ err = js_get_value_string_utf8(env, value, NULL, 0, &len);
182
+ assert(err == 0);
183
+
184
+ len += 1 /* NULL */;
185
+
186
+ char *data = malloc(len);
187
+
188
+ err = js_get_value_string_utf8(env, value, (utf8_t *) data, len, &len);
189
+ assert(err == 0);
190
+
191
+ NSString *result = [NSString stringWithUTF8String:data];
192
+
193
+ free(data);
194
+
195
+ return result;
196
+ }
197
+
198
+ static js_value_t *
199
+ bare_ui_kit__from_rect(js_env_t *env, CGRect rect) {
200
+ int err;
201
+
202
+ js_value_t *result;
203
+ err = js_create_object(env, &result);
204
+ assert(err == 0);
205
+
206
+ #define V(name, n) \
207
+ { \
208
+ js_value_t *val; \
209
+ err = js_create_double(env, n, &val); \
210
+ assert(err == 0); \
211
+ err = js_set_named_property(env, result, name, val); \
212
+ assert(err == 0); \
213
+ }
214
+
215
+ V("x", rect.origin.x)
216
+ V("y", rect.origin.y)
217
+ V("width", rect.size.width)
218
+ V("height", rect.size.height)
219
+ #undef V
220
+
221
+ return result;
222
+ }
223
+
224
+ static js_value_t *
225
+ bare_ui_kit__from_range(js_env_t *env, NSRange range) {
226
+ int err;
227
+
228
+ js_value_t *result;
229
+ err = js_create_object(env, &result);
230
+ assert(err == 0);
231
+
232
+ #define V(name, n) \
233
+ { \
234
+ js_value_t *val; \
235
+ err = js_create_int32(env, (int32_t) n, &val); \
236
+ assert(err == 0); \
237
+ err = js_set_named_property(env, result, name, val); \
238
+ assert(err == 0); \
239
+ }
240
+
241
+ V("location", range.location)
242
+ V("length", range.length)
243
+ #undef V
244
+
245
+ return result;
246
+ }
247
+
248
+ static js_value_t *
249
+ bare_ui_kit__from_size(js_env_t *env, CGSize size) {
250
+ int err;
251
+
252
+ js_value_t *result;
253
+ err = js_create_object(env, &result);
254
+ assert(err == 0);
255
+
256
+ #define V(name, n) \
257
+ { \
258
+ js_value_t *val; \
259
+ err = js_create_double(env, n, &val); \
260
+ assert(err == 0); \
261
+ err = js_set_named_property(env, result, name, val); \
262
+ assert(err == 0); \
263
+ }
264
+
265
+ V("width", size.width)
266
+ V("height", size.height)
267
+ #undef V
268
+
269
+ return result;
270
+ }
271
+
272
+ static js_value_t *
273
+ bare_ui_kit__from_point(js_env_t *env, CGPoint point) {
274
+ int err;
275
+
276
+ js_value_t *result;
277
+ err = js_create_object(env, &result);
278
+ assert(err == 0);
279
+
280
+ #define V(name, n) \
281
+ { \
282
+ js_value_t *val; \
283
+ err = js_create_double(env, n, &val); \
284
+ assert(err == 0); \
285
+ err = js_set_named_property(env, result, name, val); \
286
+ assert(err == 0); \
287
+ }
288
+
289
+ V("x", point.x)
290
+ V("y", point.y)
291
+ #undef V
292
+
293
+ return result;
294
+ }
295
+
296
+ // Only these text attributes cross. Anything else in the object is ignored.
297
+ #define BARE_UI_KIT_ATTRIBUTES(V) \
298
+ V("font", NSFontAttributeName) \
299
+ V("foregroundColor", NSForegroundColorAttributeName) \
300
+ V("backgroundColor", NSBackgroundColorAttributeName) \
301
+ V("paragraphStyle", NSParagraphStyleAttributeName)
302
+
303
+ // The attributes that are numbers rather than objects.
304
+ #define BARE_UI_KIT_ATTRIBUTES_NUMBER(V) \
305
+ V("kern", NSKernAttributeName) \
306
+ V("baselineOffset", NSBaselineOffsetAttributeName) \
307
+ V("underlineStyle", NSUnderlineStyleAttributeName) \
308
+ V("strikethroughStyle", NSStrikethroughStyleAttributeName)
309
+
310
+ static js_value_t *
311
+ bare_ui_kit__from_attributes(js_env_t *env, bare_ui_kit_state_t *state, NSDictionary<NSAttributedStringKey, id> *attributes) {
312
+ int err;
313
+
314
+ js_value_t *result;
315
+ err = js_create_object(env, &result);
316
+ assert(err == 0);
317
+
318
+ #define V(key, name) \
319
+ if (attributes[name] != nil) { \
320
+ err = js_set_named_property(env, result, key, bare_foundation_bridge(env, state->registry, attributes[name])); \
321
+ assert(err == 0); \
322
+ }
323
+ BARE_UI_KIT_ATTRIBUTES(V)
324
+ #undef V
325
+
326
+ return result;
327
+ }
328
+
329
+ static NSDictionary<NSAttributedStringKey, id> *
330
+ bare_ui_kit__to_attributes(js_env_t *env, bare_ui_kit_state_t *state, js_value_t *value) {
331
+ int err;
332
+
333
+ js_value_type_t type;
334
+ err = js_typeof(env, value, &type);
335
+ assert(err == 0);
336
+
337
+ NSMutableDictionary<NSAttributedStringKey, id> *result = [NSMutableDictionary dictionary];
338
+
339
+ if (type != js_object) return result;
340
+
341
+ #define V(key, name) \
342
+ { \
343
+ js_value_t *val; \
344
+ err = js_get_named_property(env, value, key, &val); \
345
+ assert(err == 0); \
346
+ id object = bare_foundation_to_object(env, state->registry, val); \
347
+ if (object != nil) result[name] = object; \
348
+ }
349
+ BARE_UI_KIT_ATTRIBUTES(V)
350
+ #undef V
351
+
352
+ #define V(key, name) \
353
+ { \
354
+ js_value_t *val; \
355
+ err = js_get_named_property(env, value, key, &val); \
356
+ assert(err == 0); \
357
+ js_value_type_t t; \
358
+ err = js_typeof(env, val, &t); \
359
+ assert(err == 0); \
360
+ if (t == js_number) { \
361
+ double n; \
362
+ err = js_get_value_double(env, val, &n); \
363
+ assert(err == 0); \
364
+ result[name] = @(n); \
365
+ } \
366
+ }
367
+ BARE_UI_KIT_ATTRIBUTES_NUMBER(V)
368
+ #undef V
369
+
370
+ return result;
371
+ }
372
+
373
+ static js_value_t *
374
+ bare_ui_kit__from_objects(js_env_t *env, bare_ui_kit_state_t *state, NSArray *objects) {
375
+ int err;
376
+
377
+ js_value_t *result;
378
+ err = js_create_array_with_length(env, objects.count, &result);
379
+ assert(err == 0);
380
+
381
+ for (NSUInteger i = 0, n = objects.count; i < n; i++) {
382
+ err = js_set_element(env, result, (uint32_t) i, bare_foundation_bridge(env, state->registry, objects[i]));
383
+ assert(err == 0);
384
+ }
385
+
386
+ return result;
387
+ }
388
+
389
+ static bool
390
+ bare_ui_kit__handler(js_env_t *env, js_value_t *receiver, const char *name, js_value_t **result) {
391
+ int err = js_get_named_property(env, receiver, name, result);
392
+ assert(err == 0);
393
+
394
+ js_value_type_t type;
395
+ err = js_typeof(env, *result, &type);
396
+ assert(err == 0);
397
+
398
+ return type == js_function;
399
+ }
400
+
401
+ static void
402
+ bare_ui_kit__emit(js_env_t *env, js_ref_t *ctx, const char *name) {
403
+ int err;
404
+
405
+ js_handle_scope_t *scope;
406
+ err = js_open_handle_scope(env, &scope);
407
+ assert(err == 0);
408
+
409
+ js_value_t *receiver;
410
+ err = js_get_reference_value(env, ctx, &receiver);
411
+ assert(err == 0);
412
+
413
+ // The context is weak, so it is empty once the wrapper has been collected.
414
+ js_value_t *fn;
415
+
416
+ if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
417
+ err = js_call_function(env, receiver, fn, 0, NULL, NULL);
418
+ (void) err;
419
+ }
420
+
421
+ err = js_close_handle_scope(env, scope);
422
+ assert(err == 0);
423
+ }
424
+
425
+ // Events pass their values as arguments rather than as an object, because a
426
+ // move fires on every frame and an object each time would allocate on every
427
+ // frame.
428
+ static void
429
+ bare_ui_kit__emit_event(js_env_t *env, js_ref_t *ctx, const char *name, int32_t type, double x, double y, int32_t pointer) {
430
+ int err;
431
+
432
+ js_handle_scope_t *scope;
433
+ err = js_open_handle_scope(env, &scope);
434
+ assert(err == 0);
435
+
436
+ js_value_t *receiver;
437
+ err = js_get_reference_value(env, ctx, &receiver);
438
+ assert(err == 0);
439
+
440
+ js_value_t *fn;
441
+
442
+ if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
443
+ js_value_t *argv[4];
444
+
445
+ err = js_create_int32(env, type, &argv[0]);
446
+ assert(err == 0);
447
+
448
+ err = js_create_double(env, x, &argv[1]);
449
+ assert(err == 0);
450
+
451
+ err = js_create_double(env, y, &argv[2]);
452
+ assert(err == 0);
453
+
454
+ err = js_create_int32(env, pointer, &argv[3]);
455
+ assert(err == 0);
456
+
457
+ err = js_call_function(env, receiver, fn, 4, argv, NULL);
458
+ (void) err;
459
+ }
460
+
461
+ err = js_close_handle_scope(env, scope);
462
+ assert(err == 0);
463
+ }
464
+
465
+ // Emit an edit before it happens, as the range it replaces and the new text.
466
+ static void
467
+ bare_ui_kit__emit_replacement(js_env_t *env, js_ref_t *ctx, const char *name, int32_t location, int32_t length, NSString *string) {
468
+ int err;
469
+
470
+ js_handle_scope_t *scope;
471
+ err = js_open_handle_scope(env, &scope);
472
+ assert(err == 0);
473
+
474
+ js_value_t *receiver;
475
+ err = js_get_reference_value(env, ctx, &receiver);
476
+ assert(err == 0);
477
+
478
+ js_value_t *fn;
479
+
480
+ if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
481
+ js_value_t *argv[3];
482
+
483
+ err = js_create_int32(env, location, &argv[0]);
484
+ assert(err == 0);
485
+
486
+ err = js_create_int32(env, length, &argv[1]);
487
+ assert(err == 0);
488
+
489
+ argv[2] = bare_ui_kit__from_string(env, string);
490
+
491
+ err = js_call_function(env, receiver, fn, 3, argv, NULL);
492
+ (void) err;
493
+ }
494
+
495
+ err = js_close_handle_scope(env, scope);
496
+ assert(err == 0);
497
+ }
498
+
499
+ static void
500
+ bare_ui_kit__emit_rect(js_env_t *env, js_ref_t *ctx, const char *name, CGRect rect) {
501
+ int err;
502
+
503
+ js_handle_scope_t *scope;
504
+ err = js_open_handle_scope(env, &scope);
505
+ assert(err == 0);
506
+
507
+ js_value_t *receiver;
508
+ err = js_get_reference_value(env, ctx, &receiver);
509
+ assert(err == 0);
510
+
511
+ js_value_t *fn;
512
+
513
+ if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
514
+ js_value_t *argv[4];
515
+
516
+ err = js_create_double(env, rect.origin.x, &argv[0]);
517
+ assert(err == 0);
518
+
519
+ err = js_create_double(env, rect.origin.y, &argv[1]);
520
+ assert(err == 0);
521
+
522
+ err = js_create_double(env, rect.size.width, &argv[2]);
523
+ assert(err == 0);
524
+
525
+ err = js_create_double(env, rect.size.height, &argv[3]);
526
+ assert(err == 0);
527
+
528
+ err = js_call_function(env, receiver, fn, 4, argv, NULL);
529
+ (void) err;
530
+ }
531
+
532
+ err = js_close_handle_scope(env, scope);
533
+ assert(err == 0);
534
+ }
535
+
536
+ static void
537
+ bare_ui_kit__emit_point(js_env_t *env, js_ref_t *ctx, const char *name, double x, double y) {
538
+ int err;
539
+
540
+ js_handle_scope_t *scope;
541
+ err = js_open_handle_scope(env, &scope);
542
+ assert(err == 0);
543
+
544
+ js_value_t *receiver;
545
+ err = js_get_reference_value(env, ctx, &receiver);
546
+ assert(err == 0);
547
+
548
+ js_value_t *fn;
549
+
550
+ if (receiver != NULL && bare_ui_kit__handler(env, receiver, name, &fn)) {
551
+ js_value_t *argv[2];
552
+
553
+ err = js_create_double(env, x, &argv[0]);
554
+ assert(err == 0);
555
+
556
+ err = js_create_double(env, y, &argv[1]);
557
+ assert(err == 0);
558
+
559
+ err = js_call_function(env, receiver, fn, 2, argv, NULL);
560
+ (void) err;
561
+ }
562
+
563
+ err = js_close_handle_scope(env, scope);
564
+ assert(err == 0);
565
+ }
566
+
567
+ static js_value_t *
568
+ bare_ui_kit_event_mask(js_env_t *env, js_callback_info_t *info) {
569
+ int err;
570
+
571
+ size_t argc = 2;
572
+ js_value_t *argv[2];
573
+
574
+ bare_ui_kit_state_t *state;
575
+ err = js_get_callback_info(env, info, &argc, argv, NULL, (void **) &state);
576
+ assert(err == 0);
577
+
578
+ assert(argc == 1 || argc == 2);
579
+
580
+ void *handle;
581
+ if (bare_foundation_read_tag(env, state->registry, argv[0], "handle", &handle) < 0) return NULL;
582
+
583
+ js_value_t *result = NULL;
584
+
585
+ @autoreleasepool {
586
+ id object = (__bridge id) handle;
587
+
588
+ // An object of a plain UIKit class has nothing to report, so listening to
589
+ // it does nothing.
590
+ if (![object conformsToProtocol:@protocol(BareEventTarget)]) return NULL;
591
+
592
+ id<BareEventTarget> target = object;
593
+
594
+ if (argc == 1) {
595
+ err = js_create_int32(env, target.eventMask, &result);
596
+ assert(err == 0);
597
+ } else {
598
+ int32_t mask;
599
+ if (!bare_ui_kit__read_int32(env, argv[1], "mask", &mask)) return NULL;
600
+
601
+ target.eventMask = mask;
602
+ }
603
+ }
604
+
605
+ return result;
8
606
  }
package/lib/color.d.ts ADDED
@@ -0,0 +1,86 @@
1
+ import { tag, handle, Handle, Wrapper } from 'bare-foundation-registry'
2
+
3
+ /** A colour, as a `UIColor`. System colours follow light and dark mode. */
4
+ interface UIKitColor {
5
+ /** The components of the colour. A colour that has none, such as a pattern, reports zeroes. */
6
+ readonly components: { red: number; green: number; blue: number; alpha: number }
7
+
8
+ withAlphaComponent(alpha: number): UIKitColor
9
+
10
+ readonly [tag]: number
11
+
12
+ readonly [handle]: Handle
13
+ }
14
+
15
+ declare class UIKitColor {
16
+ protected constructor()
17
+
18
+ /** A colour from components between 0 and 1. */
19
+ static rgb(red: number, green: number, blue: number, alpha?: number): UIKitColor
20
+
21
+ static hsb(hue: number, saturation: number, brightness: number, alpha?: number): UIKitColor
22
+
23
+ static white(white: number, alpha?: number): UIKitColor
24
+
25
+ static readonly blackColor: UIKitColor
26
+
27
+ static readonly whiteColor: UIKitColor
28
+
29
+ static readonly clearColor: UIKitColor
30
+
31
+ static readonly labelColor: UIKitColor
32
+
33
+ static readonly secondaryLabelColor: UIKitColor
34
+
35
+ static readonly tertiaryLabelColor: UIKitColor
36
+
37
+ static readonly quaternaryLabelColor: UIKitColor
38
+
39
+ static readonly placeholderTextColor: UIKitColor
40
+
41
+ static readonly separatorColor: UIKitColor
42
+
43
+ static readonly opaqueSeparatorColor: UIKitColor
44
+
45
+ static readonly linkColor: UIKitColor
46
+
47
+ static readonly systemBackgroundColor: UIKitColor
48
+
49
+ static readonly secondarySystemBackgroundColor: UIKitColor
50
+
51
+ static readonly tertiarySystemBackgroundColor: UIKitColor
52
+
53
+ static readonly systemGroupedBackgroundColor: UIKitColor
54
+
55
+ static readonly systemFillColor: UIKitColor
56
+
57
+ static readonly tintColor: UIKitColor
58
+
59
+ static readonly systemRedColor: UIKitColor
60
+
61
+ static readonly systemOrangeColor: UIKitColor
62
+
63
+ static readonly systemYellowColor: UIKitColor
64
+
65
+ static readonly systemGreenColor: UIKitColor
66
+
67
+ static readonly systemMintColor: UIKitColor
68
+
69
+ static readonly systemTealColor: UIKitColor
70
+
71
+ static readonly systemCyanColor: UIKitColor
72
+
73
+ static readonly systemBlueColor: UIKitColor
74
+
75
+ static readonly systemIndigoColor: UIKitColor
76
+
77
+ static readonly systemPurpleColor: UIKitColor
78
+
79
+ static readonly systemPinkColor: UIKitColor
80
+
81
+ static readonly systemBrownColor: UIKitColor
82
+
83
+ static readonly systemGrayColor: UIKitColor
84
+ }
85
+
86
+ export = UIKitColor