@fibery/ui-kit 1.34.2 → 1.34.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fibery/ui-kit",
3
- "version": "1.34.2",
3
+ "version": "1.34.3",
4
4
  "private": false,
5
5
  "files": [
6
6
  "src/antd/styles.ts",
@@ -74,9 +74,9 @@
74
74
  "screenfull": "6.0.1",
75
75
  "tabbable": "5.2.1",
76
76
  "ua-parser-js": "1.0.39",
77
- "@fibery/emoji-data": "2.6.0",
78
77
  "@fibery/helpers": "1.3.0",
79
- "@fibery/react": "1.4.0"
78
+ "@fibery/react": "1.4.0",
79
+ "@fibery/emoji-data": "2.6.0"
80
80
  },
81
81
  "peerDependencies": {
82
82
  "react": "^18.2.0",
@@ -1,4 +1,4 @@
1
- import {CSSProperties, css, cx} from "@linaria/core";
1
+ import {css, CSSProperties, cx} from "@linaria/core";
2
2
  import {forwardRef} from "react";
3
3
  import {themeVars} from "../design-system";
4
4
  import {iconColorVar} from "../icons/Icon";
@@ -3,7 +3,7 @@ import {forwardRef} from "react";
3
3
  import {border, fontWeight, space, textStyles} from "../design-system";
4
4
  import {iconSizeVar} from "../icons/Icon";
5
5
  import SpinnerIcon from "../icons/react/Spinner";
6
- import {BaseButtonProps, BaseButton, ButtonSize} from "./base-button";
6
+ import {BaseButton, BaseButtonProps, ButtonSize} from "./base-button";
7
7
  import {useIsSupportHardwareKeyboard} from "../use-is-support-hardware-keyboard";
8
8
 
9
9
  export type ButtonProps = {
@@ -1,9 +1,9 @@
1
1
  import {css, cx} from "@linaria/core";
2
2
  import {forwardRef} from "react";
3
- import {BaseButtonProps, BaseButton, ButtonSize} from "./base-button";
4
3
  import {border, space} from "../design-system";
5
4
  import {iconSizeVar} from "../icons/Icon";
6
5
  import Spinner from "../icons/react/Spinner";
6
+ import {BaseButton, BaseButtonProps, ButtonSize} from "./base-button";
7
7
 
8
8
  export type IconButtonProps = {
9
9
  size?: ButtonSize;
@@ -341,12 +341,14 @@ export const themeColors = {
341
341
  ],
342
342
  // :focus
343
343
  colorBgEntityBoxDefaultFocus: [whiteA.whiteA0, slateDark.slate3],
344
+ colorOverlayEntityBoxDefaultFocus: [indigo.indigo9, indigoDark.indigo9],
344
345
  shadowStrokeEntityBoxDefaultFocus: [
345
346
  `0 0 0 2px ${getOpacities(indigo.indigo9).opacity40}`,
346
347
  `0 0 0 2px ${getOpacities(indigoDark.indigo9).opacity40}`,
347
348
  ],
348
349
  // :focus:hover
349
350
  colorBgEntityBoxDefaultFocusHover: [whiteA.whiteA0, slateDark.slate4],
351
+ colorOverlayEntityBoxDefaultFocusHover: [indigo.indigo9, indigoDark.indigo9],
350
352
  shadowStrokeEntityBoxDefaultFocusHover: [
351
353
  `0 0 0 2px ${getOpacities(indigo.indigo9).opacity60}`,
352
354
  `0 0 0 2px ${getOpacities(indigoDark.indigo9).opacity60}`,
@@ -426,6 +428,11 @@ export const themeColors = {
426
428
  allowedDropColor: [getOpacities(slate.slate3).opacity80, getOpacities(slateDark.slate3).opacity80],
427
429
  relationViewBgColor: [slate.slate2, slateDark.slate3],
428
430
 
431
+ mySpaceIconColor: [blackA.blackA11, whiteA.whiteA11],
432
+ mySpaceIconBg: [getOpacities(blackA.blackA11).opacity20, getOpacities(whiteA.whiteA11).opacity20],
433
+ favoritesIconColor: [yellow.yellow8, yellowDark.yellow11],
434
+ favoritesIconBg: [getOpacities(yellow.yellow8).opacity20, getOpacities(yellowDark.yellow11).opacity20],
435
+
429
436
  // Unit
430
437
  unitBg: [slate.slate3, slateDark.slate6],
431
438
  unitBgHover: [slate.slate4, slateDark.slate7],
@@ -494,6 +501,7 @@ export const themeColors = {
494
501
  progressText: [slate.slate11, slate.slate11],
495
502
  progressFillBg: [slate.slate11, slate.slate11],
496
503
  progressFillText: [whiteA.whiteA0, whiteA.whiteA0],
504
+ progressBarFillNeutral: [getOpacities(slate.slate9).opacity20, getOpacities(slateDark.slate9).opacity20],
497
505
  progressBarFill: [indigo.indigo9, indigoDark.indigo10],
498
506
  progressBarBg: [getOpacities(indigo.indigo9).opacity25, getOpacities(indigoDark.indigo10).opacity25],
499
507
  searchFiltersBg: [slate.slate1, slateDark.slate2],
@@ -902,7 +910,7 @@ export const layout = {
902
910
  enumItemHeight: 32,
903
911
  menuItemHeight: 32,
904
912
  newMenuItemHeight: 28, // I'm ok
905
- newMenuIconSize: 20,
913
+ newMenuIconSize: 18,
906
914
  viewHeaderHeight: space.s12 * 7,
907
915
  viewHeaderCompactHeight: 52,
908
916
  columnMinWidth: 240,
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const Equation: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"d":"M11.667 2.306a.75.75 0 0 0-.701.483L6.323 15.005l-1.55-3.374a.75.75 0 0 0-.68-.437H1.943a.75.75 0 0 0 0 1.5h1.667l2.096 4.563a.75.75 0 0 0 1.383-.046l5.094-13.405h5.872a.75.75 0 0 0 0-1.5h-6.39Z"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M15.5 11.272c.62-.653 1.415-1.189 2.463-1.189a.75.75 0 1 1 0 1.5c-.479 0-.907.229-1.375.722-.402.422-.768.968-1.174 1.593.269.663.515 1.227.824 1.648.326.444.659.648 1.114.648a.75.75 0 0 1 0 1.5c-1.072 0-1.809-.56-2.323-1.26a6.493 6.493 0 0 1-.61-1.057 8.202 8.202 0 0 1-1.017 1.164c-.72.663-1.618 1.153-2.772 1.153a.75.75 0 1 1 0-1.5c.68 0 1.232-.273 1.754-.755.482-.445.906-1.037 1.347-1.705-.246-.6-.479-1.112-.765-1.502-.325-.444-.658-.649-1.114-.649a.75.75 0 0 1 0-1.5c1.072 0 1.81.56 2.324 1.262.202.275.379.585.537.905.248-.349.509-.685.787-.978Z"},"children":[]}],"metadata":""}]},"name":"equation"};
7
+
8
+ export default Equation;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const LockOutline: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"width":20,"height":20,"fill":"none"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M6.912 2.44C7.594 1.488 8.647 1 10 1s2.406.487 3.088 1.44c.647.908.882 2.135.882 3.477v.913h.28c.707 0 1.408.2 1.939.692.54.5.811 1.216.811 2.058v5.67c0 .87-.54 1.56-1.041 1.986-.263.223-.55.406-.827.536-.26.122-.575.228-.882.228h-8.5C4.107 18 3 16.744 3 15.25V9.58c0-.842.273-1.559.813-2.059.53-.49 1.23-.691 1.937-.691h.28v-.913c0-1.342.235-2.569.882-3.476Zm.618 4.39h4.94v-.913c0-1.21-.22-2.067-.603-2.605-.35-.49-.908-.812-1.867-.812-.96 0-1.516.321-1.867.812-.384.538-.603 1.395-.603 2.605v.913ZM4.832 8.623c-.175.161-.332.445-.332.957v5.67c0 .715.484 1.25 1.25 1.25h8.502a.979.979 0 0 0 .242-.086c.155-.072.33-.183.493-.321.35-.298.513-.608.513-.843V9.58c0-.513-.157-.797-.33-.958-.184-.17-.484-.292-.92-.292h-8.5c-.434 0-.734.122-.918.293ZM10 10.5a.75.75 0 0 1 .75.75v2.25a.75.75 0 0 1-1.5 0v-2.25a.75.75 0 0 1 .75-.75Z","fill":"currentColor"},"children":[]}],"metadata":""}]},"name":"lock-outline"};
7
+
8
+ export default LockOutline;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const ShowAuthor: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M10 9C8.07 9 6.5 7.43 6.5 5.5S8.07 2 10 2s3.5 1.57 3.5 3.5S11.93 9 10 9Zm0-5.5c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2Z"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M8.78 17.95c-1.3-.1-2.57-.34-3.77-.72-.62-.2-1.13-.65-1.4-1.24-.26-.58-.27-1.25 0-1.83A7.002 7.002 0 0 1 10 9.99l.243.02c.437.035.67.053.9.095.262.048.52.126 1.074.294l.533.161c.38.16.56.6.39.98-.16.38-.6.56-.98.39-.7-.3-1.43-.45-2.16-.45-2.17 0-4.14 1.29-5.02 3.27-.09.19-.08.41 0 .6.09.2.27.36.48.43 1.09.34 2.24.56 3.43.65.41.03.72.39.69.8-.03.39-.41.72-.8.72Z"},"children":[]},{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M10.72 18.28c.14.14.33.22.53.22v-.01c.08 0 .16-.01.24-.04l2.46-.85c.25-.09.48-.23.67-.42l3.3-3.3c.78-.78.77-2.03 0-2.81-.78-.77-2.04-.77-2.81 0l-3.3 3.3c-.19.19-.34.42-.42.67l-.85 2.46c-.09.28-.02.58.18.78Zm5.45-6.14c.1-.09.22-.14.34-.14l-.01-.01c.13 0 .25.05.35.15.19.19.19.49 0 .68l-3.3 3.3a.18.18 0 0 1-.09.06l-1 .35.35-1c.01-.03.03-.06.06-.09l3.3-3.3Z"},"children":[]}],"metadata":""}]},"name":"show-author"};
7
+
8
+ export default ShowAuthor;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const UnlockFilled: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"width":20,"height":20,"fill":"none"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M14 1c-1.363 0-2.425.5-3.11 1.483-.654.934-.89 2.196-.89 3.577v.77H4.75c-.706 0-1.406.2-1.937.691C2.273 8.021 2 8.737 2 9.58v5.67C2 16.744 3.107 18 4.75 18h8.5c.307 0 .622-.106.882-.228.277-.13.564-.313.827-.536.5-.426 1.041-1.116 1.041-1.986V9.58c0-.842-.271-1.558-.811-2.058-.53-.492-1.232-.692-1.939-.692h-1.739v-.77c0-1.245.221-2.127.608-2.68.354-.506.914-.836 1.881-.836s1.527.33 1.88.836c.38.543.524 1.208.578 1.874.033.412.363.746.776.746.42 0 .764-.344.732-.764-.073-.974-.29-1.943-.855-2.753C16.424 1.5 15.363 1 14 1ZM9.75 11.25a.75.75 0 0 0-1.5 0v2.25a.75.75 0 0 0 1.5 0v-2.25Z","fill":"currentColor"},"children":[]}],"metadata":""}]},"name":"unlock-filled"};
7
+
8
+ export default UnlockFilled;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const UnlockOutline: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"width":20,"height":20,"fill":"none"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M14 1c-1.363 0-2.425.5-3.11 1.483-.654.934-.89 2.196-.89 3.577v.77H4.75c-.706 0-1.406.2-1.937.691C2.273 8.021 2 8.737 2 9.58v5.67C2 16.744 3.107 18 4.75 18h8.5c.307 0 .622-.106.882-.228.277-.13.564-.313.827-.536.5-.426 1.041-1.116 1.041-1.986V9.58c0-.842-.271-1.558-.811-2.058-.53-.492-1.232-.692-1.939-.692h-1.739v-.77c0-1.245.221-2.127.608-2.68.354-.506.914-.836 1.881-.836s1.527.33 1.88.836c.391.559.532 1.246.582 1.932.03.413.36.748.775.748.42 0 .763-.343.734-.761-.07-.996-.282-1.989-.86-2.816C16.424 1.5 15.363 1 14 1ZM3.832 8.623c-.175.161-.332.445-.332.957v5.67c0 .715.484 1.25 1.25 1.25h8.502c.017-.004.099-.018.242-.086.155-.072.33-.183.493-.321.35-.298.513-.608.513-.843V9.58c0-.513-.157-.797-.33-.958-.184-.17-.484-.292-.92-.292h-8.5c-.434 0-.734.122-.918.293ZM9.75 11.25a.75.75 0 0 0-1.5 0v2.25a.75.75 0 0 0 1.5 0v-2.25Z","fill":"currentColor"},"children":[]}],"metadata":""}]},"name":"unlock-outline"};
7
+
8
+ export default UnlockOutline;
@@ -83,6 +83,7 @@ export { default as EditValue } from './EditValue';
83
83
  export { default as Email } from './Email';
84
84
  export { default as EmojiDelete } from './EmojiDelete';
85
85
  export { default as EntityMerge } from './EntityMerge';
86
+ export { default as Equation } from './Equation';
86
87
  export { default as Export } from './Export';
87
88
  export { default as ExtensionAssignments } from './ExtensionAssignments';
88
89
  export { default as ExtensionAvatar } from './ExtensionAvatar';
@@ -143,6 +144,7 @@ export { default as LeftPanel } from './LeftPanel';
143
144
  export { default as Levels } from './Levels';
144
145
  export { default as LineDivider } from './LineDivider';
145
146
  export { default as Link } from './Link';
147
+ export { default as LockOutline } from './LockOutline';
146
148
  export { default as Lock } from './Lock';
147
149
  export { default as Loom } from './Loom';
148
150
  export { default as LoupeZoomIn } from './LoupeZoomIn';
@@ -249,6 +251,7 @@ export { default as Settings } from './Settings';
249
251
  export { default as Share } from './Share';
250
252
  export { default as Shared } from './Shared';
251
253
  export { default as ShieldKeyhole } from './ShieldKeyhole';
254
+ export { default as ShowAuthor } from './ShowAuthor';
252
255
  export { default as SidebarFieldsOpened } from './SidebarFieldsOpened';
253
256
  export { default as SidebarFields } from './SidebarFields';
254
257
  export { default as Sidebar } from './Sidebar';
@@ -304,6 +307,8 @@ export { default as UnitsProgressBar } from './UnitsProgressBar';
304
307
  export { default as UnitsRichText } from './UnitsRichText';
305
308
  export { default as UnitsSnippet } from './UnitsSnippet';
306
309
  export { default as Unlink } from './Unlink';
310
+ export { default as UnlockFilled } from './UnlockFilled';
311
+ export { default as UnlockOutline } from './UnlockOutline';
307
312
  export { default as Upgrade } from './Upgrade';
308
313
  export { default as UsbFlashDrive } from './UsbFlashDrive';
309
314
  export { default as UserRole } from './UserRole';
@@ -0,0 +1,13 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import {forwardRef} from 'react';
4
+ import EquationSvg from '../ast/Equation';
5
+ import { Icon } from '../Icon';
6
+ import { IconBaseProps } from '../types';
7
+
8
+ const Equation = forwardRef<SVGSVGElement, IconBaseProps>(function Equation(
9
+ props: IconBaseProps,
10
+ ref: React.Ref<SVGSVGElement>
11
+ ) {return <Icon {...props} className={props.className} ref={ref} icon={EquationSvg} />});
12
+
13
+ export default Equation;
@@ -0,0 +1,13 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import {forwardRef} from 'react';
4
+ import LockOutlineSvg from '../ast/LockOutline';
5
+ import { Icon } from '../Icon';
6
+ import { IconBaseProps } from '../types';
7
+
8
+ const LockOutline = forwardRef<SVGSVGElement, IconBaseProps>(function LockOutline(
9
+ props: IconBaseProps,
10
+ ref: React.Ref<SVGSVGElement>
11
+ ) {return <Icon {...props} className={props.className} ref={ref} icon={LockOutlineSvg} />});
12
+
13
+ export default LockOutline;
@@ -0,0 +1,13 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import {forwardRef} from 'react';
4
+ import ShowAuthorSvg from '../ast/ShowAuthor';
5
+ import { Icon } from '../Icon';
6
+ import { IconBaseProps } from '../types';
7
+
8
+ const ShowAuthor = forwardRef<SVGSVGElement, IconBaseProps>(function ShowAuthor(
9
+ props: IconBaseProps,
10
+ ref: React.Ref<SVGSVGElement>
11
+ ) {return <Icon {...props} className={props.className} ref={ref} icon={ShowAuthorSvg} />});
12
+
13
+ export default ShowAuthor;
@@ -0,0 +1,13 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import {forwardRef} from 'react';
4
+ import UnlockFilledSvg from '../ast/UnlockFilled';
5
+ import { Icon } from '../Icon';
6
+ import { IconBaseProps } from '../types';
7
+
8
+ const UnlockFilled = forwardRef<SVGSVGElement, IconBaseProps>(function UnlockFilled(
9
+ props: IconBaseProps,
10
+ ref: React.Ref<SVGSVGElement>
11
+ ) {return <Icon {...props} className={props.className} ref={ref} icon={UnlockFilledSvg} />});
12
+
13
+ export default UnlockFilled;
@@ -0,0 +1,13 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import {forwardRef} from 'react';
4
+ import UnlockOutlineSvg from '../ast/UnlockOutline';
5
+ import { Icon } from '../Icon';
6
+ import { IconBaseProps } from '../types';
7
+
8
+ const UnlockOutline = forwardRef<SVGSVGElement, IconBaseProps>(function UnlockOutline(
9
+ props: IconBaseProps,
10
+ ref: React.Ref<SVGSVGElement>
11
+ ) {return <Icon {...props} className={props.className} ref={ref} icon={UnlockOutlineSvg} />});
12
+
13
+ export default UnlockOutline;
@@ -83,6 +83,7 @@ export { default as EditValue } from './EditValue';
83
83
  export { default as Email } from './Email';
84
84
  export { default as EmojiDelete } from './EmojiDelete';
85
85
  export { default as EntityMerge } from './EntityMerge';
86
+ export { default as Equation } from './Equation';
86
87
  export { default as Export } from './Export';
87
88
  export { default as ExtensionAssignments } from './ExtensionAssignments';
88
89
  export { default as ExtensionAvatar } from './ExtensionAvatar';
@@ -143,6 +144,7 @@ export { default as LeftPanel } from './LeftPanel';
143
144
  export { default as Levels } from './Levels';
144
145
  export { default as LineDivider } from './LineDivider';
145
146
  export { default as Link } from './Link';
147
+ export { default as LockOutline } from './LockOutline';
146
148
  export { default as Lock } from './Lock';
147
149
  export { default as Loom } from './Loom';
148
150
  export { default as LoupeZoomIn } from './LoupeZoomIn';
@@ -249,6 +251,7 @@ export { default as Settings } from './Settings';
249
251
  export { default as Share } from './Share';
250
252
  export { default as Shared } from './Shared';
251
253
  export { default as ShieldKeyhole } from './ShieldKeyhole';
254
+ export { default as ShowAuthor } from './ShowAuthor';
252
255
  export { default as SidebarFieldsOpened } from './SidebarFieldsOpened';
253
256
  export { default as SidebarFields } from './SidebarFields';
254
257
  export { default as Sidebar } from './Sidebar';
@@ -304,6 +307,8 @@ export { default as UnitsProgressBar } from './UnitsProgressBar';
304
307
  export { default as UnitsRichText } from './UnitsRichText';
305
308
  export { default as UnitsSnippet } from './UnitsSnippet';
306
309
  export { default as Unlink } from './Unlink';
310
+ export { default as UnlockFilled } from './UnlockFilled';
311
+ export { default as UnlockOutline } from './UnlockOutline';
307
312
  export { default as Upgrade } from './Upgrade';
308
313
  export { default as UsbFlashDrive } from './UsbFlashDrive';
309
314
  export { default as UserRole } from './UserRole';
package/src/toggle.tsx CHANGED
@@ -168,7 +168,14 @@ export const Toggle: FC<ToggleProps> = ({
168
168
  <Input
169
169
  outlineColor={outlineColor}
170
170
  onChange={onChange}
171
- className={className}
171
+ className={cx(
172
+ className,
173
+ disabled
174
+ ? css`
175
+ cursor: default;
176
+ `
177
+ : null
178
+ )}
172
179
  type="checkbox"
173
180
  disabled={disabled}
174
181
  checked={value}
package/src/tooltip.tsx CHANGED
@@ -31,31 +31,29 @@ export const tooltipStyle = css`
31
31
  padding: ${space.s6}px ${space.s8}px;
32
32
  border-radius: ${border.radius6}px;
33
33
  box-shadow: ${themeVars.actionMenuShadow};
34
-
35
- @media (prefers-reduced-motion: no-preference) {
36
- @keyframes zoomIn {
37
- from {
38
- opacity: 0;
39
- transform: scale(0.8);
40
- }
41
-
42
- to {
43
- opacity: 1;
44
- transform: scale(1);
45
- }
34
+ @keyframes zoomIn {
35
+ from {
36
+ opacity: 0;
37
+ transform: scale(0.8);
46
38
  }
47
39
 
48
- @keyframes zoomOut {
49
- from {
50
- transform: scale(1);
51
- }
40
+ to {
41
+ opacity: 1;
42
+ transform: scale(1);
43
+ }
44
+ }
52
45
 
53
- to {
54
- opacity: 0;
55
- transform: scale(0.8);
56
- }
46
+ @keyframes zoomOut {
47
+ from {
48
+ transform: scale(1);
57
49
  }
58
50
 
51
+ to {
52
+ opacity: 0;
53
+ transform: scale(0.8);
54
+ }
55
+ }
56
+ @media (prefers-reduced-motion: no-preference) {
59
57
  will-change: transform, opacity;
60
58
  transform-origin: var(--radix-tooltip-content-transform-origin);
61
59
  animation-duration: 0.1s;