common_component_library_vue 0.1.1 → 0.1.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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Common Component Library Vue 3 + TypeScript
2
+ * Common Component Library 鈥?Vue 3 + TypeScript
3
3
  * Design language: Stripe-inspired, defined in /DESIGN.md
4
4
  *
5
5
  * Usage:
@@ -24,11 +24,25 @@ import CcModal from './components/Modal/CcModal.vue';
24
24
  import CcTooltip from './components/Tooltip/CcTooltip.vue';
25
25
  import CcSpinner from './components/Spinner/CcSpinner.vue';
26
26
  import CcDivider from './components/Divider/CcDivider.vue';
27
- export { CcButton, CcInput, CcTextarea, CcSelect, CcSwitch, CcCheckbox, CcRadio, CcCard, CcTag, CcBadge, CcAlert, CcModal, CcTooltip, CcSpinner, CcDivider, };
27
+ import CcTable from './components/Table/CcTable.vue';
28
+ import CcBarChart from './components/Chart/CcBarChart.vue';
29
+ import CcPieChart from './components/Chart/CcPieChart.vue';
30
+ import CcLineChart from './components/Chart/CcLineChart.vue';
31
+ import CcThemeProvider from './components/ThemeProvider/CcThemeProvider.vue';
32
+ export { CcButton, CcInput, CcTextarea, CcSelect, CcSwitch, CcCheckbox, CcRadio, CcCard, CcTag, CcBadge, CcAlert, CcModal, CcTooltip, CcSpinner, CcDivider, CcTable, CcBarChart, CcPieChart, CcLineChart, CcThemeProvider, };
28
33
  export type { CcSelectOption } from './components/Select/CcSelect.vue';
29
- /** Design tokens (CSS custom properties) import once in your app entry */
34
+ export type { CcTableColumn, CcTableDensity } from './components/Table/CcTable.vue';
35
+ export type { CcChartSeries, CcPieDatum } from './components/Chart/common';
36
+ export type { CcTheme } from './theme';
37
+ export { CC_THEMES, CC_THEME_LABELS, setTheme, getTheme, resetTheme } from './theme';
38
+ /** Design tokens (CSS custom properties) 鈥?import once in your app entry */
30
39
  import './styles/tokens.css';
31
40
  import './styles/base.css';
41
+ /** Multi-theme: Linear / Vercel / Notion / Raycast (default Stripe is in tokens.css) */
42
+ import './styles/themes/linear.css';
43
+ import './styles/themes/vercel.css';
44
+ import './styles/themes/notion.css';
45
+ import './styles/themes/raycast.css';
32
46
  /** Optional plugin for `app.use()` registration */
33
47
  export declare function install(app: App): void;
34
48
  declare const _default: {
@@ -720,6 +734,236 @@ declare const _default: {
720
734
  default?: (props: {}) => any;
721
735
  };
722
736
  });
737
+ CcTable: {
738
+ new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<Readonly<{
739
+ columns: import("./index.ts").CcTableColumn[];
740
+ data: Array<Record<string, unknown>>;
741
+ rowKey?: string;
742
+ tableKey?: string;
743
+ showSelection?: boolean;
744
+ pageSizeOptions?: number[];
745
+ defaultDensity?: import("./index.ts").CcTableDensity;
746
+ emptyText?: string;
747
+ maxHeight?: string;
748
+ } & {
749
+ selectedKeys?: string[];
750
+ }> & Readonly<{
751
+ "onSelection-change"?: ((keys: string[], rows: Record<string, unknown>[]) => any) | undefined;
752
+ "onUpdate:selectedKeys"?: ((value: string[]) => any) | undefined;
753
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
754
+ "update:selectedKeys": (value: string[]) => any;
755
+ } & {
756
+ "selection-change": (keys: string[], rows: Record<string, unknown>[]) => any;
757
+ }, import("vue").PublicProps, {
758
+ rowKey: string;
759
+ tableKey: string;
760
+ showSelection: boolean;
761
+ pageSizeOptions: number[];
762
+ defaultDensity: import("./index.ts").CcTableDensity;
763
+ emptyText: string;
764
+ maxHeight: string;
765
+ }, false, {}, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, {}, any, import("vue").ComponentProvideOptions, {
766
+ P: {};
767
+ B: {};
768
+ D: {};
769
+ C: {};
770
+ M: {};
771
+ Defaults: {};
772
+ }, Readonly<{
773
+ columns: import("./index.ts").CcTableColumn[];
774
+ data: Array<Record<string, unknown>>;
775
+ rowKey?: string;
776
+ tableKey?: string;
777
+ showSelection?: boolean;
778
+ pageSizeOptions?: number[];
779
+ defaultDensity?: import("./index.ts").CcTableDensity;
780
+ emptyText?: string;
781
+ maxHeight?: string;
782
+ } & {
783
+ selectedKeys?: string[];
784
+ }> & Readonly<{
785
+ "onSelection-change"?: ((keys: string[], rows: Record<string, unknown>[]) => any) | undefined;
786
+ "onUpdate:selectedKeys"?: ((value: string[]) => any) | undefined;
787
+ }>, {}, {}, {}, {}, {
788
+ rowKey: string;
789
+ tableKey: string;
790
+ showSelection: boolean;
791
+ pageSizeOptions: number[];
792
+ defaultDensity: import("./index.ts").CcTableDensity;
793
+ emptyText: string;
794
+ maxHeight: string;
795
+ }>;
796
+ __isFragment?: never;
797
+ __isTeleport?: never;
798
+ __isSuspense?: never;
799
+ } & import("vue").ComponentOptionsBase<Readonly<{
800
+ columns: import("./index.ts").CcTableColumn[];
801
+ data: Array<Record<string, unknown>>;
802
+ rowKey?: string;
803
+ tableKey?: string;
804
+ showSelection?: boolean;
805
+ pageSizeOptions?: number[];
806
+ defaultDensity?: import("./index.ts").CcTableDensity;
807
+ emptyText?: string;
808
+ maxHeight?: string;
809
+ } & {
810
+ selectedKeys?: string[];
811
+ }> & Readonly<{
812
+ "onSelection-change"?: ((keys: string[], rows: Record<string, unknown>[]) => any) | undefined;
813
+ "onUpdate:selectedKeys"?: ((value: string[]) => any) | undefined;
814
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
815
+ "update:selectedKeys": (value: string[]) => any;
816
+ } & {
817
+ "selection-change": (keys: string[], rows: Record<string, unknown>[]) => any;
818
+ }, string, {
819
+ rowKey: string;
820
+ tableKey: string;
821
+ showSelection: boolean;
822
+ pageSizeOptions: number[];
823
+ defaultDensity: import("./index.ts").CcTableDensity;
824
+ emptyText: string;
825
+ maxHeight: string;
826
+ }, {}, string, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & (new () => {
827
+ $slots: {
828
+ [x: string]: ((props: {
829
+ row: Record<string, unknown>;
830
+ value: unknown;
831
+ }) => any) | undefined;
832
+ };
833
+ });
834
+ CcBarChart: import("vue").DefineComponent<{
835
+ categories: string[];
836
+ series: import("./index.ts").CcChartSeries[];
837
+ height?: number;
838
+ horizontal?: boolean;
839
+ stacked?: boolean;
840
+ rounded?: boolean;
841
+ showLegend?: boolean;
842
+ colors?: string[];
843
+ dark?: boolean;
844
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
845
+ categories: string[];
846
+ series: import("./index.ts").CcChartSeries[];
847
+ height?: number;
848
+ horizontal?: boolean;
849
+ stacked?: boolean;
850
+ rounded?: boolean;
851
+ showLegend?: boolean;
852
+ colors?: string[];
853
+ dark?: boolean;
854
+ }> & Readonly<{}>, {
855
+ height: number;
856
+ dark: boolean;
857
+ horizontal: boolean;
858
+ stacked: boolean;
859
+ rounded: boolean;
860
+ showLegend: boolean;
861
+ colors: string[];
862
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
863
+ CcPieChart: import("vue").DefineComponent<{
864
+ data: import("./index.ts").CcPieDatum[];
865
+ height?: number;
866
+ donut?: boolean;
867
+ rose?: boolean;
868
+ showLegend?: boolean;
869
+ showLabels?: boolean;
870
+ colors?: string[];
871
+ dark?: boolean;
872
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
873
+ data: import("./index.ts").CcPieDatum[];
874
+ height?: number;
875
+ donut?: boolean;
876
+ rose?: boolean;
877
+ showLegend?: boolean;
878
+ showLabels?: boolean;
879
+ colors?: string[];
880
+ dark?: boolean;
881
+ }> & Readonly<{}>, {
882
+ height: number;
883
+ dark: boolean;
884
+ showLegend: boolean;
885
+ colors: string[];
886
+ donut: boolean;
887
+ rose: boolean;
888
+ showLabels: boolean;
889
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
890
+ CcLineChart: import("vue").DefineComponent<{
891
+ categories: string[];
892
+ series: import("./index.ts").CcChartSeries[];
893
+ height?: number;
894
+ smooth?: boolean;
895
+ area?: boolean;
896
+ showDots?: boolean;
897
+ showLegend?: boolean;
898
+ showGrid?: boolean;
899
+ colors?: string[];
900
+ dark?: boolean;
901
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
902
+ categories: string[];
903
+ series: import("./index.ts").CcChartSeries[];
904
+ height?: number;
905
+ smooth?: boolean;
906
+ area?: boolean;
907
+ showDots?: boolean;
908
+ showLegend?: boolean;
909
+ showGrid?: boolean;
910
+ colors?: string[];
911
+ dark?: boolean;
912
+ }> & Readonly<{}>, {
913
+ area: boolean;
914
+ height: number;
915
+ dark: boolean;
916
+ showLegend: boolean;
917
+ colors: string[];
918
+ smooth: boolean;
919
+ showDots: boolean;
920
+ showGrid: boolean;
921
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
922
+ CcThemeProvider: {
923
+ new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<Readonly<{
924
+ theme?: import("./theme").CcTheme;
925
+ persist?: boolean;
926
+ }> & Readonly<{
927
+ onChange?: ((theme: import("./theme").CcTheme) => any) | undefined;
928
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
929
+ change: (theme: import("./theme").CcTheme) => any;
930
+ }, import("vue").PublicProps, {
931
+ theme: import("./theme").CcTheme;
932
+ persist: boolean;
933
+ }, false, {}, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, {}, any, import("vue").ComponentProvideOptions, {
934
+ P: {};
935
+ B: {};
936
+ D: {};
937
+ C: {};
938
+ M: {};
939
+ Defaults: {};
940
+ }, Readonly<{
941
+ theme?: import("./theme").CcTheme;
942
+ persist?: boolean;
943
+ }> & Readonly<{
944
+ onChange?: ((theme: import("./theme").CcTheme) => any) | undefined;
945
+ }>, {}, {}, {}, {}, {
946
+ theme: import("./theme").CcTheme;
947
+ persist: boolean;
948
+ }>;
949
+ __isFragment?: never;
950
+ __isTeleport?: never;
951
+ __isSuspense?: never;
952
+ } & import("vue").ComponentOptionsBase<Readonly<{
953
+ theme?: import("./theme").CcTheme;
954
+ persist?: boolean;
955
+ }> & Readonly<{
956
+ onChange?: ((theme: import("./theme").CcTheme) => any) | undefined;
957
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
958
+ change: (theme: import("./theme").CcTheme) => any;
959
+ }, string, {
960
+ theme: import("./theme").CcTheme;
961
+ persist: boolean;
962
+ }, {}, string, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & (new () => {
963
+ $slots: {
964
+ default?: (props: {}) => any;
965
+ };
966
+ });
723
967
  install: typeof install;
724
968
  };
725
969
  export default _default;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 多主题系统 — 组件库公开的主题切换 API。
3
+ *
4
+ * 用法(三种方式等效):
5
+ * 1. 声明式:<CcThemeProvider theme="linear"> <App/> </CcThemeProvider>
6
+ * 2. 命令式:import { setTheme } from 'common_component_library_vue'; setTheme('linear')
7
+ * 3. HTML: <html data-cc-theme="linear">
8
+ *
9
+ * 主题实际生效于 CSS 选择器 [data-cc-theme="xxx"],作用于 <html> 根节点,
10
+ * 覆盖 :root 中的默认(Stripe)令牌,切换即时生效、无需刷新。
11
+ */
12
+ /** 组件库支持的设计风格。stripe 为默认风格(无需任何主题文件)。 */
13
+ export type CcTheme = 'stripe' | 'linear' | 'vercel' | 'notion' | 'raycast';
14
+ /** 全部可用主题。 */
15
+ export declare const CC_THEMES: readonly CcTheme[];
16
+ /** 主题中文标签(演示与选择器展示用),value 保持英文主题名不变。 */
17
+ export declare const CC_THEME_LABELS: Record<CcTheme, string>;
18
+ /** <html> 上的主题属性名。 */
19
+ export declare const CC_THEME_ATTR = "data-cc-theme";
20
+ /** inject/provide 当前主题的注入键(可读取响应式主题)。 */
21
+ export declare const CC_THEME_KEY: unique symbol;
22
+ /** 校验是否为合法的内置主题名。 */
23
+ export declare function isCcTheme(value: unknown): value is CcTheme;
24
+ /**
25
+ * 切换组件库主题。
26
+ * @param theme 目标主题名;传入 'stripe' 或移除主题时恢复默认。
27
+ */
28
+ export declare function setTheme(theme: CcTheme): void;
29
+ /** 读取当前生效的主题名。 */
30
+ export declare function getTheme(): CcTheme;
31
+ /** 恢复默认主题(Stripe)。 */
32
+ export declare function resetTheme(): void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "common_component_library_vue",
3
- "version": "0.1.1",
4
- "description": "Vue 3 + TypeScript + Vite 通用组件库,视觉规范由 DESIGN.md(Stripe 风格)定义,包含 15 个可复用组件",
3
+ "version": "0.1.3",
4
+ "description": "Vue 3 + TypeScript + Vite 通用组件库,视觉规范由 DESIGN.md(Stripe 风格)定义,包含表格、图表与 15 个基础组件",
5
5
  "type": "module",
6
6
  "main": "./dist-lib/common-component-library-vue.umd.js",
7
7
  "module": "./dist-lib/common-component-library-vue.mjs",
@@ -13,6 +13,10 @@
13
13
  "require": "./dist-lib/common-component-library-vue.umd.js"
14
14
  },
15
15
  "./style.css": "./dist-lib/common-component-library-vue.css",
16
+ "./themes/linear.css": "./src/styles/themes/linear.css",
17
+ "./themes/vercel.css": "./src/styles/themes/vercel.css",
18
+ "./themes/notion.css": "./src/styles/themes/notion.css",
19
+ "./themes/raycast.css": "./src/styles/themes/raycast.css",
16
20
  "./dist-lib/*": "./dist-lib/*",
17
21
  "./styles/tokens.css": "./src/styles/tokens.css",
18
22
  "./styles/base.css": "./src/styles/base.css",
@@ -58,16 +62,18 @@
58
62
  "prepublishOnly": "npm run build:lib"
59
63
  },
60
64
  "dependencies": {
61
- "vue": "^3.5.41"
65
+ "vue": "^3.4.0"
62
66
  },
63
67
  "peerDependencies": {
64
- "vue": "^3.4.0"
68
+ "vue": "^3.4.0",
69
+ "echarts": "^5.5.0 || ^6.0.0"
65
70
  },
66
71
  "devDependencies": {
67
72
  "@fontsource/inter": "^5.3.0",
68
73
  "@types/node": "^24.13.3",
69
74
  "@vitejs/plugin-vue": "^6.0.8",
70
75
  "@vue/tsconfig": "^0.9.1",
76
+ "echarts": "^6.1.0",
71
77
  "typescript": "~6.0.2",
72
78
  "vite": "^8.2.2",
73
79
  "vue-tsc": "^3.3.11"
@@ -0,0 +1,47 @@
1
+ /* ==========================================================================
2
+ THEME · Linear — deep-dark, lavender accent
3
+ Source: awesome-design-md/linear.app/DESIGN.md
4
+ Apply by setting <html data-cc-theme="linear"> (or CcThemeProvider / setTheme).
5
+ ========================================================================== */
6
+
7
+ [data-cc-theme='linear'] {
8
+ /* Brand & Accent */
9
+ --cc-primary: #5e6ad2;
10
+ --cc-primary-deep: #4f5ab8;
11
+ --cc-primary-press: #3d4798;
12
+ --cc-primary-soft: #828fff;
13
+ --cc-primary-subdued: #2a2e4a;
14
+ --cc-brand-dark-900: #0b0b0c;
15
+ --cc-ruby: #f25e5e;
16
+ --cc-magenta: #f5a3c7;
17
+ --cc-lemon: #d8b4fe;
18
+
19
+ /* Surface */
20
+ --cc-canvas: #010102;
21
+ --cc-canvas-soft: #0f1011;
22
+ --cc-canvas-cream: #141516;
23
+ --cc-hairline: #2a2d33;
24
+ --cc-hairline-input: #3a3e45;
25
+
26
+ /* Text */
27
+ --cc-ink: #f7f8f8;
28
+ --cc-ink-secondary: #d0d6e0;
29
+ --cc-ink-mute: #8a8f98;
30
+ --cc-ink-mute-2: #62666d;
31
+ --cc-on-primary: #ffffff;
32
+
33
+ /* Semantic */
34
+ --cc-success: #3ddc97;
35
+ --cc-success-soft: #14322a;
36
+ --cc-warning: #d8b4fe;
37
+ --cc-warning-soft: #2c2440;
38
+ --cc-error: #f25e5e;
39
+ --cc-error-soft: #3a1d1d;
40
+ --cc-info: #5e6ad2;
41
+
42
+ /* Shadows */
43
+ --cc-shadow-blue: #000000;
44
+ --cc-shadow-level-1: rgba(0, 0, 0, 0.5) 0 1px 3px;
45
+ --cc-shadow-level-2: rgba(0, 0, 0, 0.5) 0 8px 24px, rgba(0, 0, 0, 0.3) 0 2px 6px;
46
+ --cc-focus-ring: 0 0 0 3px rgba(94, 106, 210, 0.35);
47
+ }
@@ -0,0 +1,47 @@
1
+ /* ==========================================================================
2
+ THEME · Notion — paper light, indigo CTA
3
+ Source: awesome-design-md/notion/DESIGN.md
4
+ Apply by setting <html data-cc-theme="notion"> (or CcThemeProvider / setTheme).
5
+ ========================================================================== */
6
+
7
+ [data-cc-theme='notion'] {
8
+ /* Brand & Accent */
9
+ --cc-primary: #5645d4;
10
+ --cc-primary-deep: #4534b3;
11
+ --cc-primary-press: #3a2a99;
12
+ --cc-primary-soft: #6f5fe8;
13
+ --cc-primary-subdued: #e9e7fb;
14
+ --cc-brand-dark-900: #0a1530;
15
+ --cc-ruby: #eb5757;
16
+ --cc-magenta: #eb5757;
17
+ --cc-lemon: #b76e00;
18
+
19
+ /* Surface */
20
+ --cc-canvas: #ffffff;
21
+ --cc-canvas-soft: #f7f7f5;
22
+ --cc-canvas-cream: #f1f1ef;
23
+ --cc-hairline: #e3e3e0;
24
+ --cc-hairline-input: #d0d0cc;
25
+
26
+ /* Text */
27
+ --cc-ink: #37352f;
28
+ --cc-ink-secondary: #4f4d47;
29
+ --cc-ink-mute: #9b9a97;
30
+ --cc-ink-mute-2: #787774;
31
+ --cc-on-primary: #ffffff;
32
+
33
+ /* Semantic */
34
+ --cc-success: #0a9f6e;
35
+ --cc-success-soft: #e4f5ee;
36
+ --cc-warning: #b76e00;
37
+ --cc-warning-soft: #faf1e2;
38
+ --cc-error: #eb5757;
39
+ --cc-error-soft: #fdeaea;
40
+ --cc-info: #0075de;
41
+
42
+ /* Shadows */
43
+ --cc-shadow-blue: #0a1530;
44
+ --cc-shadow-level-1: rgba(10, 21, 48, 0.08) 0 1px 3px;
45
+ --cc-shadow-level-2: rgba(10, 21, 48, 0.08) 0 8px 24px, rgba(10, 21, 48, 0.04) 0 2px 6px;
46
+ --cc-focus-ring: 0 0 0 3px rgba(86, 69, 212, 0.22);
47
+ }
@@ -0,0 +1,47 @@
1
+ /* ==========================================================================
2
+ THEME · Raycast — dark shell, white CTA
3
+ Source: awesome-design-md/raycast/DESIGN.md
4
+ Apply by setting <html data-cc-theme="raycast"> (or CcThemeProvider / setTheme).
5
+ ========================================================================== */
6
+
7
+ [data-cc-theme='raycast'] {
8
+ /* Brand & Accent */
9
+ --cc-primary: #ffffff;
10
+ --cc-primary-deep: #e8e8e8;
11
+ --cc-primary-press: #d6d6d6;
12
+ --cc-primary-soft: #ffffff;
13
+ --cc-primary-subdued: #3a3a3c;
14
+ --cc-brand-dark-900: #111113;
15
+ --cc-ruby: #ff6363;
16
+ --cc-magenta: #ff8d70;
17
+ --cc-lemon: #f5c451;
18
+
19
+ /* Surface */
20
+ --cc-canvas: #151516;
21
+ --cc-canvas-soft: #1c1c1e;
22
+ --cc-canvas-cream: #222224;
23
+ --cc-hairline: #303033;
24
+ --cc-hairline-input: #3f3f42;
25
+
26
+ /* Text */
27
+ --cc-ink: #f4f4f6;
28
+ --cc-ink-secondary: #cdcdcd;
29
+ --cc-ink-mute: #9c9c9d;
30
+ --cc-ink-mute-2: #6a6b6c;
31
+ --cc-on-primary: #000000;
32
+
33
+ /* Semantic */
34
+ --cc-success: #3ddc97;
35
+ --cc-success-soft: #17352b;
36
+ --cc-warning: #f5c451;
37
+ --cc-warning-soft: #3a3118;
38
+ --cc-error: #ff6363;
39
+ --cc-error-soft: #3c1d1d;
40
+ --cc-info: #ffffff;
41
+
42
+ /* Shadows */
43
+ --cc-shadow-blue: #000000;
44
+ --cc-shadow-level-1: rgba(0, 0, 0, 0.6) 0 1px 3px;
45
+ --cc-shadow-level-2: rgba(0, 0, 0, 0.6) 0 8px 24px, rgba(0, 0, 0, 0.4) 0 2px 6px;
46
+ --cc-focus-ring: 0 0 0 3px rgba(255, 99, 99, 0.35);
47
+ }
@@ -0,0 +1,47 @@
1
+ /* ==========================================================================
2
+ THEME · Vercel — monochrome minimal, near-black CTA
3
+ Source: awesome-design-md/vercel/DESIGN.md
4
+ Apply by setting <html data-cc-theme="vercel"> (or CcThemeProvider / setTheme).
5
+ ========================================================================== */
6
+
7
+ [data-cc-theme='vercel'] {
8
+ /* Brand & Accent */
9
+ --cc-primary: #171717;
10
+ --cc-primary-deep: #000000;
11
+ --cc-primary-press: #000000;
12
+ --cc-primary-soft: #444444;
13
+ --cc-primary-subdued: #eaeaea;
14
+ --cc-brand-dark-900: #0a0a0a;
15
+ --cc-ruby: #ee0000;
16
+ --cc-magenta: #f81ce5;
17
+ --cc-lemon: #f5a623;
18
+
19
+ /* Surface */
20
+ --cc-canvas: #ffffff;
21
+ --cc-canvas-soft: #fafafa;
22
+ --cc-canvas-cream: #f5f5f5;
23
+ --cc-hairline: #eaeaea;
24
+ --cc-hairline-input: #d4d4d4;
25
+
26
+ /* Text */
27
+ --cc-ink: #171717;
28
+ --cc-ink-secondary: #4d4d4d;
29
+ --cc-ink-mute: #888888;
30
+ --cc-ink-mute-2: #666666;
31
+ --cc-on-primary: #ffffff;
32
+
33
+ /* Semantic */
34
+ --cc-success: #0070f3;
35
+ --cc-success-soft: #e8f3ff;
36
+ --cc-warning: #f5a623;
37
+ --cc-warning-soft: #fdf3e3;
38
+ --cc-error: #ee0000;
39
+ --cc-error-soft: #fbeaea;
40
+ --cc-info: #0070f3;
41
+
42
+ /* Shadows */
43
+ --cc-shadow-blue: #000000;
44
+ --cc-shadow-level-1: rgba(0, 0, 0, 0.06) 0 1px 3px;
45
+ --cc-shadow-level-2: rgba(0, 0, 0, 0.06) 0 8px 24px, rgba(0, 0, 0, 0.03) 0 2px 6px;
46
+ --cc-focus-ring: 0 0 0 3px rgba(0, 112, 243, 0.25);
47
+ }