best-unit 1.0.0 → 1.0.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.
Files changed (48) hide show
  1. package/README.md +1 -0
  2. package/dist/best-unit.cjs +60 -0
  3. package/dist/best-unit.js +3988 -0
  4. package/dist/types/global.d.ts +64 -0
  5. package/dist/types/index.ts +17 -0
  6. package/dist/types/preact-custom-element.d.ts +1 -0
  7. package/index.html +2 -2
  8. package/package.json +14 -7
  9. package/src/api/axiosInstance.ts +94 -0
  10. package/src/api/index.ts +118 -15
  11. package/src/api/proxy.ts +11 -0
  12. package/src/components/business/recharge-sdk/components/Button.tsx +42 -0
  13. package/src/components/business/recharge-sdk/components/OfflineTransferForm.tsx +365 -0
  14. package/src/components/business/recharge-sdk/components/OnlineRechargeForm.tsx +389 -0
  15. package/src/components/business/recharge-sdk/components/Recharge.tsx +288 -0
  16. package/src/components/business/recharge-sdk/index.tsx +39 -0
  17. package/src/components/business/statistical-balance/index.tsx +206 -0
  18. package/src/components/common/HoverPopover.tsx +215 -0
  19. package/src/components/common/Message.tsx +324 -0
  20. package/src/components/common/Select.tsx +278 -0
  21. package/src/components/common/Upload.tsx +207 -0
  22. package/src/demo/App.tsx +429 -0
  23. package/src/demo/index.tsx +4 -0
  24. package/src/local/en.ts +61 -0
  25. package/src/local/index.ts +36 -0
  26. package/src/local/zh.ts +60 -0
  27. package/src/main.ts +10 -0
  28. package/src/types/global.d.ts +64 -0
  29. package/src/types/index.ts +17 -0
  30. package/src/types/preact-custom-element.d.ts +1 -0
  31. package/src/utils/business/index.ts +48 -0
  32. package/src/utils/common/index.ts +8 -0
  33. package/src/vite-env.d.ts +1 -0
  34. package/tsconfig.app.json +31 -0
  35. package/tsconfig.json +15 -0
  36. package/tsconfig.node.json +24 -0
  37. package/vite.config.ts +18 -0
  38. package/example/index.html +0 -24
  39. package/public/vite.svg +0 -1
  40. package/src/App.jsx +0 -6
  41. package/src/api/define-api.ts +0 -49
  42. package/src/javascript.svg +0 -1
  43. package/src/main.jsx +0 -4
  44. package/src/sdk/index.ts +0 -33
  45. package/src/style.css +0 -96
  46. package/src/views/AccountModal.jsx +0 -125
  47. package/src/views/Home.jsx +0 -53
  48. package/vite.config.js +0 -31
@@ -0,0 +1,36 @@
1
+ import { getZhText, zh } from "./zh";
2
+ import { getEnText, en } from "./en";
3
+ import { Locale } from "../types";
4
+
5
+ // 获取当前语言
6
+ export function getCurrentLocale(): Locale {
7
+ const fundUnitParams = JSON.parse(
8
+ sessionStorage.getItem("fund_unit_params") || "{}"
9
+ );
10
+ return fundUnitParams.locale || Locale.ZH;
11
+ }
12
+
13
+ // 获取国际化文本
14
+ export function getLocaleText() {
15
+ const locale = getCurrentLocale();
16
+ return locale === Locale.ZH ? zh : en;
17
+ }
18
+
19
+ // 获取指定语言的文本
20
+ export function getLocaleTextByLang(locale: Locale) {
21
+ return locale === Locale.ZH ? zh : en;
22
+ }
23
+
24
+ // 使用中文key的t函数
25
+ export function t(zhKey: string): string {
26
+ const locale = getCurrentLocale();
27
+
28
+ if (locale === "zh") {
29
+ return getZhText(zhKey);
30
+ } else {
31
+ return getEnText(zhKey);
32
+ }
33
+ }
34
+
35
+ // 导出所有语言包
36
+ export { zh, en };
@@ -0,0 +1,60 @@
1
+ // 中文语言包
2
+ export const zh: Record<string, string> = {
3
+ // 余额相关
4
+ 余额详情: "余额详情",
5
+ 真实金额: "真实金额",
6
+ 冻结金额: "冻结金额",
7
+ 总可用: "总可用",
8
+ 暂无数据: "暂无数据",
9
+ "金额需在1到999999.99之间": "金额需在1到999999.99之间",
10
+
11
+ // 充值相关
12
+ "充值 / 转账": "充值 / 转账",
13
+ 在线充值: "在线充值",
14
+ 线下转账: "线下转账",
15
+ 充值币种: "充值币种",
16
+ 充值金额: "充值金额",
17
+ 支付平台: "支付平台",
18
+ 请选择充值币种: "请选择充值币种",
19
+ 请输入充值金额: "请输入充值金额",
20
+ 请选择支付平台: "请选择支付平台",
21
+ "需要收取手续费,实际支付金额约为:": "需要收取手续费,实际支付金额约为:",
22
+ "提交失败,请重试": "提交失败,请重试",
23
+ "提交中...": "提交中...",
24
+ 去支付: "去支付",
25
+ 取消: "取消",
26
+ 关闭: "关闭",
27
+
28
+ // 离线转账相关
29
+ 第三方支付平台: "第三方支付平台",
30
+ 交易ID: "交易ID",
31
+ 请输入转账交易ID: "请输入转账交易ID",
32
+ 上传文件: "上传文件",
33
+ 请上传转账凭证: "请上传转账凭证",
34
+ 离线充值创建成功: "离线充值创建成功",
35
+
36
+ // 通用
37
+ "加载中...": "加载中...",
38
+ 错误: "错误",
39
+ 成功: "成功",
40
+ 必填: "必填",
41
+
42
+ // 按钮文本
43
+ "充值/转账": "充值/转账",
44
+ 切换为暗黑主题: "切换为暗黑主题",
45
+ 切换为白色主题: "切换为白色主题",
46
+
47
+ // 上传组件相关
48
+ 点击或拖拽文件到此处上传: "点击或拖拽文件到此处上传",
49
+ "支持 JPG、PNG、PDF 格式,单个文件不超过 20MB,最多上传":
50
+ "支持 JPG、PNG、PDF 格式,单个文件不超过 20MB,最多上传",
51
+ 个文件: "个文件",
52
+ "正在上传...": "正在上传...",
53
+ 已上传: "已上传",
54
+ 移除: "移除",
55
+ };
56
+
57
+ // 根据中文key获取文本的函数
58
+ export function getZhText(zhKey: string): string {
59
+ return zh[zhKey] || zhKey;
60
+ }
package/src/main.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { npmTest, printCurrentTime } from "./utils/common/index";
2
+ import { initFundUnit } from "./utils/business/index";
3
+ import { viteProxy } from "./api/proxy";
4
+
5
+ import "./components/business/recharge-sdk";
6
+ import "./components/business/statistical-balance";
7
+
8
+ // 可选:导出组件列表或版本信息
9
+ export const components = ["best-recharge", "best-statistical-balance"];
10
+ export { npmTest, printCurrentTime, initFundUnit, viteProxy };
@@ -0,0 +1,64 @@
1
+ export declare function npmTest(): void;
2
+
3
+ export declare function printCurrentTime(): void;
4
+
5
+ export declare function initFundUnit(params: {
6
+ token: string;
7
+ merchant_id?: string;
8
+ biz_type?: string;
9
+ fund_balance_id?: string;
10
+ user_id: string;
11
+ theme?: Theme;
12
+ locale?: Locale;
13
+ env: Env;
14
+ }): {
15
+ token: string;
16
+ merchantId?: string;
17
+ bizType?: string;
18
+ fundBalanceId?: string;
19
+ theme?: Theme;
20
+ locale: Locale;
21
+ env: Env;
22
+ };
23
+
24
+ // Vite 代理配置类型
25
+ export declare const viteProxy: {
26
+ "/api": {
27
+ target: string;
28
+ changeOrigin: boolean;
29
+ rewrite: (path: string) => string;
30
+ secure: boolean;
31
+ };
32
+ };
33
+
34
+ declare global {
35
+ interface Window {
36
+ bestUnit: {
37
+ initFundUnit: (params: {
38
+ token: string;
39
+ merchant_id: string;
40
+ biz_type: string;
41
+ user_id: string;
42
+ fund_balance_id?: string;
43
+ locale?: "zh" | "en";
44
+ theme?: Theme;
45
+ env: Env;
46
+ }) => void;
47
+ };
48
+ }
49
+
50
+ namespace JSX {
51
+ interface IntrinsicElements {
52
+ "best-recharge": {
53
+ theme?: any;
54
+ merchant_id?: string;
55
+ biz_type?: string;
56
+ token?: string;
57
+ [key: string]: any;
58
+ };
59
+ "best-statistical-balance": any;
60
+ }
61
+ }
62
+ }
63
+ export {};
64
+ /// <reference path="./preact-custom-element.d.ts" />
@@ -0,0 +1,17 @@
1
+ export enum Locale {
2
+ ZH = "zh",
3
+ EN = "en",
4
+ }
5
+
6
+ export enum Theme {
7
+ WHITE = "white",
8
+ DARK = "dark",
9
+ }
10
+
11
+ export enum Env {
12
+ DEV = "dev",
13
+ DEVELOPMENT = "development",
14
+ TEST = "test",
15
+ PROD = "prod",
16
+ PRODUCTION = "production",
17
+ }
@@ -0,0 +1 @@
1
+ declare module 'preact-custom-element'
@@ -0,0 +1,48 @@
1
+ import { getAllDicts } from "../../api";
2
+ import { Locale, Theme, type Env } from "../../types";
3
+
4
+ export function initFundUnit(params: {
5
+ token: string;
6
+ merchant_id?: string;
7
+ biz_type?: string;
8
+ fund_balance_id?: string;
9
+ user_id: string;
10
+ theme?: Theme;
11
+ locale?: Locale;
12
+ env: Env;
13
+ }) {
14
+ const {
15
+ merchant_id,
16
+ biz_type,
17
+ fund_balance_id,
18
+ user_id,
19
+ theme = Theme.WHITE,
20
+ locale = Locale.ZH,
21
+ env,
22
+ } = params;
23
+ const token = "Bearer " + params.token;
24
+ sessionStorage.setItem(
25
+ "fund_unit_params",
26
+ JSON.stringify({
27
+ merchantId: merchant_id,
28
+ bizType: biz_type,
29
+ fundBalanceId: fund_balance_id,
30
+ userId: user_id,
31
+ token,
32
+ theme,
33
+ locale,
34
+ env,
35
+ })
36
+ );
37
+ getAllDicts();
38
+ return {
39
+ token,
40
+ merchantId: merchant_id,
41
+ bizType: biz_type,
42
+ fundBalanceId: fund_balance_id,
43
+ userId: user_id,
44
+ theme,
45
+ locale,
46
+ env,
47
+ };
48
+ }
@@ -0,0 +1,8 @@
1
+ export function npmTest() {
2
+ console.log("npm package test!!!");
3
+ }
4
+
5
+ export function printCurrentTime() {
6
+ const now = new Date();
7
+ console.log("Current time:", now.toISOString());
8
+ }
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,31 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "useDefineForClassFields": true,
6
+ "module": "ESNext",
7
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
8
+ "skipLibCheck": true,
9
+ "paths": {
10
+ "react": ["./node_modules/preact/compat/"],
11
+ "react-dom": ["./node_modules/preact/compat/"]
12
+ },
13
+
14
+ /* Bundler mode */
15
+ "moduleResolution": "bundler",
16
+ "allowImportingTsExtensions": true,
17
+ "verbatimModuleSyntax": true,
18
+ "moduleDetection": "force",
19
+ "noEmit": true,
20
+ "jsx": "react-jsx",
21
+ "jsxImportSource": "preact",
22
+
23
+ /* Linting */
24
+ "strict": true,
25
+ "noUnusedLocals": true,
26
+ "noUnusedParameters": true,
27
+ "noFallthroughCasesInSwitch": true,
28
+ "noUncheckedSideEffectImports": true
29
+ },
30
+ "include": ["src"]
31
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "declaration": true,
4
+ "declarationDir": "dist",
5
+ "declarationMap": false,
6
+ },
7
+ "files": [],
8
+ "references": [
9
+ { "path": "./tsconfig.app.json" },
10
+ { "path": "./tsconfig.node.json" }
11
+ ],
12
+ "editor.codeActionsOnSave": {
13
+ "source.fixAll.eslint": true
14
+ }
15
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "verbatimModuleSyntax": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+
16
+ /* Linting */
17
+ "strict": true,
18
+ "noUnusedLocals": true,
19
+ "noUnusedParameters": true,
20
+ "noFallthroughCasesInSwitch": true,
21
+ "noUncheckedSideEffectImports": true
22
+ },
23
+ "include": ["vite.config.ts"]
24
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from "vite";
2
+ import preact from "@preact/preset-vite";
3
+ import { viteProxy } from "./src/api/proxy";
4
+
5
+ // https://vite.dev/config/
6
+ export default defineConfig({
7
+ plugins: [preact()],
8
+ server: {
9
+ proxy: viteProxy,
10
+ },
11
+ build: {
12
+ outDir: "dist", //自定义构建输出目录target:'es2020'
13
+ lib: {
14
+ entry: "src/main.ts", //入口文件路径
15
+ formats: ["es", "cjs"],
16
+ },
17
+ },
18
+ });
@@ -1,24 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <title>Best Unit SDK Example</title>
6
- <style>
7
- body { background: #f6f8fa; }
8
- #best-unit-root { margin: 40px auto; max-width: 600px; min-height: 400px; background: #fff; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }
9
- </style>
10
- </head>
11
- <body>
12
- <div id="best-unit-root"></div>
13
- <script type="module">
14
- import { initBestUnit } from '../dist/best-unit.es.js';
15
- // 初始化 SDK
16
- initBestUnit({
17
- token: 'your-user-token',
18
- userId: 'your-user-id',
19
- theme: 'dark',
20
- container: '#best-unit-root'
21
- });
22
- </script>
23
- </body>
24
- </html>
package/public/vite.svg DELETED
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/src/App.jsx DELETED
@@ -1,6 +0,0 @@
1
-
2
- import Home from './views/Home.jsx';
3
-
4
- export default function App() {
5
- return <Home />;
6
- }
@@ -1,49 +0,0 @@
1
- import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
2
-
3
- // 创建 axios 实例
4
- const instance: AxiosInstance = axios.create({
5
- baseURL: '/api',
6
- timeout: 10000,
7
- });
8
-
9
- // 请求拦截器,自动加上 authorization
10
- instance.interceptors.request.use(
11
- (config) => {
12
- // 允许外部传入 headers.authorization
13
- if (config.headers && config.headers['authorization']) {
14
- config.headers['Authorization'] = config.headers['authorization'];
15
- delete config.headers['authorization'];
16
- }
17
- return config;
18
- },
19
- (error) => Promise.reject(error)
20
- );
21
-
22
- // 响应拦截器,统一处理 code=0 的返回
23
- instance.interceptors.response.use(
24
- (response: AxiosResponse) => {
25
- if (response.data && response.data.code === 0) {
26
- return response.data;
27
- }
28
- // 其他情况抛出错误
29
- return Promise.reject(response.data || response);
30
- },
31
- (error) => Promise.reject(error)
32
- );
33
-
34
- // 通用请求方法
35
- export function request<T = any>(
36
- url: string,
37
- method: 'get' | 'post' | 'put' | 'delete' | 'patch' = 'get',
38
- data?: any,
39
- config: AxiosRequestConfig = {}
40
- ): Promise<T> {
41
- return instance({
42
- url,
43
- method,
44
- ...(method === 'get' ? { params: data } : { data }),
45
- ...config,
46
- });
47
- }
48
-
49
- export default instance;
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="32" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path fill="#F7DF1E" d="M0 0h256v256H0V0Z"></path><path d="m67.312 213.932l19.59-11.856c3.78 6.701 7.218 12.371 15.465 12.371c7.905 0 12.89-3.092 12.89-15.12v-81.798h24.057v82.138c0 24.917-14.606 36.259-35.916 36.259c-19.245 0-30.416-9.967-36.087-21.996m85.07-2.576l19.588-11.341c5.157 8.421 11.859 14.607 23.715 14.607c9.969 0 16.325-4.984 16.325-11.858c0-8.248-6.53-11.17-17.528-15.98l-6.013-2.58c-17.357-7.387-28.87-16.667-28.87-36.257c0-18.044 13.747-31.792 35.228-31.792c15.294 0 26.292 5.328 34.196 19.247l-18.732 12.03c-4.125-7.389-8.591-10.31-15.465-10.31c-7.046 0-11.514 4.468-11.514 10.31c0 7.217 4.468 10.14 14.778 14.608l6.014 2.577c20.45 8.765 31.963 17.7 31.963 37.804c0 21.654-17.012 33.51-39.867 33.51c-22.339 0-36.774-10.654-43.819-24.574"></path></svg>
package/src/main.jsx DELETED
@@ -1,4 +0,0 @@
1
- import { render } from 'preact';
2
- import App from './App.jsx';
3
-
4
- render(<App />, document.getElementById('app'));
package/src/sdk/index.ts DELETED
@@ -1,33 +0,0 @@
1
- import { render } from 'preact';
2
- import Home from '../views/Home.jsx';
3
-
4
- export interface BestUnitOptions {
5
- token: string;
6
- userId: string;
7
- theme?: 'light' | 'dark' | string;
8
- container?: HTMLElement | string;
9
- }
10
-
11
- declare global {
12
- interface Window {
13
- BEST_UNIT_TOKEN?: string;
14
- BEST_UNIT_USERID?: string;
15
- BEST_UNIT_THEME?: string;
16
- }
17
- }
18
-
19
- export function initBestUnit(options: BestUnitOptions) {
20
- window.BEST_UNIT_TOKEN = options.token;
21
- window.BEST_UNIT_USERID = options.userId;
22
- window.BEST_UNIT_THEME = options.theme || 'light';
23
-
24
- let container: HTMLElement | null;
25
- if (typeof options.container === 'string') {
26
- container = document.querySelector(options.container);
27
- } else if (options.container instanceof HTMLElement) {
28
- container = options.container;
29
- } else {
30
- container = document.body;
31
- }
32
- render(Home, container!);
33
- }
package/src/style.css DELETED
@@ -1,96 +0,0 @@
1
- :root {
2
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
3
- line-height: 1.5;
4
- font-weight: 400;
5
-
6
- color-scheme: light dark;
7
- color: rgba(255, 255, 255, 0.87);
8
- background-color: #242424;
9
-
10
- font-synthesis: none;
11
- text-rendering: optimizeLegibility;
12
- -webkit-font-smoothing: antialiased;
13
- -moz-osx-font-smoothing: grayscale;
14
- }
15
-
16
- a {
17
- font-weight: 500;
18
- color: #646cff;
19
- text-decoration: inherit;
20
- }
21
- a:hover {
22
- color: #535bf2;
23
- }
24
-
25
- body {
26
- margin: 0;
27
- display: flex;
28
- place-items: center;
29
- min-width: 320px;
30
- min-height: 100vh;
31
- }
32
-
33
- h1 {
34
- font-size: 3.2em;
35
- line-height: 1.1;
36
- }
37
-
38
- #app {
39
- max-width: 1280px;
40
- margin: 0 auto;
41
- padding: 2rem;
42
- text-align: center;
43
- }
44
-
45
- .logo {
46
- height: 6em;
47
- padding: 1.5em;
48
- will-change: filter;
49
- transition: filter 300ms;
50
- }
51
- .logo:hover {
52
- filter: drop-shadow(0 0 2em #646cffaa);
53
- }
54
- .logo.vanilla:hover {
55
- filter: drop-shadow(0 0 2em #f7df1eaa);
56
- }
57
-
58
- .card {
59
- padding: 2em;
60
- }
61
-
62
- .read-the-docs {
63
- color: #888;
64
- }
65
-
66
- button {
67
- border-radius: 8px;
68
- border: 1px solid transparent;
69
- padding: 0.6em 1.2em;
70
- font-size: 1em;
71
- font-weight: 500;
72
- font-family: inherit;
73
- background-color: #1a1a1a;
74
- cursor: pointer;
75
- transition: border-color 0.25s;
76
- }
77
- button:hover {
78
- border-color: #646cff;
79
- }
80
- button:focus,
81
- button:focus-visible {
82
- outline: 4px auto -webkit-focus-ring-color;
83
- }
84
-
85
- @media (prefers-color-scheme: light) {
86
- :root {
87
- color: #213547;
88
- background-color: #ffffff;
89
- }
90
- a:hover {
91
- color: #747bff;
92
- }
93
- button {
94
- background-color: #f9f9f9;
95
- }
96
- }