rvis-aiui-kit 1.0.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 (44) hide show
  1. package/README.md +22 -0
  2. package/components/image/index.ink +44 -0
  3. package/components/list/index.ink +198 -0
  4. package/components/list/readme.md +71 -0
  5. package/components/markdown/index.ink +109 -0
  6. package/components/markdown/parser.js +149 -0
  7. package/components/markdown/readme.md +50 -0
  8. package/components/model-list/index.ink +181 -0
  9. package/components/model-list/readme.md +111 -0
  10. package/components/paragraph/index.ink +61 -0
  11. package/components/paragraph/readme.md +17 -0
  12. package/components/table/index.ink +272 -0
  13. package/components/table/readme.md +83 -0
  14. package/package.json +35 -0
  15. package/sdk/README.md +1013 -0
  16. package/sdk/api-map.js +25 -0
  17. package/sdk/core/client.js +641 -0
  18. package/sdk/core/constants.js +10 -0
  19. package/sdk/core/transport.js +55 -0
  20. package/sdk/index.js +19 -0
  21. package/sdk/modules/audio/index.js +177 -0
  22. package/sdk/modules/audio/readme.md +136 -0
  23. package/sdk/modules/camera/index.js +380 -0
  24. package/sdk/modules/camera/readme.md +302 -0
  25. package/sdk/modules/device-context/index.js +206 -0
  26. package/sdk/modules/device-context/readme.md +243 -0
  27. package/sdk/modules/face/index.js +108 -0
  28. package/sdk/modules/face/readme.md +196 -0
  29. package/sdk/modules/motion/index.js +116 -0
  30. package/sdk/modules/motion/readme.md +148 -0
  31. package/sdk/modules/notification/index.js +192 -0
  32. package/sdk/modules/notification/readme.md +175 -0
  33. package/sdk/modules/offline-command/index.js +265 -0
  34. package/sdk/modules/offline-command/readme.md +143 -0
  35. package/sdk/modules/screen/index.js +64 -0
  36. package/sdk/modules/screen/readme.md +110 -0
  37. package/sdk/modules/tts/index.js +75 -0
  38. package/sdk/modules/tts/readme.md +162 -0
  39. package/sdk/utils/api-builder.js +16 -0
  40. package/sdk/utils/case.js +19 -0
  41. package/sdk/utils/errors.js +32 -0
  42. package/sdk/utils/events.js +22 -0
  43. package/sdk/utils/message.js +63 -0
  44. package/sdk/utils/request-id.js +18 -0
@@ -0,0 +1,181 @@
1
+ <script def>
2
+ {
3
+ "component": true
4
+ }
5
+ </script>
6
+
7
+ <script setup>
8
+ export default {
9
+ properties: {
10
+ items: {
11
+ type: String,
12
+ value: '[]'
13
+ },
14
+ selectedId: {
15
+ type: String,
16
+ value: ''
17
+ },
18
+ showIndex: {
19
+ type: Boolean,
20
+ value: true
21
+ },
22
+ visible: {
23
+ type: Boolean,
24
+ value: true
25
+ }
26
+ }
27
+ };
28
+ </script>
29
+
30
+ <page>
31
+ <view
32
+ class="model-list-mask"
33
+ style="left: {{ visible === true || visible === 'true' ? '0px' : '-100%' }}; right: {{ visible === true || visible === 'true' ? '0px' : '100%' }};"
34
+ >
35
+ <scroll-view
36
+ class="model-list-scroll"
37
+ scroll-y="true"
38
+ scroll-top="{{ Math.max(0, Math.min((JSON.parse(items).findIndex(listItem => String(listItem.id) === selectedId) - 3) * 50, (JSON.parse(items).length - 7) * 50)) }}"
39
+ >
40
+ <view class="model-list-items">
41
+ <view
42
+ class="model-list-item"
43
+ ink:for="{{ JSON.parse(items).map((listItem, listIndex) => ({ id: String(listItem.id), title: listItem.title == null ? '' : String(listItem.title), description: listItem.description == null ? '' : String(listItem.description), indexText: listItem.indexText == null ? String(listIndex + 1) : String(listItem.indexText) })) }}"
44
+ ink:key="id"
45
+ >
46
+ <view
47
+ class="model-list-index"
48
+ ink:if="{{ showIndex === true || showIndex === 'true' }}"
49
+ >
50
+ <text class="model-list-index-text">{{ typeof item === 'undefined' ? '' : item.indexText }}</text>
51
+ </view>
52
+
53
+ <text class="model-list-title">{{ typeof item === 'undefined' ? '' : item.title }}</text>
54
+ <text class="model-list-description">{{ typeof item === 'undefined' ? '' : item.description }}</text>
55
+ </view>
56
+
57
+ <view
58
+ class="model-list-item model-list-item-selected model-list-selected-overlay"
59
+ style="left: {{ JSON.parse(items).some(listItem => String(listItem.id) === selectedId) ? '0px' : '-100%' }}; top: {{ Math.max(0, (350 - JSON.parse(items).length * 50) / 2) + Math.max(0, JSON.parse(items).findIndex(listItem => String(listItem.id) === selectedId)) * 50 }}px;"
60
+ >
61
+ <view
62
+ class="model-list-index model-list-index-selected"
63
+ ink:if="{{ showIndex === true || showIndex === 'true' }}"
64
+ >
65
+ <text class="model-list-index-text model-list-index-text-selected">{{ (JSON.parse(items).find(listItem => String(listItem.id) === selectedId) || {}).indexText || JSON.parse(items).findIndex(listItem => String(listItem.id) === selectedId) + 1 }}</text>
66
+ </view>
67
+
68
+ <text class="model-list-title">{{ (JSON.parse(items).find(listItem => String(listItem.id) === selectedId) || {}).title || '' }}</text>
69
+ <text class="model-list-description">{{ (JSON.parse(items).find(listItem => String(listItem.id) === selectedId) || {}).description || '' }}</text>
70
+ </view>
71
+ </view>
72
+ </scroll-view>
73
+ </view>
74
+ </page>
75
+
76
+ <style>
77
+ .model-list-mask {
78
+ position: fixed;
79
+ top: 0;
80
+ bottom: 0;
81
+ z-index: 1000;
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ overflow: hidden;
86
+ background-color: rgba(0, 0, 0, 0.88);
87
+ }
88
+
89
+ .model-list-scroll {
90
+ width: 400px;
91
+ height: 350px;
92
+ }
93
+
94
+ .model-list-items {
95
+ position: relative;
96
+ display: flex;
97
+ flex-direction: column;
98
+ justify-content: center;
99
+ width: 400px;
100
+ min-height: 350px;
101
+ }
102
+
103
+ .model-list-item {
104
+ display: flex;
105
+ flex-direction: row;
106
+ align-items: center;
107
+ width: 400px;
108
+ height: 50px;
109
+ padding: 0 24px;
110
+ box-sizing: border-box;
111
+ border-width: 2px;
112
+ border-style: solid;
113
+ border-color: transparent;
114
+ border-radius: 2px;
115
+ }
116
+
117
+ .model-list-item-selected {
118
+ border-color: #40ff5e;
119
+ }
120
+
121
+ .model-list-selected-overlay {
122
+ position: absolute;
123
+ z-index: 1;
124
+ background-color: #000000;
125
+ }
126
+
127
+ .model-list-index {
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ width: 24px;
132
+ height: 24px;
133
+ margin-right: 12px;
134
+ flex-shrink: 0;
135
+ box-sizing: border-box;
136
+ background-color: transparent;
137
+ border-width: 1px;
138
+ border-style: solid;
139
+ border-color: rgba(64, 255, 94, 0.6);
140
+ border-radius: 12px;
141
+ }
142
+
143
+ .model-list-index-selected {
144
+ background-color: rgba(64, 255, 94, 0.6);
145
+ border-color: transparent;
146
+ }
147
+
148
+ .model-list-index-text {
149
+ height: 24px;
150
+ color: #40ff5e;
151
+ font-family: sans-serif;
152
+ font-size: 16px;
153
+ font-weight: 700;
154
+ line-height: 24px;
155
+ text-align: center;
156
+ }
157
+
158
+ .model-list-index-text-selected {
159
+ color: #000000;
160
+ }
161
+
162
+ .model-list-title {
163
+ min-width: 0;
164
+ color: #40ff5e;
165
+ font-family: sans-serif;
166
+ font-size: 16px;
167
+ font-weight: 400;
168
+ line-height: 20px;
169
+ }
170
+
171
+ .model-list-description {
172
+ margin-left: auto;
173
+ flex-shrink: 0;
174
+ color: rgba(64, 255, 94, 0.4);
175
+ font-family: sans-serif;
176
+ font-size: 16px;
177
+ font-weight: 400;
178
+ line-height: 20px;
179
+ text-align: right;
180
+ }
181
+ </style>
@@ -0,0 +1,111 @@
1
+ # Model List 覆盖列表组件
2
+
3
+ `rvis-model-list` 用于在页面上方显示全屏半透明遮罩,并在遮罩中央展示单选列表。
4
+
5
+ ## 引入组件
6
+
7
+ 在页面的 `<script def>` 中注册组件:
8
+
9
+ ```json
10
+ {
11
+ "usingComponents": {
12
+ "rvis-model-list": "rvis-aiui-kit/model-list"
13
+ }
14
+ }
15
+ ```
16
+
17
+ ## API
18
+
19
+ | 属性 | 类型 | 默认值 | 必填 | 说明 |
20
+ | --- | --- | --- | --- | --- |
21
+ | `items` | `String` | `'[]'` | 是 | 列表数据序列化后的 JSON 字符串 |
22
+ | `selectedId` | `String` | `''` | 否 | 当前选中项的 `id`,为空时没有选中项 |
23
+ | `showIndex` | `Boolean` | `true` | 否 | 是否显示从 1 开始的序号 |
24
+ | `visible` | `Boolean` | `true` | 否 | 是否将遮罩和列表显示在屏幕内 |
25
+
26
+ ### Item 数据结构
27
+
28
+ | 字段 | 类型 | 必填 | 说明 |
29
+ | --- | --- | --- | --- |
30
+ | `id` | `String` | 是 | 列表项唯一标识,用于 `ink:key` 和选中态匹配 |
31
+ | `title` | `String` | 是 | 列表项标题 |
32
+ | `description` | `String` | 否 | 列表项右侧描述 |
33
+ | `indexText` | `String` | 否 | 自定义序号;不传时使用当前列表内从 1 开始的序号。 |
34
+
35
+ 组件不提供事件。页面需要切换选中项时,更新传入的 `selectedId`;组件会在列表溢出时自动滚动,确保选中项可见并尽量保持在列表中央。
36
+
37
+ ## 使用示例
38
+
39
+ ```js
40
+ const MODEL_ITEMS = [
41
+ {
42
+ id: 'model-1',
43
+ title: '海关安全检查',
44
+ description: '02819939'
45
+ },
46
+ {
47
+ id: 'model-2',
48
+ title: '设备巡检',
49
+ description: '02819940'
50
+ }
51
+ ];
52
+
53
+ export default {
54
+ data: {
55
+ showModelList: true,
56
+ selectedIndex: 0,
57
+ selectedModelId: MODEL_ITEMS[0].id,
58
+ modelItems: JSON.stringify(MODEL_ITEMS)
59
+ },
60
+
61
+ selectModel(nextIndex) {
62
+ const selectedIndex = Math.max(
63
+ 0,
64
+ Math.min(nextIndex, MODEL_ITEMS.length - 1)
65
+ );
66
+ if (selectedIndex === this.data.selectedIndex) return;
67
+
68
+ this.setData({
69
+ selectedIndex,
70
+ selectedModelId: MODEL_ITEMS[selectedIndex].id
71
+ });
72
+ },
73
+
74
+ onKeyUp(event) {
75
+ switch (event.code) {
76
+ case 'ArrowDown':
77
+ event.preventDefault();
78
+ this.selectModel(this.data.selectedIndex + 1);
79
+ break;
80
+ case 'ArrowUp':
81
+ event.preventDefault();
82
+ this.selectModel(this.data.selectedIndex - 1);
83
+ break;
84
+ default:
85
+ break;
86
+ }
87
+ }
88
+ };
89
+ ```
90
+
91
+ ```html
92
+ <rvis-model-list
93
+ items="{{ modelItems }}"
94
+ selectedId="{{ selectedModelId }}"
95
+ showIndex="{{ true }}"
96
+ visible="{{ showModelList }}"
97
+ style="position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 1000;"
98
+ ></rvis-model-list>
99
+ ```
100
+
101
+ ## 布局和显示说明
102
+
103
+ - Mask 使用 `position: fixed` 和 `top: 0; left: 0; right: 0; bottom: 0;` 覆盖设备屏幕,不设置固定屏幕宽高。
104
+ - AIUI 自定义组件宿主会裁剪内部内容,调用时也必须按照示例为 `<rvis-model-list>` 设置 `position: fixed` 和四边 `0`,不要设置固定宽高。
105
+ - Mask 背景为 `rgba(0, 0, 0, 0.88)`,不会降低列表内容自身的透明度。
106
+ - 每项固定为 `400 × 50px`,列表容器最大高度为 `350px`,最多完整显示 7 项。
107
+ - 列表使用纵向 `scroll-view`;超过 7 项时,`selectedId` 变化会同步更新 `scroll-top`,使选中项在中段尽量居中,并在列表首尾自动夹紧滚动范围。
108
+ - `visible` 为 `false` 时,组件通过固定定位移动到屏幕外,不使用 `display` 隐藏。
109
+ - Mask 相对设备视口定位,不依赖调用页面的容器尺寸和定位方式。
110
+ - `items` 必须是可被 `JSON.parse` 解析的数组字符串。
111
+ - 当前运行时会把宿主传入的属性同步为字符串,组件已兼容 `showIndex`、`visible` 的 Boolean 值和字符串形式。
@@ -0,0 +1,61 @@
1
+ <script def>
2
+ {
3
+ "component": true
4
+ }
5
+ </script>
6
+
7
+ <script setup>
8
+ export default {
9
+ properties: {
10
+ text: {
11
+ type: String,
12
+ value: ''
13
+ },
14
+ width: {
15
+ type: String,
16
+ value: '380px'
17
+ },
18
+ segments: {
19
+ type: String,
20
+ value: '[]'
21
+ }
22
+ }
23
+ };
24
+ </script>
25
+
26
+ <page>
27
+ <view class="paragraph-container" style="width: {{ width }};">
28
+ <text class="paragraph-text" style="width: {{ width }}; position: {{ JSON.parse(segments).length === 0 ? 'relative' : 'absolute' }}; left: {{ JSON.parse(segments).length === 0 ? '0px' : '-1000px' }};">{{ text }}</text>
29
+ <p class="paragraph-text paragraph-rich" style="width: {{ width }}; position: {{ JSON.parse(segments).length > 0 ? 'relative' : 'absolute' }}; left: {{ JSON.parse(segments).length > 0 ? '0px' : '-1000px' }};">
30
+ <text class="paragraph-run" ink:for="{{ JSON.parse(segments) }}" ink:key="index" style="font-weight: {{ item.bold ? '700' : '400' }};">{{ item.text }}</text>
31
+ </p>
32
+ </view>
33
+ </page>
34
+
35
+ <style>
36
+ .paragraph-container {
37
+ position: relative;
38
+ display: flex;
39
+ flex-direction: column;
40
+ width: 380px;
41
+ }
42
+
43
+ .paragraph-text {
44
+ width: 380px;
45
+ color: #40FF5E;
46
+ font-size: 16px;
47
+ font-weight: 400;
48
+ line-height: 24px;
49
+ }
50
+
51
+ .paragraph-rich {
52
+ margin: 0;
53
+ padding: 0;
54
+ }
55
+
56
+ .paragraph-run {
57
+ color: #40ff5e;
58
+ font-size: 16px;
59
+ line-height: 24px;
60
+ }
61
+ </style>
@@ -0,0 +1,17 @@
1
+ # Paragraph 段落组件
2
+
3
+ 注册路径:`rvis-aiui-kit/paragraph`。
4
+
5
+ | 属性 | 类型 | 默认值 | 说明 |
6
+ | --- | --- | --- | --- |
7
+ | `text` | String | `''` | 普通段落文本 |
8
+ | `width` | String | `'380px'` | 段落宽度 |
9
+ | `segments` | String | `'[]'` | 行内片段数组的 JSON 字符串;非空时优先于 `text` |
10
+
11
+ 片段格式:`{ "text": "内容", "bold": true }`。`bold` 为布尔值,省略时按普通文字显示。
12
+
13
+ ```xml
14
+ <rvis-paragraph text="{{ text }}" width="424px" segments="{{ segments }}"></rvis-paragraph>
15
+ ```
16
+
17
+ 普通 `text` 保留原有纯文本渲染;片段使用原生 `p` 和带字重的 `text` 进行行内排版。不要使用 `streamdown`,也不要把 HTML 放入 `segments`。调用方须提供合法 JSON 数组。原生 `p` 支持已按本机 ink 运行时源码及无窗口截图核对,目标设备仍需匹配该能力。
@@ -0,0 +1,272 @@
1
+ <script def>
2
+ {
3
+ "component": true
4
+ }
5
+ </script>
6
+
7
+ <script setup>
8
+ export default {
9
+ properties: {
10
+ header: {
11
+ type: String,
12
+ value: ''
13
+ },
14
+ column: {
15
+ type: String,
16
+ value: '[]'
17
+ },
18
+ data: {
19
+ type: String,
20
+ value: '[]'
21
+ },
22
+ direction: {
23
+ type: String,
24
+ value: 'horizontal'
25
+ },
26
+ compact: {
27
+ type: Boolean,
28
+ value: false
29
+ },
30
+ columnWidths: {
31
+ type: String,
32
+ value: ''
33
+ }
34
+ }
35
+ };
36
+ </script>
37
+
38
+ <page>
39
+ <view
40
+ class="table-card table-card-horizontal"
41
+ style="position: {{ direction === 'vertical' ? 'absolute' : 'relative' }}; left: {{ direction === 'vertical' ? '-1000px' : '0px' }};"
42
+ >
43
+ <view
44
+ class="table-header"
45
+ ink:if="{{ header.trim().length > 0 }}"
46
+ >
47
+ <text class="table-header-text">{{ header }}</text>
48
+ </view>
49
+ <view
50
+ class="table-header-divider"
51
+ ink:if="{{ header.trim().length > 0 }}"
52
+ ></view>
53
+
54
+ <view
55
+ class="table-grid table-grid-horizontal"
56
+ style="grid-template-columns: {{ columnWidths.trim() || (JSON.parse(column).length === 0 ? '420px' : JSON.parse(column).map(() => String(420 / JSON.parse(column).length) + 'px').join(' ')) }};"
57
+ >
58
+ <view
59
+ class="table-cell"
60
+ style="padding: {{ compact === true || compact === 'true' ? '8px 6px' : '12px 12px' }};"
61
+ ink:for="{{ JSON.parse(column).map((columnItem, columnIndex) => ({ key: 'header-' + columnIndex, text: columnItem.title, align: columnItem.align || 'left', showTopDivider: false, isLabel: true })).concat(JSON.parse(data).reduce((cells, row, rowIndex) => cells.concat(JSON.parse(column).map((columnItem) => ({ key: String(row.key == null ? rowIndex : row.key) + '-' + columnItem.dataIndex, text: row[columnItem.dataIndex] == null ? '' : String(row[columnItem.dataIndex]), align: columnItem.align || 'left', showTopDivider: true, isLabel: false }))), [])) }}"
62
+ ink:key="key"
63
+ >
64
+ <view
65
+ class="table-cell-top-divider"
66
+ ink:if="{{ item.showTopDivider }}"
67
+ ></view>
68
+ <text class="table-cell-label" style="text-align: {{ item.align }};" ink:if="{{ item.isLabel }}">{{ item.text }}</text>
69
+ <text class="table-cell-text" style="text-align: {{ item.align }};" ink:if="{{ !item.isLabel }}">{{ item.text }}</text>
70
+ </view>
71
+ </view>
72
+ </view>
73
+
74
+ <view
75
+ class="table-card table-card-vertical"
76
+ style="position: {{ direction === 'vertical' ? 'relative' : 'absolute' }}; left: {{ direction === 'vertical' ? '0px' : '-1000px' }};"
77
+ >
78
+ <view
79
+ class="table-header"
80
+ ink:if="{{ header.trim().length > 0 }}"
81
+ >
82
+ <text class="table-header-text">{{ header }}</text>
83
+ </view>
84
+ <view
85
+ class="table-header-divider"
86
+ ink:if="{{ header.trim().length > 0 }}"
87
+ ></view>
88
+
89
+ <view
90
+ class="table-vertical-list"
91
+ ink:if="{{ JSON.parse(data).length === 1 }}"
92
+ >
93
+ <view
94
+ class="table-vertical-row"
95
+ ink:for="{{ JSON.parse(column).map((columnItem, rowIndex) => ({ key: columnItem.dataIndex, label: columnItem.title, text: JSON.parse(data)[0][columnItem.dataIndex] == null ? '' : String(JSON.parse(data)[0][columnItem.dataIndex]), showTopDivider: rowIndex !== 0 })) }}"
96
+ ink:key="key"
97
+ >
98
+ <view
99
+ class="table-cell-top-divider"
100
+ ink:if="{{ item.showTopDivider }}"
101
+ ></view>
102
+ <text class="table-vertical-label">{{ item.label }}</text>
103
+ <text class="table-vertical-text">{{ item.text }}</text>
104
+ </view>
105
+ </view>
106
+
107
+ <view
108
+ class="table-grid table-grid-vertical"
109
+ style="grid-template-columns: {{ JSON.parse(data).length === 0 ? '420px' : ['88px'].concat(JSON.parse(data).map(() => String(332 / JSON.parse(data).length) + 'px')).join(' ') }};"
110
+ ink:if="{{ JSON.parse(data).length !== 1 }}"
111
+ >
112
+ <view
113
+ class="table-cell"
114
+ ink:for="{{ JSON.parse(column).reduce((cells, columnItem, rowIndex) => { const rows = JSON.parse(data); return cells.concat([{ key: columnItem.dataIndex + '-title', text: columnItem.title, showTopDivider: rowIndex !== 0, isLabel: true }].concat(rows.map((row, dataIndex) => ({ key: columnItem.dataIndex + '-' + String(row.key == null ? dataIndex : row.key), text: row[columnItem.dataIndex] == null ? '' : String(row[columnItem.dataIndex]), showTopDivider: rowIndex !== 0, isLabel: false })))); }, []) }}"
115
+ ink:key="key"
116
+ >
117
+ <view
118
+ class="table-cell-top-divider"
119
+ ink:if="{{ item.showTopDivider }}"
120
+ ></view>
121
+ <text class="table-cell-label" ink:if="{{ item.isLabel }}">{{ item.text }}</text>
122
+ <text class="table-cell-text" ink:if="{{ !item.isLabel }}">{{ item.text }}</text>
123
+ </view>
124
+ </view>
125
+ </view>
126
+ </page>
127
+
128
+ <style>
129
+ .table-card {
130
+ display: flex;
131
+ flex-direction: column;
132
+ width: auto;
133
+ max-width: 424px;
134
+ box-sizing: border-box;
135
+ background-color: #000000;
136
+ border: 2px solid rgba(64, 255, 94, 0.6);
137
+ border-radius: 12px;
138
+ overflow: hidden;
139
+ }
140
+
141
+ .table-card-vertical {
142
+ width: 424px;
143
+ }
144
+
145
+ .table-card-horizontal {
146
+ width: 424px;
147
+ }
148
+
149
+ .table-grid {
150
+ display: grid;
151
+ width: auto;
152
+ max-width: 100%;
153
+ }
154
+
155
+ .table-grid-vertical {
156
+ width: 100%;
157
+ }
158
+
159
+ .table-grid-horizontal {
160
+ width: 100%;
161
+ }
162
+
163
+ .table-vertical-list {
164
+ display: flex;
165
+ flex-direction: column;
166
+ width: 100%;
167
+ }
168
+
169
+ .table-vertical-row {
170
+ position: relative;
171
+ display: flex;
172
+ flex-direction: row;
173
+ align-items: center;
174
+ width: 100%;
175
+ min-height: 30px;
176
+ box-sizing: border-box;
177
+ }
178
+
179
+ .table-vertical-label {
180
+ width: 88px;
181
+ flex-shrink: 0;
182
+ padding: 12px 12px;
183
+ box-sizing: border-box;
184
+ color: #40ff5e;
185
+ font-family: monospace;
186
+ font-size: 16px;
187
+ font-weight: 700;
188
+ line-height: 20px;
189
+ }
190
+
191
+ .table-vertical-text {
192
+ width: auto;
193
+ min-width: 0;
194
+ flex-grow: 1;
195
+ flex-shrink: 1;
196
+ flex-basis: 0px;
197
+ padding: 12px 12px;
198
+ box-sizing: border-box;
199
+ color: #40ff5e;
200
+ font-family: sans-serif;
201
+ font-size: 16px;
202
+ font-weight: 300;
203
+ line-height: 20px;
204
+ }
205
+
206
+ .table-header {
207
+ display: flex;
208
+ flex-direction: row;
209
+ align-items: center;
210
+ min-height: 30px;
211
+ padding: 12px 12px;
212
+ box-sizing: border-box;
213
+ }
214
+
215
+ .table-header-text {
216
+ width: 100%;
217
+ color: #40ff5e;
218
+ font-family: monospace;
219
+ font-size: 17px;
220
+ font-weight: 700;
221
+ line-height: 22px;
222
+ }
223
+
224
+ .table-header-divider {
225
+ width: auto;
226
+ align-self: stretch;
227
+ height: 2px;
228
+ flex-shrink: 0;
229
+ background-color: rgba(64, 255, 94, 0.6);
230
+ }
231
+
232
+ .table-cell {
233
+ position: relative;
234
+ display: flex;
235
+ flex-direction: row;
236
+ align-items: center;
237
+ min-width: 0;
238
+ min-height: 30px;
239
+ padding: 12px 12px;
240
+ box-sizing: border-box;
241
+ }
242
+
243
+ .table-cell-label,
244
+ .table-cell-text {
245
+ width: 100%;
246
+ color: #40ff5e;
247
+ font-size: 16px;
248
+ line-height: 20px;
249
+ }
250
+
251
+ .table-cell-label {
252
+ font-family: monospace;
253
+ font-weight: 700;
254
+ }
255
+
256
+ .table-cell-text {
257
+ font-family: sans-serif;
258
+ font-weight: 300;
259
+ }
260
+
261
+ .table-cell-top-divider {
262
+ position: absolute;
263
+ top: 0;
264
+ left: 0;
265
+ right: 0;
266
+ height: 1px;
267
+ box-sizing: border-box;
268
+ border-width: 1px 0 0 0;
269
+ border-style: dashed;
270
+ border-color: rgba(64, 255, 94, 0.6);
271
+ }
272
+ </style>