@fugood/bricks-project 2.25.0-beta.3 → 2.25.0-beta.30
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/compile/action-name-map.ts +61 -0
- package/compile/index.ts +205 -17
- package/package.json +2 -2
- package/package.json.bak +2 -2
- package/skills/bricks-ctor/SKILL.md +3 -1
- package/skills/bricks-ctor/rules/animation.md +3 -2
- package/skills/bricks-ctor/rules/architecture-patterns.md +12 -0
- package/skills/bricks-ctor/rules/automations.md +11 -0
- package/skills/bricks-ctor/rules/buttress.md +97 -8
- package/skills/bricks-ctor/rules/data-calculation.md +5 -5
- package/skills/bricks-ctor/rules/verification-toolchain.md +177 -0
- package/skills/bricks-design/SKILL.md +160 -45
- package/skills/bricks-design/references/architecture-truths.md +132 -0
- package/skills/bricks-design/references/avoiding-complexity.md +91 -0
- package/skills/bricks-design/references/design-critique.md +195 -0
- package/skills/bricks-design/references/design-languages.md +265 -0
- package/skills/bricks-design/references/performance.md +116 -0
- package/skills/bricks-design/references/presentation-and-slideshow.md +137 -0
- package/skills/bricks-design/references/translating-inputs.md +152 -0
- package/skills/bricks-design/references/variations-and-tweaks.md +124 -0
- package/skills/bricks-design/references/when-the-brief-is-branded.md +284 -0
- package/skills/bricks-design/references/when-the-brief-is-vague.md +85 -0
- package/skills/bricks-design/references/workflow.md +134 -0
- package/skills/bricks-ux/SKILL.md +120 -0
- package/skills/bricks-ux/references/accessibility.md +162 -0
- package/skills/bricks-ux/references/flow-states.md +175 -0
- package/skills/bricks-ux/references/interaction-archetypes.md +189 -0
- package/skills/bricks-ux/references/monitoring-screens.md +153 -0
- package/skills/bricks-ux/references/pressable-composition.md +126 -0
- package/skills/bricks-ux/references/user-journey.md +168 -0
- package/skills/bricks-ux/references/ux-critique.md +256 -0
- package/tools/_git-author.ts +10 -2
- package/tools/_last-pushed-commit.ts +28 -0
- package/tools/_shell.ts +8 -1
- package/tools/deploy.ts +15 -0
- package/tools/mcp-tools/compile.ts +17 -7
- package/tools/mcp-tools/media.ts +4 -1
- package/tools/preview-main.mjs +18 -5
- package/tools/pull.ts +91 -16
- package/tools/push-config.ts +118 -0
- package/types/{animation.ts → animation.d.ts} +24 -8
- package/types/{automation.ts → automation.d.ts} +16 -20
- package/types/{brick-base.ts → brick-base.d.ts} +1 -1
- package/types/bricks/{Camera.ts → Camera.d.ts} +8 -8
- package/types/bricks/{Chart.ts → Chart.d.ts} +4 -4
- package/types/bricks/{GenerativeMedia.ts → GenerativeMedia.d.ts} +15 -15
- package/types/bricks/{Icon.ts → Icon.d.ts} +7 -7
- package/types/bricks/{Image.ts → Image.d.ts} +21 -9
- package/types/bricks/{Items.ts → Items.d.ts} +7 -7
- package/types/bricks/{Lottie.ts → Lottie.d.ts} +10 -10
- package/types/bricks/{Maps.ts → Maps.d.ts} +11 -11
- package/types/bricks/{QrCode.ts → QrCode.d.ts} +7 -7
- package/types/bricks/{Rect.ts → Rect.d.ts} +7 -7
- package/types/bricks/{RichText.ts → RichText.d.ts} +12 -9
- package/types/bricks/{Rive.ts → Rive.d.ts} +9 -9
- package/types/bricks/Scene3D.d.ts +596 -0
- package/types/bricks/{Sketch.ts → Sketch.d.ts} +11 -9
- package/types/bricks/{Slideshow.ts → Slideshow.d.ts} +7 -7
- package/types/bricks/{Svg.ts → Svg.d.ts} +7 -7
- package/types/bricks/{Text.ts → Text.d.ts} +9 -9
- package/types/bricks/{TextInput.ts → TextInput.d.ts} +10 -10
- package/types/bricks/{Video.ts → Video.d.ts} +12 -12
- package/types/bricks/{VideoStreaming.ts → VideoStreaming.d.ts} +10 -10
- package/types/bricks/{WebRtcStream.ts → WebRtcStream.d.ts} +1 -1
- package/types/bricks/{WebView.ts → WebView.d.ts} +4 -4
- package/types/bricks/{index.ts → index.d.ts} +1 -0
- package/types/{common.ts → common.d.ts} +3 -6
- package/types/data-calc-command/base.d.ts +57 -0
- package/types/data-calc-command/collection.d.ts +418 -0
- package/types/data-calc-command/color.d.ts +432 -0
- package/types/data-calc-command/constant.d.ts +50 -0
- package/types/data-calc-command/datetime.d.ts +147 -0
- package/types/data-calc-command/file.d.ts +129 -0
- package/types/data-calc-command/index.d.ts +13 -0
- package/types/data-calc-command/iteratee.d.ts +23 -0
- package/types/data-calc-command/logictype.d.ts +190 -0
- package/types/data-calc-command/math.d.ts +275 -0
- package/types/data-calc-command/object.d.ts +119 -0
- package/types/data-calc-command/sandbox.d.ts +58 -0
- package/types/data-calc-command/string.d.ts +407 -0
- package/types/{data-calc.ts → data-calc.d.ts} +1 -0
- package/types/{data.ts → data.d.ts} +4 -2
- package/types/generators/{Assistant.ts → Assistant.d.ts} +19 -0
- package/types/generators/{LlmGgml.ts → LlmGgml.d.ts} +38 -0
- package/types/generators/{LlmMlx.ts → LlmMlx.d.ts} +1 -0
- package/types/generators/{SpeechToTextGgml.ts → SpeechToTextGgml.d.ts} +1 -0
- package/types/generators/{ThermalPrinter.ts → ThermalPrinter.d.ts} +9 -7
- package/types/{subspace.ts → subspace.d.ts} +1 -1
- package/utils/data.ts +2 -2
- package/utils/event-props.ts +17 -0
- package/utils/id.ts +78 -27
- package/skills/bricks-design/LICENSE.txt +0 -180
- package/types/data-calc-command.ts +0 -7005
- /package/types/{canvas.ts → canvas.d.ts} +0 -0
- /package/types/{data-calc-script.ts → data-calc-script.d.ts} +0 -0
- /package/types/generators/{AlarmClock.ts → AlarmClock.d.ts} +0 -0
- /package/types/generators/{BleCentral.ts → BleCentral.d.ts} +0 -0
- /package/types/generators/{BlePeripheral.ts → BlePeripheral.d.ts} +0 -0
- /package/types/generators/{CanvasMap.ts → CanvasMap.d.ts} +0 -0
- /package/types/generators/{CastlesPay.ts → CastlesPay.d.ts} +0 -0
- /package/types/generators/{DataBank.ts → DataBank.d.ts} +0 -0
- /package/types/generators/{File.ts → File.d.ts} +0 -0
- /package/types/generators/{GraphQl.ts → GraphQl.d.ts} +0 -0
- /package/types/generators/{Http.ts → Http.d.ts} +0 -0
- /package/types/generators/{HttpServer.ts → HttpServer.d.ts} +0 -0
- /package/types/generators/{Information.ts → Information.d.ts} +0 -0
- /package/types/generators/{Intent.ts → Intent.d.ts} +0 -0
- /package/types/generators/{Iterator.ts → Iterator.d.ts} +0 -0
- /package/types/generators/{Keyboard.ts → Keyboard.d.ts} +0 -0
- /package/types/generators/{LlmAnthropicCompat.ts → LlmAnthropicCompat.d.ts} +0 -0
- /package/types/generators/{LlmAppleBuiltin.ts → LlmAppleBuiltin.d.ts} +0 -0
- /package/types/generators/{LlmMediaTekNeuroPilot.ts → LlmMediaTekNeuroPilot.d.ts} +0 -0
- /package/types/generators/{LlmOnnx.ts → LlmOnnx.d.ts} +0 -0
- /package/types/generators/{LlmOpenAiCompat.ts → LlmOpenAiCompat.d.ts} +0 -0
- /package/types/generators/{LlmQualcommAiEngine.ts → LlmQualcommAiEngine.d.ts} +0 -0
- /package/types/generators/{Mcp.ts → Mcp.d.ts} +0 -0
- /package/types/generators/{McpServer.ts → McpServer.d.ts} +0 -0
- /package/types/generators/{MediaFlow.ts → MediaFlow.d.ts} +0 -0
- /package/types/generators/{MqttBroker.ts → MqttBroker.d.ts} +0 -0
- /package/types/generators/{MqttClient.ts → MqttClient.d.ts} +0 -0
- /package/types/generators/{Question.ts → Question.d.ts} +0 -0
- /package/types/generators/{RealtimeTranscription.ts → RealtimeTranscription.d.ts} +0 -0
- /package/types/generators/{RerankerGgml.ts → RerankerGgml.d.ts} +0 -0
- /package/types/generators/{SerialPort.ts → SerialPort.d.ts} +0 -0
- /package/types/generators/{SoundPlayer.ts → SoundPlayer.d.ts} +0 -0
- /package/types/generators/{SoundRecorder.ts → SoundRecorder.d.ts} +0 -0
- /package/types/generators/{SpeechToTextOnnx.ts → SpeechToTextOnnx.d.ts} +0 -0
- /package/types/generators/{SpeechToTextPlatform.ts → SpeechToTextPlatform.d.ts} +0 -0
- /package/types/generators/{SqLite.ts → SqLite.d.ts} +0 -0
- /package/types/generators/{Step.ts → Step.d.ts} +0 -0
- /package/types/generators/{SttAppleBuiltin.ts → SttAppleBuiltin.d.ts} +0 -0
- /package/types/generators/{Tcp.ts → Tcp.d.ts} +0 -0
- /package/types/generators/{TcpServer.ts → TcpServer.d.ts} +0 -0
- /package/types/generators/{TextToSpeechAppleBuiltin.ts → TextToSpeechAppleBuiltin.d.ts} +0 -0
- /package/types/generators/{TextToSpeechGgml.ts → TextToSpeechGgml.d.ts} +0 -0
- /package/types/generators/{TextToSpeechOnnx.ts → TextToSpeechOnnx.d.ts} +0 -0
- /package/types/generators/{TextToSpeechOpenAiLike.ts → TextToSpeechOpenAiLike.d.ts} +0 -0
- /package/types/generators/{Tick.ts → Tick.d.ts} +0 -0
- /package/types/generators/{Udp.ts → Udp.d.ts} +0 -0
- /package/types/generators/{VadGgml.ts → VadGgml.d.ts} +0 -0
- /package/types/generators/{VadOnnx.ts → VadOnnx.d.ts} +0 -0
- /package/types/generators/{VadTraditional.ts → VadTraditional.d.ts} +0 -0
- /package/types/generators/{VectorStore.ts → VectorStore.d.ts} +0 -0
- /package/types/generators/{Watchdog.ts → Watchdog.d.ts} +0 -0
- /package/types/generators/{WebCrawler.ts → WebCrawler.d.ts} +0 -0
- /package/types/generators/{WebRtc.ts → WebRtc.d.ts} +0 -0
- /package/types/generators/{WebSocket.ts → WebSocket.d.ts} +0 -0
- /package/types/generators/{index.ts → index.d.ts} +0 -0
- /package/types/{index.ts → index.d.ts} +0 -0
- /package/types/{switch.ts → switch.d.ts} +0 -0
- /package/types/{system.ts → system.d.ts} +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises'
|
|
2
|
+
import { parseArgs } from 'util'
|
|
3
|
+
import { sh } from './_shell'
|
|
4
|
+
import { buildCommitArgs } from './_git-author'
|
|
5
|
+
import { writeLastPushedCommit } from './_last-pushed-commit'
|
|
6
|
+
|
|
7
|
+
const cwd = process.cwd()
|
|
8
|
+
|
|
9
|
+
const readJson = async (p: string) => JSON.parse(await readFile(p, 'utf8'))
|
|
10
|
+
|
|
11
|
+
const {
|
|
12
|
+
values: { 'auto-commit': autoCommit, 'no-check': noCheck, 'no-validate': noValidate, yes, help },
|
|
13
|
+
} = parseArgs({
|
|
14
|
+
args: process.argv.slice(2),
|
|
15
|
+
options: {
|
|
16
|
+
'auto-commit': { type: 'boolean' },
|
|
17
|
+
'no-check': { type: 'boolean' },
|
|
18
|
+
'no-validate': { type: 'boolean' },
|
|
19
|
+
yes: { type: 'boolean', short: 'y' },
|
|
20
|
+
help: { type: 'boolean', short: 'h' },
|
|
21
|
+
},
|
|
22
|
+
allowPositionals: true,
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
if (help) {
|
|
26
|
+
console.log(`Push compiled config to BRICKS without creating a release.
|
|
27
|
+
|
|
28
|
+
Options:
|
|
29
|
+
--auto-commit Auto-commit unstaged changes before pushing
|
|
30
|
+
--no-check Skip the conflict guard (don't pass --last-commit-id)
|
|
31
|
+
--no-validate Skip server-side config schema validation
|
|
32
|
+
-y, --yes Skip all prompts
|
|
33
|
+
-h, --help Show this help message`)
|
|
34
|
+
process.exit(0)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Detect git repo (mirrors deploy.ts)
|
|
38
|
+
const { exitCode } = await sh`cd ${cwd} && git status`.quiet().nothrow()
|
|
39
|
+
const isGitRepo = exitCode === 0
|
|
40
|
+
|
|
41
|
+
if (!isGitRepo && !yes) {
|
|
42
|
+
const confirmContinue = prompt('No git repository found, continue? (y/n)')
|
|
43
|
+
if (confirmContinue !== 'y') throw new Error('Update cancelled')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Read application.json + compiled config
|
|
47
|
+
const app = await readJson(`${cwd}/application.json`)
|
|
48
|
+
const config = await readJson(`${cwd}/.bricks/build/application-config.json`)
|
|
49
|
+
|
|
50
|
+
// Handle unstaged changes the same way deploy.ts does.
|
|
51
|
+
let commitId = ''
|
|
52
|
+
let parentCommitId = ''
|
|
53
|
+
if (isGitRepo) {
|
|
54
|
+
const unstagedChanges = await sh`cd ${cwd} && git diff --name-only --diff-filter=ACMR`.text()
|
|
55
|
+
if (unstagedChanges) {
|
|
56
|
+
if (autoCommit) {
|
|
57
|
+
// Capture the pre-commit HEAD so we can use it as the conflict-check
|
|
58
|
+
// baseline (the server should still hold it from the prior deploy).
|
|
59
|
+
parentCommitId = (await sh`cd ${cwd} && git rev-parse HEAD`.nothrow().text()).trim()
|
|
60
|
+
await sh`cd ${cwd} && git add -A`
|
|
61
|
+
const commitArgs = await buildCommitArgs(cwd, ['chore: update bricks config'])
|
|
62
|
+
await sh`cd ${cwd} && git ${commitArgs}`
|
|
63
|
+
} else {
|
|
64
|
+
throw new Error('Unstaged changes found, please commit or stash your changes before updating')
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
commitId = (await sh`cd ${cwd} && git rev-parse HEAD`.text()).trim()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Auto-derive --last-commit-id for the server-side conflict guard.
|
|
71
|
+
// - parent of the auto-commit (server still holds it from the prior deploy)
|
|
72
|
+
// - current HEAD (clean tree — server should be at the same commit too)
|
|
73
|
+
let lastCommitId: string | undefined
|
|
74
|
+
if (!noCheck) {
|
|
75
|
+
if (parentCommitId) lastCommitId = parentCommitId
|
|
76
|
+
else if (commitId) lastCommitId = commitId
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!yes) {
|
|
80
|
+
const confirm = prompt('Are you sure you want to push the new config? (y/n)')
|
|
81
|
+
if (confirm !== 'y') throw new Error('Update cancelled')
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const isModule = app.type === 'module'
|
|
85
|
+
const command = isModule ? 'module' : 'app'
|
|
86
|
+
|
|
87
|
+
const updateConfig = {
|
|
88
|
+
...config,
|
|
89
|
+
bricks_project_last_commit_id: commitId || undefined,
|
|
90
|
+
}
|
|
91
|
+
const configPath = `${cwd}/.bricks/build/push-config.json`
|
|
92
|
+
await writeFile(configPath, JSON.stringify(updateConfig))
|
|
93
|
+
|
|
94
|
+
const args = ['bricks', command, 'update', app.id, '-f', configPath, '--json']
|
|
95
|
+
if (noValidate) args.push('--no-validate')
|
|
96
|
+
if (lastCommitId) args.push('--last-commit-id', lastCommitId)
|
|
97
|
+
|
|
98
|
+
const result = await sh`${args}`.quiet().nothrow()
|
|
99
|
+
|
|
100
|
+
if (result.exitCode !== 0) {
|
|
101
|
+
const output = result.stderr.toString() || result.stdout.toString()
|
|
102
|
+
try {
|
|
103
|
+
const json = JSON.parse(output)
|
|
104
|
+
throw new Error(json.error?.message || json.error || 'Update failed')
|
|
105
|
+
} catch {
|
|
106
|
+
throw new Error(output || 'Update failed')
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const output = JSON.parse(result.stdout.toString())
|
|
111
|
+
|
|
112
|
+
// Record the commit we just pushed from so a later pull can use it as the
|
|
113
|
+
// merge base regardless of what the server stores in
|
|
114
|
+
// bricks_project_last_commit_id (which may be an opaque nanoid for
|
|
115
|
+
// content-only edits).
|
|
116
|
+
if (commitId) await writeLastPushedCommit(cwd, commitId)
|
|
117
|
+
|
|
118
|
+
console.log(`${isModule ? 'Module' : 'App'} config updated: ${output.target?.name || app.name}`)
|
|
@@ -44,10 +44,21 @@ export interface AnimationTimingConfig {
|
|
|
44
44
|
export interface AnimationSpringConfig {
|
|
45
45
|
__type: 'AnimationSpringConfig'
|
|
46
46
|
toValue: number // BRICKS Grid unit
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
// Use one spring parameter family: tension/friction, speed/bounciness,
|
|
48
|
+
// or stiffness/damping/mass.
|
|
49
|
+
friction?: number
|
|
50
|
+
tension?: number
|
|
51
|
+
speed?: number
|
|
52
|
+
bounciness?: number
|
|
53
|
+
stiffness?: number
|
|
54
|
+
damping?: number
|
|
55
|
+
mass?: number
|
|
56
|
+
velocity?: number
|
|
57
|
+
delay?: number
|
|
58
|
+
isInteraction?: boolean
|
|
59
|
+
overshootClamping?: boolean
|
|
60
|
+
restDisplacementThreshold?: number
|
|
61
|
+
restSpeedThreshold?: number
|
|
51
62
|
}
|
|
52
63
|
|
|
53
64
|
export interface AnimationDecayConfig {
|
|
@@ -62,7 +73,7 @@ export interface AnimationDef {
|
|
|
62
73
|
__typename: 'Animation'
|
|
63
74
|
id: string
|
|
64
75
|
alias?: string
|
|
65
|
-
title
|
|
76
|
+
title?: string
|
|
66
77
|
description?: string
|
|
67
78
|
hideShortRef?: boolean
|
|
68
79
|
runType?: 'once' | 'loop'
|
|
@@ -93,8 +104,13 @@ export interface AnimationComposeDef {
|
|
|
93
104
|
|
|
94
105
|
export type Animation = AnimationDef | AnimationComposeDef
|
|
95
106
|
|
|
107
|
+
// Animation event handlers accept either a direct Animation or a getter that
|
|
108
|
+
// returns one. The getter form is useful for lazy/forward references between
|
|
109
|
+
// animations defined across files.
|
|
110
|
+
export type AnimationOrGetter = Animation | (() => Animation)
|
|
111
|
+
|
|
96
112
|
export interface AnimationBasicEvents {
|
|
97
|
-
showStart?:
|
|
98
|
-
standby?:
|
|
99
|
-
breatheStart?:
|
|
113
|
+
showStart?: AnimationOrGetter
|
|
114
|
+
standby?: AnimationOrGetter
|
|
115
|
+
breatheStart?: AnimationOrGetter
|
|
100
116
|
}
|
|
@@ -83,9 +83,22 @@ export type TestMethodName =
|
|
|
83
83
|
| 'delay'
|
|
84
84
|
|
|
85
85
|
/**
|
|
86
|
-
*
|
|
87
|
-
* Each method has a specific signature: [methodName, ...args]
|
|
86
|
+
* Union type for all test method run arrays
|
|
88
87
|
*/
|
|
88
|
+
export type TestMethodRun =
|
|
89
|
+
| TestMethodRunBrickPress
|
|
90
|
+
| TestMethodRunBrickExists
|
|
91
|
+
| TestMethodRunWaitUntilBrickExists
|
|
92
|
+
| TestMethodRunWaitUntilEventTrigger
|
|
93
|
+
| TestMethodRunWaitUntilCanvasChange
|
|
94
|
+
| TestMethodRunKeydown
|
|
95
|
+
| TestMethodRunKeyup
|
|
96
|
+
| TestMethodRunHttpRequest
|
|
97
|
+
| TestMethodRunAssertProperty
|
|
98
|
+
| TestMethodRunWaitUntilPropertyChange
|
|
99
|
+
| TestMethodRunExecuteAction
|
|
100
|
+
| TestMethodRunMatchScreenshot
|
|
101
|
+
| TestMethodRunDelay
|
|
89
102
|
|
|
90
103
|
// [methodName, subspaceId, brickId, options?]
|
|
91
104
|
export type TestMethodRunBrickPress = ['brick_press', SubspaceRef, BrickRef, Record<string, any>?]
|
|
@@ -157,24 +170,6 @@ export type TestMethodRunMatchScreenshot = ['match_screenshot', string, number?,
|
|
|
157
170
|
// [methodName, subspaceId?, propertyId?, defaultValue?]
|
|
158
171
|
export type TestMethodRunDelay = ['delay', SubspaceRef?, DataRef?, number?]
|
|
159
172
|
|
|
160
|
-
/**
|
|
161
|
-
* Union type for all test method run arrays
|
|
162
|
-
*/
|
|
163
|
-
export type TestMethodRun =
|
|
164
|
-
| TestMethodRunBrickPress
|
|
165
|
-
| TestMethodRunBrickExists
|
|
166
|
-
| TestMethodRunWaitUntilBrickExists
|
|
167
|
-
| TestMethodRunWaitUntilEventTrigger
|
|
168
|
-
| TestMethodRunWaitUntilCanvasChange
|
|
169
|
-
| TestMethodRunKeydown
|
|
170
|
-
| TestMethodRunKeyup
|
|
171
|
-
| TestMethodRunHttpRequest
|
|
172
|
-
| TestMethodRunAssertProperty
|
|
173
|
-
| TestMethodRunWaitUntilPropertyChange
|
|
174
|
-
| TestMethodRunExecuteAction
|
|
175
|
-
| TestMethodRunMatchScreenshot
|
|
176
|
-
| TestMethodRunDelay
|
|
177
|
-
|
|
178
173
|
/**
|
|
179
174
|
* Test case definition
|
|
180
175
|
*/
|
|
@@ -203,6 +198,7 @@ export type LocalSyncMode = 'main-only' | 'minor-only'
|
|
|
203
198
|
export interface AutomationTest {
|
|
204
199
|
__typename: 'AutomationTest'
|
|
205
200
|
id: string
|
|
201
|
+
alias?: string
|
|
206
202
|
title: string
|
|
207
203
|
hideShortRef?: boolean
|
|
208
204
|
timeout: number
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Auto generated by build script */
|
|
2
2
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from './switch'
|
|
3
3
|
import type { Data, DataLink } from './data'
|
|
4
|
-
import type { Animation, AnimationBasicEvents } from './animation'
|
|
4
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from './animation'
|
|
5
5
|
import type {
|
|
6
6
|
Brick,
|
|
7
7
|
EventAction,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -213,13 +213,13 @@ Default property:
|
|
|
213
213
|
faceDetected?: () => Data<Array<{ [key: string]: any }>>
|
|
214
214
|
}
|
|
215
215
|
animation?: AnimationBasicEvents & {
|
|
216
|
-
stateChange?:
|
|
217
|
-
recordStart?:
|
|
218
|
-
recordEnd?:
|
|
219
|
-
barcodeRead?:
|
|
220
|
-
pictureTaken?:
|
|
221
|
-
recordFinish?:
|
|
222
|
-
mountError?:
|
|
216
|
+
stateChange?: AnimationOrGetter
|
|
217
|
+
recordStart?: AnimationOrGetter
|
|
218
|
+
recordEnd?: AnimationOrGetter
|
|
219
|
+
barcodeRead?: AnimationOrGetter
|
|
220
|
+
pictureTaken?: AnimationOrGetter
|
|
221
|
+
recordFinish?: AnimationOrGetter
|
|
222
|
+
mountError?: AnimationOrGetter
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -343,9 +343,9 @@ Default property:
|
|
|
343
343
|
>
|
|
344
344
|
}
|
|
345
345
|
animation?: AnimationBasicEvents & {
|
|
346
|
-
onRender?:
|
|
347
|
-
onPress?:
|
|
348
|
-
onLegendSelectChanged?:
|
|
346
|
+
onRender?: AnimationOrGetter
|
|
347
|
+
onPress?: AnimationOrGetter
|
|
348
|
+
onLegendSelectChanged?: AnimationOrGetter
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
351
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -250,20 +250,20 @@ Default property:
|
|
|
250
250
|
loading?: () => Data<boolean>
|
|
251
251
|
}
|
|
252
252
|
animation?: AnimationBasicEvents & {
|
|
253
|
-
generativeMediaOnPress?:
|
|
254
|
-
generativeMediaOnPressIn?:
|
|
255
|
-
generativeMediaOnPressOut?:
|
|
256
|
-
generativeMediaOnLongPress?:
|
|
257
|
-
generativeMediaOnFocus?:
|
|
258
|
-
generativeMediaOnBlur?:
|
|
259
|
-
onSuccess?:
|
|
260
|
-
onError?:
|
|
261
|
-
promptStart?:
|
|
262
|
-
promptSuccess?:
|
|
263
|
-
promptError?:
|
|
264
|
-
loadStart?:
|
|
265
|
-
loadSuccess?:
|
|
266
|
-
loadError?:
|
|
253
|
+
generativeMediaOnPress?: AnimationOrGetter
|
|
254
|
+
generativeMediaOnPressIn?: AnimationOrGetter
|
|
255
|
+
generativeMediaOnPressOut?: AnimationOrGetter
|
|
256
|
+
generativeMediaOnLongPress?: AnimationOrGetter
|
|
257
|
+
generativeMediaOnFocus?: AnimationOrGetter
|
|
258
|
+
generativeMediaOnBlur?: AnimationOrGetter
|
|
259
|
+
onSuccess?: AnimationOrGetter
|
|
260
|
+
onError?: AnimationOrGetter
|
|
261
|
+
promptStart?: AnimationOrGetter
|
|
262
|
+
promptSuccess?: AnimationOrGetter
|
|
263
|
+
promptError?: AnimationOrGetter
|
|
264
|
+
loadStart?: AnimationOrGetter
|
|
265
|
+
loadSuccess?: AnimationOrGetter
|
|
266
|
+
loadError?: AnimationOrGetter
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -66,12 +66,12 @@ Default property:
|
|
|
66
66
|
brickFocusing?: () => Data<boolean>
|
|
67
67
|
}
|
|
68
68
|
animation?: AnimationBasicEvents & {
|
|
69
|
-
onPress?:
|
|
70
|
-
onPressIn?:
|
|
71
|
-
onPressOut?:
|
|
72
|
-
onLongPress?:
|
|
73
|
-
onFocus?:
|
|
74
|
-
onBlur?:
|
|
69
|
+
onPress?: AnimationOrGetter
|
|
70
|
+
onPressIn?: AnimationOrGetter
|
|
71
|
+
onPressOut?: AnimationOrGetter
|
|
72
|
+
onLongPress?: AnimationOrGetter
|
|
73
|
+
onFocus?: AnimationOrGetter
|
|
74
|
+
onBlur?: AnimationOrGetter
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -25,6 +25,10 @@ Default property:
|
|
|
25
25
|
"templateType": "${}",
|
|
26
26
|
"fadeDuration": 0,
|
|
27
27
|
"blurBackgroundRadius": 8,
|
|
28
|
+
"imageFilterEnabled": false,
|
|
29
|
+
"imageFilterBlur": 0,
|
|
30
|
+
"imageFilterBlurMode": "clamp",
|
|
31
|
+
"imageFilterColorMatrix": [],
|
|
28
32
|
"loadSystemIos": "auto",
|
|
29
33
|
"loadSystemAndroid": "auto"
|
|
30
34
|
}
|
|
@@ -50,6 +54,14 @@ Default property:
|
|
|
50
54
|
enableBlurBackground?: boolean | DataLink
|
|
51
55
|
/* The blur radius of the blur filter added to the image background */
|
|
52
56
|
blurBackgroundRadius?: number | DataLink
|
|
57
|
+
/* Enable Skia image filters. When disabled, Image uses the normal platform image renderer. */
|
|
58
|
+
imageFilterEnabled?: boolean | DataLink
|
|
59
|
+
/* Blur amount for the Skia image filter. */
|
|
60
|
+
imageFilterBlur?: number | DataLink
|
|
61
|
+
/* Tile mode for the Skia blur image filter. */
|
|
62
|
+
imageFilterBlurMode?: 'clamp' | 'decal' | 'repeat' | 'mirror' | DataLink
|
|
63
|
+
/* Optional 4x5 color matrix for the Skia image filter. Provide 20 numbers. */
|
|
64
|
+
imageFilterColorMatrix?: Array<number | DataLink> | DataLink
|
|
53
65
|
/* [iOS] The use priority of image loading system (Auto: sdwebimage, fallback to default if failed) */
|
|
54
66
|
loadSystemIos?: 'auto' | 'sdwebimage' | 'default' | DataLink
|
|
55
67
|
/* [Android] The use priority of image loading system (Auto: glide, fallback to fresco if failed) */
|
|
@@ -80,14 +92,14 @@ Default property:
|
|
|
80
92
|
brickFocusing?: () => Data<boolean>
|
|
81
93
|
}
|
|
82
94
|
animation?: AnimationBasicEvents & {
|
|
83
|
-
onPress?:
|
|
84
|
-
onPressIn?:
|
|
85
|
-
onPressOut?:
|
|
86
|
-
onLongPress?:
|
|
87
|
-
onFocus?:
|
|
88
|
-
onBlur?:
|
|
89
|
-
onLoad?:
|
|
90
|
-
onError?:
|
|
95
|
+
onPress?: AnimationOrGetter
|
|
96
|
+
onPressIn?: AnimationOrGetter
|
|
97
|
+
onPressOut?: AnimationOrGetter
|
|
98
|
+
onLongPress?: AnimationOrGetter
|
|
99
|
+
onFocus?: AnimationOrGetter
|
|
100
|
+
onBlur?: AnimationOrGetter
|
|
101
|
+
onLoad?: AnimationOrGetter
|
|
102
|
+
onError?: AnimationOrGetter
|
|
91
103
|
}
|
|
92
104
|
}
|
|
93
105
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -438,12 +438,12 @@ Default property:
|
|
|
438
438
|
pageIsOutOfBound?: () => Data<boolean>
|
|
439
439
|
}
|
|
440
440
|
animation?: AnimationBasicEvents & {
|
|
441
|
-
onPageRender?:
|
|
442
|
-
onPageChange?:
|
|
443
|
-
onPageOutOfBound?:
|
|
444
|
-
onIntoDetailMode?:
|
|
445
|
-
onIntoListMode?:
|
|
446
|
-
onError?:
|
|
441
|
+
onPageRender?: AnimationOrGetter
|
|
442
|
+
onPageChange?: AnimationOrGetter
|
|
443
|
+
onPageOutOfBound?: AnimationOrGetter
|
|
444
|
+
onIntoDetailMode?: AnimationOrGetter
|
|
445
|
+
onIntoListMode?: AnimationOrGetter
|
|
446
|
+
onError?: AnimationOrGetter
|
|
447
447
|
}
|
|
448
448
|
}
|
|
449
449
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -133,15 +133,15 @@ Default property:
|
|
|
133
133
|
brickFocusing?: () => Data<boolean>
|
|
134
134
|
}
|
|
135
135
|
animation?: AnimationBasicEvents & {
|
|
136
|
-
onPress?:
|
|
137
|
-
onPressIn?:
|
|
138
|
-
onPressOut?:
|
|
139
|
-
onLongPress?:
|
|
140
|
-
onFocus?:
|
|
141
|
-
onBlur?:
|
|
142
|
-
onAnimationFinish?:
|
|
143
|
-
onAnimationFailure?:
|
|
144
|
-
onAnimationLoop?:
|
|
136
|
+
onPress?: AnimationOrGetter
|
|
137
|
+
onPressIn?: AnimationOrGetter
|
|
138
|
+
onPressOut?: AnimationOrGetter
|
|
139
|
+
onLongPress?: AnimationOrGetter
|
|
140
|
+
onFocus?: AnimationOrGetter
|
|
141
|
+
onBlur?: AnimationOrGetter
|
|
142
|
+
onAnimationFinish?: AnimationOrGetter
|
|
143
|
+
onAnimationFailure?: AnimationOrGetter
|
|
144
|
+
onAnimationLoop?: AnimationOrGetter
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -226,16 +226,16 @@ Default property:
|
|
|
226
226
|
brickFocusing?: () => Data<boolean>
|
|
227
227
|
}
|
|
228
228
|
animation?: AnimationBasicEvents & {
|
|
229
|
-
onPress?:
|
|
230
|
-
onPressIn?:
|
|
231
|
-
onPressOut?:
|
|
232
|
-
onLongPress?:
|
|
233
|
-
onFocus?:
|
|
234
|
-
onBlur?:
|
|
235
|
-
onMarkerPress?:
|
|
236
|
-
onMapPress?:
|
|
237
|
-
onRegionChange?:
|
|
238
|
-
onReady?:
|
|
229
|
+
onPress?: AnimationOrGetter
|
|
230
|
+
onPressIn?: AnimationOrGetter
|
|
231
|
+
onPressOut?: AnimationOrGetter
|
|
232
|
+
onLongPress?: AnimationOrGetter
|
|
233
|
+
onFocus?: AnimationOrGetter
|
|
234
|
+
onBlur?: AnimationOrGetter
|
|
235
|
+
onMarkerPress?: AnimationOrGetter
|
|
236
|
+
onMapPress?: AnimationOrGetter
|
|
237
|
+
onRegionChange?: AnimationOrGetter
|
|
238
|
+
onReady?: AnimationOrGetter
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
241
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -85,12 +85,12 @@ Default property:
|
|
|
85
85
|
brickFocusing?: () => Data<boolean>
|
|
86
86
|
}
|
|
87
87
|
animation?: AnimationBasicEvents & {
|
|
88
|
-
onPress?:
|
|
89
|
-
onPressIn?:
|
|
90
|
-
onPressOut?:
|
|
91
|
-
onLongPress?:
|
|
92
|
-
onFocus?:
|
|
93
|
-
onBlur?:
|
|
88
|
+
onPress?: AnimationOrGetter
|
|
89
|
+
onPressIn?: AnimationOrGetter
|
|
90
|
+
onPressOut?: AnimationOrGetter
|
|
91
|
+
onLongPress?: AnimationOrGetter
|
|
92
|
+
onFocus?: AnimationOrGetter
|
|
93
|
+
onBlur?: AnimationOrGetter
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -118,12 +118,12 @@ Default property:
|
|
|
118
118
|
brickFocusing?: () => Data<boolean>
|
|
119
119
|
}
|
|
120
120
|
animation?: AnimationBasicEvents & {
|
|
121
|
-
onPress?:
|
|
122
|
-
onPressIn?:
|
|
123
|
-
onPressOut?:
|
|
124
|
-
onLongPress?:
|
|
125
|
-
onFocus?:
|
|
126
|
-
onBlur?:
|
|
121
|
+
onPress?: AnimationOrGetter
|
|
122
|
+
onPressIn?: AnimationOrGetter
|
|
123
|
+
onPressOut?: AnimationOrGetter
|
|
124
|
+
onLongPress?: AnimationOrGetter
|
|
125
|
+
onFocus?: AnimationOrGetter
|
|
126
|
+
onBlur?: AnimationOrGetter
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* Auto generated by build script
|
|
2
2
|
*
|
|
3
|
-
* Rich text with HTML content rendering, multiple fonts, colors, heading levels (h1-h6), and inline images
|
|
3
|
+
* Rich text with HTML or Markdown content rendering, multiple fonts, colors, heading levels (h1-h6), and inline images
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -23,6 +23,7 @@ Default property:
|
|
|
23
23
|
{
|
|
24
24
|
"content": "",
|
|
25
25
|
"renderImage": false,
|
|
26
|
+
"renderMarkdown": false,
|
|
26
27
|
"color": "#000",
|
|
27
28
|
"fontWeight": "normal",
|
|
28
29
|
"fontStyle": "normal",
|
|
@@ -42,6 +43,8 @@ Default property:
|
|
|
42
43
|
content?: string | DataLink
|
|
43
44
|
/* Render Image */
|
|
44
45
|
renderImage?: boolean | DataLink
|
|
46
|
+
/* Treat content as Markdown (converted to HTML before rendering) */
|
|
47
|
+
renderMarkdown?: boolean | DataLink
|
|
45
48
|
/* The text color */
|
|
46
49
|
color?: string | DataLink
|
|
47
50
|
/* Specifies font weight. The values 'normal' and are supported for most fonts. Not all fonts have a variant for each of the numeric values, in that case the closest one is chosen. */
|
|
@@ -96,16 +99,16 @@ Default property:
|
|
|
96
99
|
brickFocusing?: () => Data<boolean>
|
|
97
100
|
}
|
|
98
101
|
animation?: AnimationBasicEvents & {
|
|
99
|
-
onPress?:
|
|
100
|
-
onPressIn?:
|
|
101
|
-
onPressOut?:
|
|
102
|
-
onLongPress?:
|
|
103
|
-
onFocus?:
|
|
104
|
-
onBlur?:
|
|
102
|
+
onPress?: AnimationOrGetter
|
|
103
|
+
onPressIn?: AnimationOrGetter
|
|
104
|
+
onPressOut?: AnimationOrGetter
|
|
105
|
+
onLongPress?: AnimationOrGetter
|
|
106
|
+
onFocus?: AnimationOrGetter
|
|
107
|
+
onBlur?: AnimationOrGetter
|
|
105
108
|
}
|
|
106
109
|
}
|
|
107
110
|
|
|
108
|
-
/* Rich text with HTML content rendering, multiple fonts, colors, heading levels (h1-h6), and inline images */
|
|
111
|
+
/* Rich text with HTML or Markdown content rendering, multiple fonts, colors, heading levels (h1-h6), and inline images */
|
|
109
112
|
export type BrickRichText = Brick &
|
|
110
113
|
BrickRichTextDef & {
|
|
111
114
|
templateKey: 'BRICK_RICH_TEXT'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { SwitchCondInnerStateCurrentCanvas, SwitchCondData, SwitchDef } from '../switch'
|
|
6
6
|
import type { Data, DataLink } from '../data'
|
|
7
|
-
import type { Animation, AnimationBasicEvents } from '../animation'
|
|
7
|
+
import type { Animation, AnimationBasicEvents, AnimationOrGetter } from '../animation'
|
|
8
8
|
import type {
|
|
9
9
|
Brick,
|
|
10
10
|
EventAction,
|
|
@@ -186,14 +186,14 @@ Default property:
|
|
|
186
186
|
>
|
|
187
187
|
}
|
|
188
188
|
animation?: AnimationBasicEvents & {
|
|
189
|
-
onPlay?:
|
|
190
|
-
onPause?:
|
|
191
|
-
onStop?:
|
|
192
|
-
onLoopEnd?:
|
|
193
|
-
onStateChanged?:
|
|
194
|
-
onError?:
|
|
195
|
-
onRiveGeneralEvent?:
|
|
196
|
-
onRiveOpenUrlEvent?:
|
|
189
|
+
onPlay?: AnimationOrGetter
|
|
190
|
+
onPause?: AnimationOrGetter
|
|
191
|
+
onStop?: AnimationOrGetter
|
|
192
|
+
onLoopEnd?: AnimationOrGetter
|
|
193
|
+
onStateChanged?: AnimationOrGetter
|
|
194
|
+
onError?: AnimationOrGetter
|
|
195
|
+
onRiveGeneralEvent?: AnimationOrGetter
|
|
196
|
+
onRiveOpenUrlEvent?: AnimationOrGetter
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
|