@effindomv2/fui-as 0.1.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 (137) hide show
  1. package/LICENSE.md +7 -0
  2. package/browser/src/common-harness/host-imports.ts +430 -0
  3. package/browser/src/common-harness/interop.ts +39 -0
  4. package/browser/src/common-harness/managed-harness-bitmap-host.ts +92 -0
  5. package/browser/src/common-harness/managed-harness-fetch-host.ts +201 -0
  6. package/browser/src/common-harness/managed-harness-file-host.ts +1101 -0
  7. package/browser/src/common-harness/managed-harness-file-payloads.ts +143 -0
  8. package/browser/src/common-harness/managed-harness-file-types.ts +106 -0
  9. package/browser/src/common-harness/managed-harness-session.ts +15 -0
  10. package/browser/src/common-harness/managed-harness.ts +1323 -0
  11. package/browser/src/common-harness/managed-history.ts +168 -0
  12. package/browser/src/common-harness/persisted-restore-policy.ts +50 -0
  13. package/browser/src/common-harness/persisted-ui-state-controller.ts +309 -0
  14. package/browser/src/common-harness/text-session-bridge.ts +452 -0
  15. package/browser/src/common-harness/types.ts +205 -0
  16. package/browser/src/common-harness/ui-chrome.ts +191 -0
  17. package/browser/src/common-harness/ui-imports.ts +529 -0
  18. package/browser/src/common-harness/wasm-module-cache.ts +47 -0
  19. package/browser/src/common-harness.ts +27 -0
  20. package/browser/src/file-processing-worker.ts +89 -0
  21. package/browser/src/host-events.ts +97 -0
  22. package/browser/src/host-services.ts +203 -0
  23. package/browser/src/index.ts +62 -0
  24. package/browser/src/persisted-ui-state.ts +206 -0
  25. package/browser/src/routed-harness.ts +198 -0
  26. package/browser/src/worker-bootstrap.ts +483 -0
  27. package/browser/src/worker-manager.ts +230 -0
  28. package/browser/src/worker-types.ts +50 -0
  29. package/package.json +89 -0
  30. package/scripts/build-demo-as.sh +91 -0
  31. package/scripts/build.sh +325 -0
  32. package/scripts/generate-host-events.ts +175 -0
  33. package/scripts/generate-host-services.ts +157 -0
  34. package/src/Fui.ts +205 -0
  35. package/src/FuiExports.ts +55 -0
  36. package/src/FuiPrimitives.ts +15 -0
  37. package/src/FuiWorker.ts +3 -0
  38. package/src/FuiWorkerExports.ts +6 -0
  39. package/src/bindings/ui.ts +531 -0
  40. package/src/color.ts +86 -0
  41. package/src/controls/AntiSelectionArea.ts +23 -0
  42. package/src/controls/Button.ts +750 -0
  43. package/src/controls/Checkbox.ts +181 -0
  44. package/src/controls/ContextMenu.ts +885 -0
  45. package/src/controls/ControlTemplateSet.ts +37 -0
  46. package/src/controls/Dialog.ts +355 -0
  47. package/src/controls/Dropdown.ts +856 -0
  48. package/src/controls/Form.ts +110 -0
  49. package/src/controls/NavLink.ts +211 -0
  50. package/src/controls/Popup.ts +129 -0
  51. package/src/controls/ProgressBar.ts +180 -0
  52. package/src/controls/RadioButton.ts +135 -0
  53. package/src/controls/RadioGroup.ts +244 -0
  54. package/src/controls/SelectionArea.ts +75 -0
  55. package/src/controls/Slider.ts +471 -0
  56. package/src/controls/Switch.ts +132 -0
  57. package/src/controls/TextArea.ts +20 -0
  58. package/src/controls/TextInput.ts +7 -0
  59. package/src/controls/index.ts +18 -0
  60. package/src/controls/internal/ButtonPresenter.ts +95 -0
  61. package/src/controls/internal/CheckboxIndicatorPresenter.ts +93 -0
  62. package/src/controls/internal/DropdownChevronPresenter.ts +67 -0
  63. package/src/controls/internal/DropdownFieldPresenter.ts +110 -0
  64. package/src/controls/internal/DropdownOptionRowPresenter.ts +82 -0
  65. package/src/controls/internal/PopupPresenter.ts +198 -0
  66. package/src/controls/internal/PressableIndicatorPresenter.ts +32 -0
  67. package/src/controls/internal/PressableLabeledControl.ts +221 -0
  68. package/src/controls/internal/RadioIndicatorPresenter.ts +73 -0
  69. package/src/controls/internal/SliderPresenter.ts +157 -0
  70. package/src/controls/internal/SwitchIndicatorPresenter.ts +72 -0
  71. package/src/controls/internal/TextInputCore.ts +695 -0
  72. package/src/controls/internal/TextInputPresenter.ts +72 -0
  73. package/src/controls/templating.ts +54 -0
  74. package/src/core/Action.ts +94 -0
  75. package/src/core/Actions.ts +37 -0
  76. package/src/core/Animation.ts +412 -0
  77. package/src/core/Application.ts +328 -0
  78. package/src/core/Assets.ts +264 -0
  79. package/src/core/AttachedProperties.ts +32 -0
  80. package/src/core/Bitmap.ts +70 -0
  81. package/src/core/BoundCallback.ts +104 -0
  82. package/src/core/Callbacks.ts +17 -0
  83. package/src/core/ContextMenuManager.ts +466 -0
  84. package/src/core/DebugApi.ts +30 -0
  85. package/src/core/Disposable.ts +10 -0
  86. package/src/core/DragDropManager.ts +179 -0
  87. package/src/core/DragGesture.ts +184 -0
  88. package/src/core/DynamicAssetIds.ts +24 -0
  89. package/src/core/Errors.ts +48 -0
  90. package/src/core/EventRouter.ts +408 -0
  91. package/src/core/ExternalDropManager.ts +122 -0
  92. package/src/core/Fetch.ts +264 -0
  93. package/src/core/FetchFfi.ts +15 -0
  94. package/src/core/File.ts +1002 -0
  95. package/src/core/FocusAdornerManager.ts +263 -0
  96. package/src/core/FocusVisibility.ts +36 -0
  97. package/src/core/FrameScheduler.ts +28 -0
  98. package/src/core/KeyboardScroll.ts +161 -0
  99. package/src/core/KeyboardScrollTracker.ts +386 -0
  100. package/src/core/Logger.ts +80 -0
  101. package/src/core/Navigation.ts +13 -0
  102. package/src/core/Node.ts +1708 -0
  103. package/src/core/PersistedState.ts +102 -0
  104. package/src/core/PersistedUiState.ts +142 -0
  105. package/src/core/Platform.ts +219 -0
  106. package/src/core/Signal.ts +89 -0
  107. package/src/core/Theme.ts +365 -0
  108. package/src/core/Timers.ts +129 -0
  109. package/src/core/ToolTip.ts +122 -0
  110. package/src/core/ToolTipManager.ts +459 -0
  111. package/src/core/Transitions.ts +34 -0
  112. package/src/core/Typography.ts +204 -0
  113. package/src/core/Worker.ts +196 -0
  114. package/src/core/bind.ts +37 -0
  115. package/src/core/event_exports.ts +596 -0
  116. package/src/core/ffi.ts +728 -0
  117. package/src/host-services/runtime.ts +25 -0
  118. package/src/nodes/FlexBox.ts +789 -0
  119. package/src/nodes/GradientStop.ts +9 -0
  120. package/src/nodes/Grid.ts +183 -0
  121. package/src/nodes/Image.ts +189 -0
  122. package/src/nodes/Portal.ts +14 -0
  123. package/src/nodes/RichText.ts +312 -0
  124. package/src/nodes/ScrollBar.ts +570 -0
  125. package/src/nodes/ScrollBox.ts +415 -0
  126. package/src/nodes/ScrollState.ts +10 -0
  127. package/src/nodes/ScrollView.ts +511 -0
  128. package/src/nodes/Svg.ts +142 -0
  129. package/src/nodes/Text.ts +145 -0
  130. package/src/nodes/TextCore.ts +558 -0
  131. package/src/nodes/VirtualList.ts +431 -0
  132. package/src/nodes/helpers.ts +25 -0
  133. package/src/nodes/index.ts +14 -0
  134. package/src/tsconfig.json +7 -0
  135. package/src/worker/Worker.ts +169 -0
  136. package/src/worker/WorkerJob.ts +65 -0
  137. package/src/worker/ffi.ts +23 -0
@@ -0,0 +1,37 @@
1
+ import { ButtonTemplate } from "./internal/ButtonPresenter";
2
+ import { CheckboxIndicatorTemplate } from "./internal/CheckboxIndicatorPresenter";
3
+ import { RadioIndicatorTemplate } from "./internal/RadioIndicatorPresenter";
4
+ import { SwitchIndicatorTemplate } from "./internal/SwitchIndicatorPresenter";
5
+ import { SliderTemplate } from "./internal/SliderPresenter";
6
+ import { DropdownFieldTemplate } from "./internal/DropdownFieldPresenter";
7
+ import { DropdownChevronTemplate } from "./internal/DropdownChevronPresenter";
8
+ import { DropdownOptionRowTemplate } from "./internal/DropdownOptionRowPresenter";
9
+ import { TextInputTemplate } from "./internal/TextInputPresenter";
10
+
11
+ export class ControlTemplateSet {
12
+ button: ButtonTemplate | null = null;
13
+ checkboxIndicator: CheckboxIndicatorTemplate | null = null;
14
+ radioIndicator: RadioIndicatorTemplate | null = null;
15
+ switchIndicator: SwitchIndicatorTemplate | null = null;
16
+ slider: SliderTemplate | null = null;
17
+ dropdownField: DropdownFieldTemplate | null = null;
18
+ dropdownChevron: DropdownChevronTemplate | null = null;
19
+ dropdownOptionRow: DropdownOptionRowTemplate | null = null;
20
+ textInput: TextInputTemplate | null = null;
21
+ textArea: TextInputTemplate | null = null;
22
+ }
23
+
24
+ let activeControlTemplatesValue: ControlTemplateSet | null = null;
25
+
26
+ export function getControlTemplates(): ControlTemplateSet | null {
27
+ return activeControlTemplatesValue;
28
+ }
29
+
30
+ export function useControlTemplates(templates: ControlTemplateSet | null): ControlTemplateSet | null {
31
+ activeControlTemplatesValue = templates;
32
+ return activeControlTemplatesValue;
33
+ }
34
+
35
+ export function clearControlTemplates(): void {
36
+ activeControlTemplatesValue = null;
37
+ }
@@ -0,0 +1,355 @@
1
+ import * as ui from "../bindings/ui";
2
+ import { Callback0, Handler0 } from "../core/BoundCallback";
3
+ import { AlignItems, BorderStyle, FlexDirection, JustifyContent, SemanticRole, Unit } from "../core/ffi";
4
+ import { bind0 } from "../core/bind";
5
+ import { HandlerAction } from "../core/Action";
6
+ import { Disposable, disposeAll } from "../core/Disposable";
7
+ import { Theme, activeTheme } from "../core/Theme";
8
+ import { FlexBox, Portal, TextCore } from "../nodes";
9
+ import { Button } from "./Button";
10
+ import { Form } from "./Form";
11
+
12
+ const DIALOG_CARD_WIDTH: f32 = 420.0;
13
+ const DIALOG_BACKGROUND_BLUR: f32 = 16.0;
14
+ const DIALOG_SHADOW_OFFSET_X: f32 = 0.0;
15
+ const DIALOG_SHADOW_OFFSET_Y: f32 = 8.0;
16
+ const DIALOG_SHADOW_BLUR: f32 = 10.0;
17
+ const DIALOG_SHADOW_SPREAD: f32 = 0.0;
18
+
19
+ function handleDialogBackdropClick(): void {
20
+ Dialog.cancelActiveDialog();
21
+ }
22
+
23
+ function handleDialogAcceptAction(): void {
24
+ Dialog.acceptActiveDialog();
25
+ }
26
+
27
+ function handleDialogCancelAction(): void {
28
+ Dialog.cancelActiveDialog();
29
+ }
30
+
31
+ function absorbDialogCardPointer(_x: f32, _y: f32): void {}
32
+
33
+ export class Dialog extends Portal {
34
+ private static activeInstance: Dialog | null = null;
35
+
36
+ private readonly titleNode: TextCore = new TextCore("")
37
+ .selectable(false)
38
+ .semanticRole(SemanticRole.Heading) as TextCore;
39
+ private readonly bodyNode: TextCore = new TextCore("")
40
+ .selectable(false)
41
+ .semanticRole(SemanticRole.StaticText) as TextCore;
42
+ private readonly cancelButton: Button = new Button("Cancel")
43
+ .onClick(handleDialogCancelAction)
44
+ .width(108.0, Unit.Pixel) as Button;
45
+ private readonly acceptButton: Button = new Button("OK")
46
+ .onClick(handleDialogAcceptAction)
47
+ .width(108.0, Unit.Pixel) as Button;
48
+ private readonly buttonsRow: FlexBox = new FlexBox()
49
+ .flexDirection(FlexDirection.Row)
50
+ .justifyContent(JustifyContent.End)
51
+ .alignItems(AlignItems.Center)
52
+ .width(100.0, Unit.Percent)
53
+ .child(this.acceptButton)
54
+ .child(new FlexBox().width(12.0, Unit.Pixel).height(1.0, Unit.Pixel))
55
+ .child(this.cancelButton) as FlexBox;
56
+ private readonly form: Form = new Form()
57
+ .defaultBtn(this.acceptButton)
58
+ .cancelBtn(this.cancelButton)
59
+ .width(100.0, Unit.Percent)
60
+ .child(this.buttonsRow) as Form;
61
+ private readonly card: FlexBox = new FlexBox()
62
+ .width(DIALOG_CARD_WIDTH, Unit.Pixel)
63
+ .flexDirection(FlexDirection.Column)
64
+ .child(this.titleNode)
65
+ .child(new FlexBox().width(100.0, Unit.Percent).height(12.0, Unit.Pixel))
66
+ .child(this.bodyNode)
67
+ .child(new FlexBox().width(100.0, Unit.Percent).height(24.0, Unit.Pixel))
68
+ .child(this.form)
69
+ .onPointerDown(absorbDialogCardPointer)
70
+ .semanticRole(SemanticRole.Dialog) as FlexBox;
71
+ private readonly overlay: FlexBox = new FlexBox()
72
+ .width(100.0, Unit.Percent)
73
+ .height(100.0, Unit.Percent)
74
+ .justifyContent(JustifyContent.Center)
75
+ .alignItems(AlignItems.Center)
76
+ .child(this.card)
77
+ .onClick(handleDialogBackdropClick) as FlexBox;
78
+ private isDialogVisible: bool = false;
79
+ private acceptCallback: (() => void) | null = null;
80
+ private acceptBinding: Callback0 | null = null;
81
+ private cancelCallback: (() => void) | null = null;
82
+ private cancelBinding: Callback0 | null = null;
83
+ private semanticScopeToken: u32 = 0;
84
+ private readonly disposables: Array<Disposable> = new Array<Disposable>();
85
+ private backdropColorValue: u32 = activeTheme.value.colors.dialogBackdrop;
86
+ private dialogBackgroundBlurSigmaValue: f32 = DIALOG_BACKGROUND_BLUR;
87
+ private shadowColorValue: u32 = activeTheme.value.colors.dialogShadow;
88
+ private shadowOffsetXValue: f32 = DIALOG_SHADOW_OFFSET_X;
89
+ private shadowOffsetYValue: f32 = DIALOG_SHADOW_OFFSET_Y;
90
+ private shadowBlurSigmaValue: f32 = DIALOG_SHADOW_BLUR;
91
+ private shadowSpreadValue: f32 = DIALOG_SHADOW_SPREAD;
92
+ private cardBackgroundColorValue: u32 = activeTheme.value.colors.surface;
93
+ private cardBorderWidthValue: f32 = 1.0;
94
+ private cardBorderColorValue: u32 = activeTheme.value.colors.border;
95
+ private cardBorderStyleValue: BorderStyle = BorderStyle.Solid;
96
+ private cardCornerRadiusValue: f32 = activeTheme.value.spacing.md;
97
+ private backdropColorOverridden: bool = false;
98
+ private shadowOverridden: bool = false;
99
+ private cardBackgroundOverridden: bool = false;
100
+ private cardBorderOverridden: bool = false;
101
+ private cardCornerRadiusOverridden: bool = false;
102
+
103
+ constructor(title: string = "", body: string = "") {
104
+ super();
105
+
106
+ this.positionAbsolute();
107
+ this.position(0.0, 0.0);
108
+ this.width(100.0, Unit.Percent);
109
+ this.height(100.0, Unit.Percent);
110
+
111
+ this.content(title, body);
112
+ this.track(activeTheme.addAction(new HandlerAction<Dialog, Theme>(this, (dialog: Dialog, theme: Theme): void => {
113
+ dialog.handleThemeChanged(theme);
114
+ })));
115
+ this.applyTheme();
116
+ }
117
+
118
+ static acceptActiveDialog(): void {
119
+ const dialog = Dialog.activeInstance;
120
+ if (dialog !== null) {
121
+ dialog.accept();
122
+ }
123
+ }
124
+
125
+ static cancelActiveDialog(): void {
126
+ const dialog = Dialog.activeInstance;
127
+ if (dialog !== null) {
128
+ dialog.cancel();
129
+ }
130
+ }
131
+
132
+ onAccept(cb: () => void): this {
133
+ this.acceptCallback = cb;
134
+ this.acceptBinding = null;
135
+ return this;
136
+ }
137
+
138
+ bindAccept<Owner>(owner: Owner, handler: Handler0<Owner>): this {
139
+ this.acceptCallback = null;
140
+ this.acceptBinding = bind0<Owner>(owner, handler);
141
+ return this;
142
+ }
143
+
144
+ onAcceptWith<Owner>(owner: Owner, handler: Handler0<Owner>): this {
145
+ this.bindAccept(owner, handler);
146
+ return this;
147
+ }
148
+
149
+ onCancel(cb: () => void): this {
150
+ this.cancelCallback = cb;
151
+ this.cancelBinding = null;
152
+ return this;
153
+ }
154
+
155
+ bindCancel<Owner>(owner: Owner, handler: Handler0<Owner>): this {
156
+ this.cancelCallback = null;
157
+ this.cancelBinding = bind0<Owner>(owner, handler);
158
+ return this;
159
+ }
160
+
161
+ onCancelWith<Owner>(owner: Owner, handler: Handler0<Owner>): this {
162
+ this.bindCancel(owner, handler);
163
+ return this;
164
+ }
165
+
166
+ get titleText(): TextCore {
167
+ return this.titleNode;
168
+ }
169
+
170
+ get bodyText(): TextCore {
171
+ return this.bodyNode;
172
+ }
173
+
174
+ get acceptActionButton(): Button {
175
+ return this.acceptButton;
176
+ }
177
+
178
+ get cancelActionButton(): Button {
179
+ return this.cancelButton;
180
+ }
181
+
182
+ backdropColor(color: u32): this {
183
+ this.backdropColorOverridden = true;
184
+ this.backdropColorValue = color;
185
+ this.applyTheme();
186
+ return this;
187
+ }
188
+
189
+ backgroundBlur(sigma: f32): this {
190
+ this.dialogBackgroundBlurSigmaValue = sigma;
191
+ this.applyTheme();
192
+ return this;
193
+ }
194
+
195
+ cardShadow(color: u32, offsetX: f32, offsetY: f32, blurSigma: f32, spread: f32 = 0.0): this {
196
+ this.shadowOverridden = true;
197
+ this.shadowColorValue = color;
198
+ this.shadowOffsetXValue = offsetX;
199
+ this.shadowOffsetYValue = offsetY;
200
+ this.shadowBlurSigmaValue = blurSigma;
201
+ this.shadowSpreadValue = spread;
202
+ this.applyTheme();
203
+ return this;
204
+ }
205
+
206
+ cardColor(color: u32): this {
207
+ this.cardBackgroundOverridden = true;
208
+ this.cardBackgroundColorValue = color;
209
+ this.applyTheme();
210
+ return this;
211
+ }
212
+
213
+ cardBorder(width: f32, color: u32, style: BorderStyle = BorderStyle.Solid): this {
214
+ this.cardBorderOverridden = true;
215
+ this.cardBorderWidthValue = width;
216
+ this.cardBorderColorValue = color;
217
+ this.cardBorderStyleValue = style;
218
+ this.applyTheme();
219
+ return this;
220
+ }
221
+
222
+ cardCornerRadius(radius: f32): this {
223
+ this.cardCornerRadiusOverridden = true;
224
+ this.cardCornerRadiusValue = radius;
225
+ this.applyTheme();
226
+ return this;
227
+ }
228
+
229
+ content(title: string, body: string): this {
230
+ this.titleNode.text(title);
231
+ this.titleNode.semanticLabel(title);
232
+ this.bodyNode.text(body);
233
+ this.bodyNode.semanticLabel(body);
234
+ this.card.semanticLabel(title);
235
+ return this;
236
+ }
237
+
238
+ show(): void {
239
+ this.applyTheme();
240
+ if (this.overlay.parentNode === null) {
241
+ this.addChildNode(this.overlay);
242
+ }
243
+ if (this.semanticScopeToken == 0 && this.overlay.builtHandle != 0) {
244
+ this.semanticScopeToken = ui.pushSemanticScope(this.overlay.builtHandle);
245
+ }
246
+ this.form.activate();
247
+ this.acceptButton.focusNow();
248
+ this.isDialogVisible = true;
249
+ Dialog.activeInstance = this;
250
+ }
251
+
252
+ hide(): void {
253
+ if (!this.isDialogVisible && this.overlay.parentNode === null) {
254
+ return;
255
+ }
256
+ this.form.deactivate();
257
+ if (this.semanticScopeToken != 0) {
258
+ ui.removeSemanticScope(this.semanticScopeToken);
259
+ this.semanticScopeToken = 0;
260
+ }
261
+ this.removeChildNode(this.overlay);
262
+ this.isDialogVisible = false;
263
+ if (Dialog.activeInstance === this) {
264
+ Dialog.activeInstance = null;
265
+ }
266
+ }
267
+
268
+ private disposeControl(): void {
269
+ this.form.deactivate();
270
+ if (this.semanticScopeToken != 0) {
271
+ ui.removeSemanticScope(this.semanticScopeToken);
272
+ this.semanticScopeToken = 0;
273
+ }
274
+ disposeAll(this.disposables);
275
+ }
276
+
277
+ dispose(): void {
278
+ this.hide();
279
+ this.disposeControl();
280
+ if (this.overlay.builtHandle != 0) {
281
+ this.overlay.dispose();
282
+ }
283
+ super.dispose();
284
+ }
285
+
286
+ private accept(): void {
287
+ const callback = this.acceptCallback;
288
+ this.hide();
289
+ if (callback !== null) {
290
+ callback();
291
+ }
292
+ const binding = this.acceptBinding;
293
+ if (binding !== null) {
294
+ binding.invoke();
295
+ }
296
+ }
297
+
298
+ private cancel(): void {
299
+ const callback = this.cancelCallback;
300
+ this.hide();
301
+ if (callback !== null) {
302
+ callback();
303
+ }
304
+ const binding = this.cancelBinding;
305
+ if (binding !== null) {
306
+ binding.invoke();
307
+ }
308
+ }
309
+
310
+ private handleThemeChanged(theme: Theme): void {
311
+ if (!this.backdropColorOverridden) {
312
+ this.backdropColorValue = theme.colors.dialogBackdrop;
313
+ }
314
+ if (!this.shadowOverridden) {
315
+ this.shadowColorValue = theme.colors.dialogShadow;
316
+ }
317
+ if (!this.cardBackgroundOverridden) {
318
+ this.cardBackgroundColorValue = theme.colors.surface;
319
+ }
320
+ if (!this.cardBorderOverridden) {
321
+ this.cardBorderWidthValue = 1.0;
322
+ this.cardBorderColorValue = theme.colors.border;
323
+ this.cardBorderStyleValue = BorderStyle.Solid;
324
+ }
325
+ if (!this.cardCornerRadiusOverridden) {
326
+ this.cardCornerRadiusValue = theme.spacing.md;
327
+ }
328
+ this.applyTheme();
329
+ }
330
+
331
+ private applyTheme(): void {
332
+ const theme = activeTheme.value;
333
+ this.overlay.bgColor(this.backdropColorValue);
334
+ this.overlay.backgroundBlur(this.dialogBackgroundBlurSigmaValue);
335
+ this.card.bgColor(this.cardBackgroundColorValue);
336
+ this.card.cornerRadius(this.cardCornerRadiusValue);
337
+ this.card.border(this.cardBorderWidthValue, this.cardBorderColorValue, this.cardBorderStyleValue);
338
+ this.card.dropShadow(
339
+ this.shadowColorValue,
340
+ this.shadowOffsetXValue,
341
+ this.shadowOffsetYValue,
342
+ this.shadowBlurSigmaValue,
343
+ this.shadowSpreadValue,
344
+ );
345
+ this.card.padding(24.0, 24.0, 24.0, 24.0);
346
+ this.titleNode.font(theme.fonts.heading, theme.fonts.sizeHeading);
347
+ this.titleNode.textColor(theme.colors.textPrimary);
348
+ this.bodyNode.font(theme.fonts.body, theme.fonts.sizeBody);
349
+ this.bodyNode.textColor(theme.colors.textMuted);
350
+ }
351
+
352
+ private track(disposable: Disposable): void {
353
+ this.disposables.push(disposable);
354
+ }
355
+ }