@netless/fastboard 0.0.10 → 0.2.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 (103) hide show
  1. package/LICENSE.txt +1 -1
  2. package/dist/index.js +32 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/index.mjs +7 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/package.json +26 -79
  7. package/src/index.ts +2 -34
  8. package/README.md +0 -126
  9. package/dist/index.cjs.js +0 -14
  10. package/dist/index.cjs.js.map +0 -1
  11. package/dist/index.es.js +0 -2642
  12. package/dist/index.es.js.map +0 -1
  13. package/dist/svelte.cjs.js +0 -2
  14. package/dist/svelte.cjs.js.map +0 -1
  15. package/dist/svelte.es.js +0 -31
  16. package/dist/svelte.es.js.map +0 -1
  17. package/dist/vue.cjs.js +0 -2
  18. package/dist/vue.cjs.js.map +0 -1
  19. package/dist/vue.es.js +0 -42
  20. package/dist/vue.es.js.map +0 -1
  21. package/src/WhiteboardApp.ts +0 -146
  22. package/src/behaviors/register-apps.ts +0 -39
  23. package/src/behaviors/style.ts +0 -17
  24. package/src/components/PageControl.scss +0 -80
  25. package/src/components/PageControl.tsx +0 -181
  26. package/src/components/PlayerControl/PlayerControl.scss +0 -145
  27. package/src/components/PlayerControl/PlayerControl.tsx +0 -158
  28. package/src/components/PlayerControl/components/Button.tsx +0 -55
  29. package/src/components/PlayerControl/hooks.ts +0 -88
  30. package/src/components/PlayerControl/icons/Loading.tsx +0 -13
  31. package/src/components/PlayerControl/icons/Pause.tsx +0 -13
  32. package/src/components/PlayerControl/icons/Play.tsx +0 -13
  33. package/src/components/PlayerControl/icons/index.ts +0 -10
  34. package/src/components/PlayerControl/index.ts +0 -1
  35. package/src/components/RedoUndo.scss +0 -56
  36. package/src/components/RedoUndo.tsx +0 -95
  37. package/src/components/Root.scss +0 -55
  38. package/src/components/Root.tsx +0 -61
  39. package/src/components/Toolbar/Content.tsx +0 -93
  40. package/src/components/Toolbar/Toolbar.scss +0 -247
  41. package/src/components/Toolbar/Toolbar.tsx +0 -82
  42. package/src/components/Toolbar/components/ApplianceButtons.tsx +0 -132
  43. package/src/components/Toolbar/components/AppsButton.tsx +0 -106
  44. package/src/components/Toolbar/components/Button.tsx +0 -54
  45. package/src/components/Toolbar/components/ColorBox.tsx +0 -56
  46. package/src/components/Toolbar/components/CutLine.tsx +0 -8
  47. package/src/components/Toolbar/components/PencilButton.tsx +0 -70
  48. package/src/components/Toolbar/components/ShapesButton.tsx +0 -143
  49. package/src/components/Toolbar/components/Slider.tsx +0 -27
  50. package/src/components/Toolbar/components/TextButton.tsx +0 -66
  51. package/src/components/Toolbar/components/UpDownButtons.tsx +0 -49
  52. package/src/components/Toolbar/components/assets/cocos.png +0 -0
  53. package/src/components/Toolbar/components/assets/countdown.png +0 -0
  54. package/src/components/Toolbar/components/assets/geogebra.png +0 -0
  55. package/src/components/Toolbar/components/assets/vscode.png +0 -0
  56. package/src/components/Toolbar/const.ts +0 -32
  57. package/src/components/Toolbar/hooks.ts +0 -113
  58. package/src/components/Toolbar/icons/Apps.tsx +0 -16
  59. package/src/components/Toolbar/icons/Arrow.tsx +0 -16
  60. package/src/components/Toolbar/icons/Circle.tsx +0 -21
  61. package/src/components/Toolbar/icons/Clean.tsx +0 -16
  62. package/src/components/Toolbar/icons/Clicker.tsx +0 -19
  63. package/src/components/Toolbar/icons/Collapse.tsx +0 -17
  64. package/src/components/Toolbar/icons/Diamond.tsx +0 -17
  65. package/src/components/Toolbar/icons/Down.tsx +0 -17
  66. package/src/components/Toolbar/icons/Eraser.tsx +0 -16
  67. package/src/components/Toolbar/icons/Expand.tsx +0 -17
  68. package/src/components/Toolbar/icons/Line.tsx +0 -13
  69. package/src/components/Toolbar/icons/Pencil.tsx +0 -16
  70. package/src/components/Toolbar/icons/Rectangle.tsx +0 -13
  71. package/src/components/Toolbar/icons/Selector.tsx +0 -16
  72. package/src/components/Toolbar/icons/SpeechBalloon.tsx +0 -17
  73. package/src/components/Toolbar/icons/Star.tsx +0 -17
  74. package/src/components/Toolbar/icons/Text.tsx +0 -16
  75. package/src/components/Toolbar/icons/Triangle.tsx +0 -17
  76. package/src/components/Toolbar/icons/Up.tsx +0 -17
  77. package/src/components/Toolbar/icons/index.ts +0 -42
  78. package/src/components/Toolbar/index.ts +0 -1
  79. package/src/components/ZoomControl.scss +0 -80
  80. package/src/components/ZoomControl.tsx +0 -221
  81. package/src/i18n/en.json +0 -31
  82. package/src/i18n/index.ts +0 -22
  83. package/src/i18n/zh-CN.json +0 -32
  84. package/src/icons/ChevronLeft.tsx +0 -21
  85. package/src/icons/ChevronRight.tsx +0 -21
  86. package/src/icons/FilePlus.tsx +0 -18
  87. package/src/icons/Minus.tsx +0 -21
  88. package/src/icons/Plus.tsx +0 -21
  89. package/src/icons/Redo.tsx +0 -24
  90. package/src/icons/Reset.tsx +0 -23
  91. package/src/icons/Undo.tsx +0 -24
  92. package/src/icons/index.tsx +0 -11
  93. package/src/internal/Instance.tsx +0 -275
  94. package/src/internal/helpers.ts +0 -86
  95. package/src/internal/hooks.ts +0 -9
  96. package/src/internal/index.ts +0 -3
  97. package/src/internal/mount-whiteboard.ts +0 -90
  98. package/src/react.tsx +0 -52
  99. package/src/style.scss +0 -35
  100. package/src/svelte.ts +0 -45
  101. package/src/theme/index.ts +0 -36
  102. package/src/types/index.ts +0 -22
  103. package/src/vue.ts +0 -74
@@ -1,146 +0,0 @@
1
- import type { ConversionResponse, SceneDefinition } from "white-web-sdk";
2
- import type {
3
- InsertDocsParams,
4
- InsertMediaParams,
5
- Language,
6
- Layout,
7
- WhiteboardAppConfig,
8
- } from "./internal";
9
- import { genUID, Instance, makeSlideParams } from "./internal";
10
-
11
- export type {
12
- Language,
13
- Layout,
14
- WhiteboardAppConfig,
15
- InsertMediaParams,
16
- InsertDocsParams,
17
- };
18
-
19
- export class WhiteboardApp {
20
- private readonly _instance: Instance;
21
-
22
- public constructor(readonly config: WhiteboardAppConfig) {
23
- this._instance = new Instance(config);
24
- }
25
-
26
- public get room() {
27
- return this._instance.room;
28
- }
29
-
30
- public get manager() {
31
- return this._instance.manager;
32
- }
33
-
34
- public get sdk() {
35
- return this._instance.sdk;
36
- }
37
-
38
- public get i18n() {
39
- return this._instance.i18n;
40
- }
41
-
42
- public get target(): HTMLElement | null {
43
- return this._instance.target;
44
- }
45
-
46
- public get collector(): HTMLElement | null {
47
- return this._instance.collector;
48
- }
49
-
50
- public bindElement(target?: HTMLElement | null) {
51
- this._instance.bindElement(target || null);
52
- }
53
-
54
- public bindCollector(collector?: HTMLElement | null) {
55
- this._instance.bindCollector(collector || null);
56
- }
57
-
58
- public get layout() {
59
- return this._instance.config.layout;
60
- }
61
-
62
- public updateLayout(layout?: Layout | undefined) {
63
- this._instance.updateLayout(layout);
64
- }
65
-
66
- public insertMedia(params: InsertMediaParams) {
67
- this._instance.insertMedia(params);
68
- }
69
-
70
- /**
71
- * Insert PDF/PPTX from conversion result.
72
- * @param status https://developer.netless.link/server-en/home/server-conversion#get-query-task-conversion-progress
73
- */
74
- public insertDocs(
75
- filename: string,
76
- status: ConversionResponse
77
- ): Promise<string | undefined>;
78
-
79
- /**
80
- * Manual way.
81
- */
82
- public insertDocs(params: InsertDocsParams): Promise<string | undefined>;
83
-
84
- public insertDocs(
85
- arg1: string | InsertDocsParams,
86
- arg2?: ConversionResponse
87
- ) {
88
- if (typeof arg1 === "object" && "fileType" in arg1) {
89
- return this._instance.insertDocs(arg1);
90
- } else if (arg2 && arg2.status !== "Finished") {
91
- throw new Error("[WhiteboardApp] cannot insert a converting doc");
92
- } else if (arg2 && arg2.progress) {
93
- const scenes: SceneDefinition[] = arg2.progress.convertedFileList.map(
94
- (f, i) => ({
95
- name: String(i + 1),
96
- ppt: {
97
- src: f.conversionFileUrl,
98
- width: f.width,
99
- height: f.height,
100
- previewURL: f.preview,
101
- },
102
- })
103
- );
104
- const uid = genUID();
105
- const scenePath = `/${arg2.uuid}/${uid}`;
106
- const { scenesWithoutPPT, taskId, url } = makeSlideParams(scenes);
107
- if (taskId && url) {
108
- return this._instance.insertDocs({
109
- fileType: "pptx",
110
- scenePath,
111
- taskId,
112
- title: arg1,
113
- url,
114
- scenes: scenesWithoutPPT,
115
- });
116
- } else {
117
- return this._instance.insertDocs({
118
- fileType: "pdf",
119
- scenePath,
120
- scenes,
121
- title: arg1,
122
- });
123
- }
124
- }
125
- }
126
-
127
- public insertCodeEditor() {
128
- return this._instance.insertCodeEditor();
129
- }
130
-
131
- public insertGeoGebra() {
132
- return this._instance.insertGeoGebra();
133
- }
134
-
135
- public insertCountdown() {
136
- return this._instance.insertCountdown();
137
- }
138
-
139
- public changeLanguage(language: Language) {
140
- return this._instance.changeLanguage(language);
141
- }
142
-
143
- public dispose() {
144
- return this._instance.dispose();
145
- }
146
- }
@@ -1,39 +0,0 @@
1
- import { WindowManager } from "@netless/window-manager";
2
-
3
- WindowManager.register({
4
- kind: "Slide",
5
- appOptions: {
6
- // turn on to show debug controller
7
- debug: false,
8
- },
9
- src: async () => {
10
- const app = await import("@netless/app-slide");
11
- return app.default ?? app;
12
- },
13
- });
14
-
15
- WindowManager.register({
16
- kind: "Monaco",
17
- src: async () => {
18
- const app = await import("@netless/app-monaco");
19
- return app.default ?? app;
20
- },
21
- });
22
- WindowManager.register({
23
- kind: "Countdown",
24
- src: async () => {
25
- const app = await import("@netless/app-countdown");
26
- return app.default ?? app;
27
- },
28
- });
29
- WindowManager.register({
30
- kind: "GeoGebra",
31
- src: async () => {
32
- const app = await import("@netless/app-geogebra");
33
- return app.default ?? app;
34
- },
35
- appOptions: {
36
- HTML5Codebase:
37
- "https://flat-storage-cn-hz.whiteboard.agora.io/GeoGebra/HTML5/5.0/web3d",
38
- },
39
- });
@@ -1,17 +0,0 @@
1
- import { applyStyles } from "../internal";
2
- import style from "../style.scss?inline";
3
-
4
- const newEl = applyStyles(style);
5
-
6
- if (import.meta.hot) {
7
- import.meta.hot.dispose(data => {
8
- data.el = newEl;
9
- });
10
- import.meta.hot.accept(() => {
11
- const oldEl = import.meta.hot?.data.el;
12
- if (oldEl) {
13
- oldEl.innerText = newEl.innerText;
14
- newEl.remove();
15
- }
16
- });
17
- }
@@ -1,80 +0,0 @@
1
- $name: "fastboard-page-control";
2
-
3
- .#{$name} {
4
- display: inline-flex;
5
- align-items: center;
6
- gap: 4px;
7
- padding: 4px;
8
- border-radius: 4px;
9
- backdrop-filter: blur(2px);
10
- -webkit-backdrop-filter: blur(2px);
11
-
12
- &.light {
13
- color: #333;
14
- background-color: rgba($color: #fff, $alpha: 0.85);
15
- border: 1px solid rgba(0, 0, 0, 0.15);
16
- }
17
-
18
- &.dark {
19
- color: #ddd;
20
- background-color: rgba($color: #333, $alpha: 0.85);
21
- border: 1px solid rgba(0, 0, 0, 0.45);
22
- }
23
- }
24
-
25
- .#{$name}-btn {
26
- appearance: none;
27
- cursor: pointer;
28
- margin: 0;
29
- border: 0;
30
- padding: 0;
31
- width: 24px;
32
- height: 24px;
33
- background-color: transparent;
34
- border-radius: 4px;
35
- font-size: 24px;
36
- line-height: 1;
37
-
38
- svg,
39
- img {
40
- width: 1em;
41
- height: 1em;
42
- }
43
-
44
- &:disabled {
45
- opacity: 0.5;
46
- cursor: not-allowed;
47
- }
48
-
49
- &.light:not(:disabled):hover {
50
- background-color: rgba(51, 129, 255, 0.1);
51
- }
52
-
53
- &.dark:not(:disabled):hover {
54
- background-color: rgba(51, 129, 255, 0.25);
55
- }
56
- }
57
-
58
- .#{$name}-cut-line {
59
- height: 24px;
60
- width: 0.5px;
61
-
62
- &.light {
63
- background-color: #e7e7e7;
64
- }
65
-
66
- &.dark {
67
- background-color: rgba(255, 255, 255, 0.15);
68
- }
69
- }
70
-
71
- .#{$name}-slash {
72
- opacity: 0.6;
73
- }
74
-
75
- .#{$name}-page,
76
- .#{$name}-slash,
77
- .#{$name}-page-count {
78
- font-size: 12px;
79
- font-variant-numeric: tabular-nums;
80
- }
@@ -1,181 +0,0 @@
1
- import type { RoomState, ViewVisionMode } from "white-web-sdk";
2
- import type { CommonProps, GenericIcon } from "../types";
3
-
4
- import clsx from "clsx";
5
- import React, { useCallback, useEffect, useState } from "react";
6
- import Tippy from "@tippyjs/react";
7
-
8
- import { TopOffset } from "../theme";
9
- import { Icon } from "../icons";
10
- import { FilePlus } from "../icons/FilePlus";
11
- import { ChevronLeft } from "../icons/ChevronLeft";
12
- import { ChevronRight } from "../icons/ChevronRight";
13
-
14
- export const name = "fastboard-page-control";
15
-
16
- export type PageControlProps = CommonProps &
17
- GenericIcon<"add" | "prev" | "next">;
18
-
19
- export function PageControl({
20
- room,
21
- manager,
22
- theme = "light",
23
- addIcon,
24
- addIconDisable,
25
- prevIcon,
26
- prevIconDisable,
27
- nextIcon,
28
- nextIconDisable,
29
- i18n,
30
- }: PageControlProps) {
31
- const [writable, setWritable] = useState(false);
32
- const [pageIndex, setPageIndex] = useState(0);
33
- const [pageCount, setPageCount] = useState(0);
34
-
35
- const addPage = useCallback(async () => {
36
- if (manager && room) {
37
- await manager.switchMainViewToWriter();
38
- const path = room.state.sceneState.contextPath;
39
- room.putScenes(path, [{}], pageIndex + 1);
40
- await manager.setMainViewSceneIndex(pageIndex + 1);
41
- } else if (!manager && room) {
42
- const path = room.state.sceneState.contextPath;
43
- room.putScenes(path, [{}], pageIndex + 1);
44
- room.setSceneIndex(pageIndex + 1);
45
- }
46
- }, [room, manager, pageIndex]);
47
-
48
- const prevPage = useCallback(() => {
49
- if (room?.isWritable) {
50
- if (manager) {
51
- manager.setMainViewSceneIndex(pageIndex - 1);
52
- } else {
53
- room.pptPreviousStep();
54
- }
55
- }
56
- }, [room, manager, pageIndex]);
57
-
58
- const nextPage = useCallback(() => {
59
- if (room?.isWritable) {
60
- if (manager) {
61
- manager.setMainViewSceneIndex(pageIndex + 1);
62
- } else {
63
- room.pptNextStep();
64
- }
65
- }
66
- }, [room, manager, pageIndex]);
67
-
68
- useEffect(() => {
69
- if (room) {
70
- setWritable(room.isWritable);
71
- setPageIndex(room.state.sceneState.index);
72
- setPageCount(room.state.sceneState.scenes.length);
73
- }
74
-
75
- const onRoomStateChanged = (modifyState: Partial<RoomState>) => {
76
- if (modifyState.sceneState) {
77
- setPageIndex(modifyState.sceneState.index);
78
- setPageCount(modifyState.sceneState.scenes.length);
79
- }
80
- };
81
-
82
- const onMainViewModeChanged = (mode: number) => {
83
- if (room && mode === (0 as ViewVisionMode.Writable)) {
84
- setPageIndex(room.state.sceneState.index);
85
- setPageCount(room.state.sceneState.scenes.length);
86
- }
87
- };
88
-
89
- const updateWritable = () => setWritable(room?.isWritable || false);
90
-
91
- if (room) {
92
- room.callbacks.on("onEnableWriteNowChanged", updateWritable);
93
- room.callbacks.on("onRoomStateChanged", onRoomStateChanged);
94
- manager?.callbacks.on("mainViewModeChange", onMainViewModeChanged);
95
- }
96
-
97
- return () => {
98
- if (room) {
99
- room.callbacks.off("onEnableWriteNowChanged", updateWritable);
100
- room.callbacks.off("onRoomStateChanged", onRoomStateChanged);
101
- manager?.callbacks.off("mainViewModeChange", onMainViewModeChanged);
102
- }
103
- };
104
- }, [room, manager]);
105
-
106
- const disabled = !writable;
107
-
108
- return (
109
- <div className={clsx(name, theme)}>
110
- {/* <span className={clsx(`${name}-cut-line`, theme)} />{" "} */}
111
- <Tippy
112
- className="fastboard-tip"
113
- content={i18n?.t("prevPage")}
114
- theme={theme}
115
- disabled={disabled}
116
- placement="top"
117
- duration={300}
118
- offset={TopOffset}
119
- >
120
- <button
121
- className={clsx(`${name}-btn`, "prev", theme)}
122
- disabled={disabled || pageIndex === 0}
123
- onClick={prevPage}
124
- >
125
- <Icon
126
- fallback={<ChevronLeft theme={theme} />}
127
- src={disabled ? prevIconDisable : prevIcon}
128
- alt="[prev]"
129
- />
130
- </button>
131
- </Tippy>
132
- <span className={clsx(`${name}-page`, theme)}>
133
- {pageCount === 0 ? "\u2026" : pageIndex + 1}
134
- </span>
135
- <span className={clsx(`${name}-slash`, theme)}>/</span>
136
- <span className={clsx(`${name}-page-count`, theme)}>{pageCount}</span>
137
- <Tippy
138
- className="fastboard-tip"
139
- content={i18n?.t("nextPage")}
140
- theme={theme}
141
- disabled={disabled}
142
- placement="top"
143
- duration={300}
144
- offset={TopOffset}
145
- >
146
- <button
147
- className={clsx(`${name}-btn`, "next", theme)}
148
- disabled={disabled || pageIndex === pageCount - 1}
149
- onClick={nextPage}
150
- >
151
- <Icon
152
- fallback={<ChevronRight theme={theme} />}
153
- src={disabled ? nextIconDisable : nextIcon}
154
- alt="[next]"
155
- />
156
- </button>
157
- </Tippy>
158
- <Tippy
159
- className="fastboard-tip"
160
- content={i18n?.t("addPage")}
161
- theme={theme}
162
- disabled={disabled}
163
- placement="top"
164
- duration={300}
165
- offset={TopOffset}
166
- >
167
- <button
168
- className={clsx(`${name}-btn`, "add", theme)}
169
- disabled={disabled}
170
- onClick={addPage}
171
- >
172
- <Icon
173
- fallback={<FilePlus theme={theme} />}
174
- src={disabled ? addIconDisable : addIcon}
175
- alt="[add]"
176
- />
177
- </button>
178
- </Tippy>
179
- </div>
180
- );
181
- }
@@ -1,145 +0,0 @@
1
- $name: "fastboard-player-control";
2
-
3
- .#{$name} {
4
- width: 100%;
5
- display: inline-flex;
6
- align-items: center;
7
- gap: 4px;
8
- padding: 4px;
9
- border-radius: 4px;
10
- backdrop-filter: blur(2px);
11
- -webkit-backdrop-filter: blur(2px);
12
-
13
- &.auto-hide {
14
- opacity: 0;
15
- transition: opacity 0.2s;
16
-
17
- &:hover {
18
- opacity: 1;
19
- }
20
- }
21
-
22
- .rc-slider-disabled {
23
- background: transparent;
24
- opacity: 0.5;
25
- }
26
-
27
- .rc-slider-rail,
28
- .rc-slider-track {
29
- height: 2px;
30
- }
31
-
32
- .tippy-content {
33
- padding: 8px;
34
- }
35
- .tippy-box {
36
- border: 1px solid rgba(0, 0, 0, 0.15);
37
- background-color: rgba($color: #333, $alpha: 0.95);
38
- backdrop-filter: blur(2px);
39
- -webkit-backdrop-filter: blur(2px);
40
- }
41
- .tippy-box[data-theme~="light"] {
42
- background-color: rgba($color: #fff, $alpha: 0.95);
43
- box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.25);
44
- }
45
-
46
- &.light {
47
- color: #333;
48
- background-color: rgba($color: #fff, $alpha: 0.85);
49
- border: 1px solid rgba(0, 0, 0, 0.15);
50
- }
51
-
52
- &.dark {
53
- color: #ddd;
54
- background-color: rgba($color: #333, $alpha: 0.85);
55
- border: 1px solid rgba(0, 0, 0, 0.45);
56
- }
57
- }
58
-
59
- .#{$name}-btn {
60
- appearance: none;
61
- cursor: pointer;
62
- margin: 0;
63
- border: 0;
64
- padding: 0;
65
- min-width: 24px;
66
- height: 24px;
67
- background-color: transparent;
68
- border-radius: 4px;
69
- font-size: 24px;
70
- line-height: 1;
71
- display: inline-flex;
72
- align-items: center;
73
- justify-content: center;
74
-
75
- svg,
76
- img {
77
- width: 1em;
78
- height: 1em;
79
- }
80
-
81
- &:disabled {
82
- opacity: 0.5;
83
- cursor: not-allowed;
84
- }
85
-
86
- &.light:not(:disabled):hover {
87
- background-color: rgba(51, 129, 255, 0.1);
88
- }
89
-
90
- &.dark:not(:disabled):hover {
91
- background-color: rgba(51, 129, 255, 0.25);
92
- }
93
-
94
- &.loading {
95
- animation: fastboard-player-control-rotate 0.5s linear infinite;
96
- }
97
-
98
- @keyframes fastboard-player-control-rotate {
99
- 100% {
100
- transform: rotate(360deg);
101
- }
102
- }
103
- }
104
-
105
- .#{$name}-panel {
106
- padding: 0;
107
- display: flex;
108
- flex-flow: column nowrap;
109
- align-items: stretch;
110
- gap: 4px;
111
-
112
- .#{$name}-btn {
113
- width: initial;
114
- height: initial;
115
- user-select: none;
116
- font-size: 12px;
117
- padding: 4px;
118
- justify-content: flex-end;
119
-
120
- &.active {
121
- color: #3381ff;
122
- }
123
- }
124
- }
125
-
126
- .#{$name}-slider {
127
- width: 100%;
128
- padding: 0 7px;
129
-
130
- &.loading {
131
- cursor: not-allowed;
132
- }
133
- }
134
-
135
- .#{$name}-slash {
136
- opacity: 0.6;
137
- }
138
-
139
- .#{$name}-current,
140
- .#{$name}-slash,
141
- .#{$name}-total,
142
- .#{$name}-speed-text {
143
- font-size: 12px;
144
- font-variant-numeric: tabular-nums;
145
- }