my-npm-libb 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 (46) hide show
  1. package/dist/cjs/components/Button/Button.js +78 -0
  2. package/dist/cjs/components/Button/Button.js.map +1 -0
  3. package/dist/cjs/components/Input/Input.js +72 -0
  4. package/dist/cjs/components/Input/Input.js.map +1 -0
  5. package/dist/cjs/index.js +36 -0
  6. package/dist/cjs/index.js.map +1 -0
  7. package/dist/cjs/theme/ThemeProvider.js +34 -0
  8. package/dist/cjs/theme/ThemeProvider.js.map +1 -0
  9. package/dist/cjs/theme/theme.js +86 -0
  10. package/dist/cjs/theme/theme.js.map +1 -0
  11. package/dist/cjs/tokens/borders.js +53 -0
  12. package/dist/cjs/tokens/borders.js.map +1 -0
  13. package/dist/cjs/tokens/breakpoints.js +25 -0
  14. package/dist/cjs/tokens/breakpoints.js.map +1 -0
  15. package/dist/cjs/tokens/colors.js +97 -0
  16. package/dist/cjs/tokens/colors.js.map +1 -0
  17. package/dist/cjs/tokens/shadows.js +23 -0
  18. package/dist/cjs/tokens/shadows.js.map +1 -0
  19. package/dist/cjs/tokens/spacing.js +39 -0
  20. package/dist/cjs/tokens/spacing.js.map +1 -0
  21. package/dist/cjs/tokens/typography.js +82 -0
  22. package/dist/cjs/tokens/typography.js.map +1 -0
  23. package/dist/esm/components/Button/Button.js +76 -0
  24. package/dist/esm/components/Button/Button.js.map +1 -0
  25. package/dist/esm/components/Input/Input.js +70 -0
  26. package/dist/esm/components/Input/Input.js.map +1 -0
  27. package/dist/esm/index.js +11 -0
  28. package/dist/esm/index.js.map +1 -0
  29. package/dist/esm/theme/ThemeProvider.js +32 -0
  30. package/dist/esm/theme/ThemeProvider.js.map +1 -0
  31. package/dist/esm/theme/theme.js +83 -0
  32. package/dist/esm/theme/theme.js.map +1 -0
  33. package/dist/esm/tokens/borders.js +49 -0
  34. package/dist/esm/tokens/borders.js.map +1 -0
  35. package/dist/esm/tokens/breakpoints.js +23 -0
  36. package/dist/esm/tokens/breakpoints.js.map +1 -0
  37. package/dist/esm/tokens/colors.js +92 -0
  38. package/dist/esm/tokens/colors.js.map +1 -0
  39. package/dist/esm/tokens/shadows.js +21 -0
  40. package/dist/esm/tokens/shadows.js.map +1 -0
  41. package/dist/esm/tokens/spacing.js +37 -0
  42. package/dist/esm/tokens/spacing.js.map +1 -0
  43. package/dist/esm/tokens/typography.js +76 -0
  44. package/dist/esm/tokens/typography.js.map +1 -0
  45. package/dist/index.d.ts +459 -0
  46. package/package.json +103 -0
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Typography Tokens
5
+ *
6
+ * Bao gồm: font families, font sizes, font weights, line heights.
7
+ * Font size scale dùng tỉ lệ Major Third (1.25) — phổ biến trong UI design.
8
+ */
9
+ // ============================================
10
+ // Font Families
11
+ // ============================================
12
+ const fontFamilies = {
13
+ /** Font chính cho body text */
14
+ base: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
15
+ /** Font cho code/monospace */
16
+ mono: "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",
17
+ };
18
+ // ============================================
19
+ // Font Sizes
20
+ // ============================================
21
+ const fontSizes = {
22
+ /** 12px — Caption, helper text */
23
+ xs: 12,
24
+ /** 14px — Body small, Ant Design default */
25
+ sm: 14,
26
+ /** 16px — Body */
27
+ md: 16,
28
+ /** 18px — Body large */
29
+ lg: 18,
30
+ /** 20px — Heading 5 */
31
+ xl: 20,
32
+ /** 24px — Heading 4 */
33
+ '2xl': 24,
34
+ /** 30px — Heading 3 */
35
+ '3xl': 30,
36
+ /** 36px — Heading 2 */
37
+ '4xl': 36,
38
+ /** 48px — Heading 1 */
39
+ '5xl': 48,
40
+ };
41
+ // ============================================
42
+ // Font Weights
43
+ // ============================================
44
+ const fontWeights = {
45
+ /** 400 — Normal text */
46
+ regular: 400,
47
+ /** 500 — Medium emphasis */
48
+ medium: 500,
49
+ /** 600 — Semi-bold, subheadings */
50
+ semibold: 600,
51
+ /** 700 — Bold, headings */
52
+ bold: 700,
53
+ };
54
+ // ============================================
55
+ // Line Heights
56
+ // ============================================
57
+ const lineHeights = {
58
+ /** 1 — Không có line height thêm (icons, single-line) */
59
+ none: 1,
60
+ /** 1.375 — Tight, dùng cho headings */
61
+ tight: 1.375,
62
+ /** 1.5 — Normal, dùng cho body text */
63
+ normal: 1.5,
64
+ /** 1.75 — Relaxed, dùng cho body text dài */
65
+ relaxed: 1.75,
66
+ };
67
+ // ============================================
68
+ // Export gộp
69
+ // ============================================
70
+ const typography = {
71
+ fontFamilies,
72
+ fontSizes,
73
+ fontWeights,
74
+ lineHeights,
75
+ };
76
+
77
+ exports.fontFamilies = fontFamilies;
78
+ exports.fontSizes = fontSizes;
79
+ exports.fontWeights = fontWeights;
80
+ exports.lineHeights = lineHeights;
81
+ exports.typography = typography;
82
+ //# sourceMappingURL=typography.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typography.js","sources":["../../../../src/tokens/typography.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;;AAKG;AAEH;AACA;AACA;AAEO,MAAM,YAAY,GAAG;;AAE1B,IAAA,IAAI,EAAE,4FAA4F;;AAElG,IAAA,IAAI,EAAE,0EAA0E;;AAGlF;AACA;AACA;AAEO,MAAM,SAAS,GAAG;;AAEvB,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;AAGX;AACA;AACA;AAEO,MAAM,WAAW,GAAG;;AAEzB,IAAA,OAAO,EAAE,GAAG;;AAEZ,IAAA,MAAM,EAAE,GAAG;;AAEX,IAAA,QAAQ,EAAE,GAAG;;AAEb,IAAA,IAAI,EAAE,GAAG;;AAGX;AACA;AACA;AAEO,MAAM,WAAW,GAAG;;AAEzB,IAAA,IAAI,EAAE,CAAC;;AAEP,IAAA,KAAK,EAAE,KAAK;;AAEZ,IAAA,MAAM,EAAE,GAAG;;AAEX,IAAA,OAAO,EAAE,IAAI;;AAGf;AACA;AACA;AAEO,MAAM,UAAU,GAAG;IACxB,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;;;;;;;;;"}
@@ -0,0 +1,76 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { Button as Button$1 } from 'antd';
4
+ import styled, { css } from 'styled-components';
5
+
6
+ // ============================================
7
+ // Styled Component
8
+ // ============================================
9
+ // Map ButtonSize sang Ant Design size
10
+ const antSizeMap = {
11
+ sm: 'small',
12
+ md: 'middle',
13
+ lg: 'large',
14
+ };
15
+ // Map ButtonVariant sang Ant Design type
16
+ const antTypeMap = {
17
+ primary: { type: 'primary' },
18
+ secondary: { type: 'default' },
19
+ outline: { type: 'default' },
20
+ ghost: { type: 'text' },
21
+ danger: { type: 'primary', danger: true },
22
+ };
23
+ const fullWidthStyle = css `
24
+ width: 100%;
25
+ `;
26
+ const outlineStyle = css `
27
+ &.ant-btn-default {
28
+ border-color: ${({ theme }) => theme.colors.brand.primary[500]};
29
+ color: ${({ theme }) => theme.colors.brand.primary[500]};
30
+
31
+ &:hover:not(:disabled) {
32
+ border-color: ${({ theme }) => theme.colors.brand.primary[400]};
33
+ color: ${({ theme }) => theme.colors.brand.primary[400]};
34
+ }
35
+
36
+ &:active:not(:disabled) {
37
+ border-color: ${({ theme }) => theme.colors.brand.primary[600]};
38
+ color: ${({ theme }) => theme.colors.brand.primary[600]};
39
+ }
40
+ }
41
+ `;
42
+ const secondaryStyle = css `
43
+ &.ant-btn-default {
44
+ background: ${({ theme }) => theme.colors.neutral.gray[100]};
45
+ border-color: ${({ theme }) => theme.colors.neutral.gray[300]};
46
+ color: ${({ theme }) => theme.colors.neutral.gray[800]};
47
+
48
+ &:hover:not(:disabled) {
49
+ background: ${({ theme }) => theme.colors.neutral.gray[200]};
50
+ border-color: ${({ theme }) => theme.colors.neutral.gray[400]};
51
+ color: ${({ theme }) => theme.colors.neutral.gray[900]};
52
+ }
53
+ }
54
+ `;
55
+ const StyledButton = styled(Button$1) `
56
+ /* Transition mượt cho tất cả states */
57
+ transition: all 0.2s ease;
58
+
59
+ /* fullWidth */
60
+ ${({ $fullWidth }) => $fullWidth && fullWidthStyle}
61
+
62
+ /* Variant-specific styles */
63
+ ${({ $variant }) => $variant === 'outline' && outlineStyle}
64
+ ${({ $variant }) => $variant === 'secondary' && secondaryStyle}
65
+ `;
66
+ // ============================================
67
+ // Component
68
+ // ============================================
69
+ const Button = React.forwardRef(({ variant = 'primary', size = 'md', fullWidth = false, loading = false, children, ...rest }, ref) => {
70
+ const antType = antTypeMap[variant];
71
+ return (jsx(StyledButton, { ref: ref, type: antType.type, danger: antType.danger, size: antSizeMap[size], loading: loading, "$variant": variant, "$fullWidth": fullWidth, ...rest, children: children }));
72
+ });
73
+ Button.displayName = 'Button';
74
+
75
+ export { Button };
76
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sources":["../../../../../src/components/Button/Button.tsx"],"sourcesContent":[null],"names":["AntButton","_jsx"],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { Input as Input$1 } from 'antd';
4
+ import styled, { css } from 'styled-components';
5
+
6
+ // ============================================
7
+ // Map sang Ant Design props
8
+ // ============================================
9
+ const antSizeMap = {
10
+ sm: 'small',
11
+ md: 'middle',
12
+ lg: 'large',
13
+ };
14
+ const antStatusMap = {
15
+ default: undefined,
16
+ error: 'error',
17
+ warning: 'warning',
18
+ };
19
+ // ============================================
20
+ // Styled Components
21
+ // ============================================
22
+ const fullWidthStyle = css `
23
+ width: 100%;
24
+ `;
25
+ const InputWrapper = styled.div `
26
+ display: inline-flex;
27
+ flex-direction: column;
28
+ gap: ${({ theme }) => theme.spacing.xs}px;
29
+ ${({ $fullWidth }) => $fullWidth && fullWidthStyle}
30
+ `;
31
+ const Label = styled.label `
32
+ font-size: ${({ theme }) => theme.typography.fontSizes.sm}px;
33
+ font-weight: ${({ theme }) => theme.typography.fontWeights.medium};
34
+ color: ${({ theme }) => theme.colors.neutral.gray[700]};
35
+ line-height: ${({ theme }) => theme.typography.lineHeights.normal};
36
+ `;
37
+ const HelperText = styled.span `
38
+ font-size: ${({ theme }) => theme.typography.fontSizes.xs}px;
39
+ line-height: ${({ theme }) => theme.typography.lineHeights.normal};
40
+ color: ${({ theme, $status }) => {
41
+ switch ($status) {
42
+ case 'error':
43
+ return theme.colors.semantic.error.default;
44
+ case 'warning':
45
+ return theme.colors.semantic.warning.default;
46
+ default:
47
+ return theme.colors.neutral.gray[500];
48
+ }
49
+ }};
50
+ `;
51
+ const StyledAntInput = styled(Input$1) `
52
+ ${({ $fullWidth }) => $fullWidth && fullWidthStyle}
53
+
54
+ &.ant-input-affix-wrapper,
55
+ &.ant-input {
56
+ transition: all 0.2s ease;
57
+ }
58
+ `;
59
+ // ============================================
60
+ // Component
61
+ // ============================================
62
+ const Input = React.forwardRef(({ size = 'md', status = 'default', label, helperText, fullWidth = false, id, ...rest }, ref) => {
63
+ // Tạo id tự động nếu có label nhưng không truyền id
64
+ const inputId = id !== null && id !== void 0 ? id : (label ? `input-${label.toLowerCase().replace(/\s+/g, '-')}` : undefined);
65
+ return (jsxs(InputWrapper, { "$fullWidth": fullWidth, children: [label && jsx(Label, { htmlFor: inputId, children: label }), jsx(StyledAntInput, { ref: ref, id: inputId, size: antSizeMap[size], status: antStatusMap[status], "$fullWidth": fullWidth, ...rest }), helperText && jsx(HelperText, { "$status": status, children: helperText })] }));
66
+ });
67
+ Input.displayName = 'Input';
68
+
69
+ export { Input };
70
+ //# sourceMappingURL=Input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.js","sources":["../../../../../src/components/Input/Input.tsx"],"sourcesContent":[null],"names":["AntInput","_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { brandColors, colors, neutralColors, semanticColors } from './tokens/colors.js';
2
+ export { spacing } from './tokens/spacing.js';
3
+ export { fontFamilies, fontSizes, fontWeights, lineHeights, typography } from './tokens/typography.js';
4
+ export { shadows } from './tokens/shadows.js';
5
+ export { borderRadius, borderWidth, borders } from './tokens/borders.js';
6
+ export { breakpoints } from './tokens/breakpoints.js';
7
+ export { ThemeProvider } from './theme/ThemeProvider.js';
8
+ export { antdTheme, appTheme } from './theme/theme.js';
9
+ export { Button } from './components/Button/Button.js';
10
+ export { Input } from './components/Input/Input.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -0,0 +1,32 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ConfigProvider } from 'antd';
3
+ import { ThemeProvider as ThemeProvider$1 } from 'styled-components';
4
+ import { antdTheme, appTheme } from './theme.js';
5
+
6
+ // ============================================
7
+ // ThemeProvider Component
8
+ // ============================================
9
+ const ThemeProvider = ({ children, antdThemeOverride, styledThemeOverride, }) => {
10
+ // Merge Ant Design theme
11
+ const mergedAntdTheme = antdThemeOverride
12
+ ? {
13
+ ...antdTheme,
14
+ token: {
15
+ ...antdTheme.token,
16
+ ...antdThemeOverride.token,
17
+ },
18
+ components: {
19
+ ...antdTheme.components,
20
+ ...antdThemeOverride.components,
21
+ },
22
+ }
23
+ : antdTheme;
24
+ // Merge styled-components theme
25
+ const mergedStyledTheme = styledThemeOverride
26
+ ? { ...appTheme, ...styledThemeOverride }
27
+ : appTheme;
28
+ return (jsx(ConfigProvider, { theme: mergedAntdTheme, children: jsx(ThemeProvider$1, { theme: mergedStyledTheme, children: children }) }));
29
+ };
30
+
31
+ export { ThemeProvider };
32
+ //# sourceMappingURL=ThemeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeProvider.js","sources":["../../../../src/theme/ThemeProvider.tsx"],"sourcesContent":[null],"names":["_jsx","StyledThemeProvider"],"mappings":";;;;;AA+BA;AACA;AACA;AAEO,MAAM,aAAa,GAAiC,CAAC,EAC1D,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,GACpB,KAAI;;IAEH,MAAM,eAAe,GAAgB;AACnC,UAAE;AACE,YAAA,GAAG,SAAS;AACZ,YAAA,KAAK,EAAE;gBACL,GAAG,SAAS,CAAC,KAAK;gBAClB,GAAG,iBAAiB,CAAC,KAAK;AAC3B,aAAA;AACD,YAAA,UAAU,EAAE;gBACV,GAAG,SAAS,CAAC,UAAU;gBACvB,GAAG,iBAAiB,CAAC,UAAU;AAChC,aAAA;AACF;UACD,SAAS;;IAGb,MAAM,iBAAiB,GAAa;AAClC,UAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,mBAAmB;UACrC,QAAQ;AAEZ,IAAA,QACEA,GAAA,CAAC,cAAc,IAAC,KAAK,EAAE,eAAe,EAAA,QAAA,EACpCA,GAAA,CAACC,eAAmB,EAAA,EAAC,KAAK,EAAE,iBAAiB,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAuB,EAAA,CAChE;AAErB;;;;"}
@@ -0,0 +1,83 @@
1
+ import { neutralColors, semanticColors, brandColors } from '../tokens/colors.js';
2
+ import { spacing } from '../tokens/spacing.js';
3
+ import { fontSizes, fontFamilies, lineHeights, fontWeights } from '../tokens/typography.js';
4
+ import { shadows } from '../tokens/shadows.js';
5
+ import { borderWidth, borderRadius } from '../tokens/borders.js';
6
+ import { breakpoints } from '../tokens/breakpoints.js';
7
+
8
+ // ============================================
9
+ // Styled-components Theme Object
10
+ // ============================================
11
+ const appTheme = {
12
+ colors: {
13
+ brand: brandColors,
14
+ neutral: neutralColors,
15
+ semantic: semanticColors,
16
+ },
17
+ spacing,
18
+ typography: {
19
+ fontFamilies,
20
+ fontSizes,
21
+ fontWeights,
22
+ lineHeights,
23
+ },
24
+ shadows,
25
+ borderRadius,
26
+ borderWidth,
27
+ breakpoints,
28
+ };
29
+ // ============================================
30
+ // Ant Design Theme Config
31
+ // ============================================
32
+ // Map design tokens sang Ant Design Design Token System.
33
+ // Tham khảo: https://ant.design/docs/react/customize-theme
34
+ const antdTheme = {
35
+ token: {
36
+ // Brand colors
37
+ colorPrimary: brandColors.primary[500],
38
+ colorLink: brandColors.primary[500],
39
+ colorLinkHover: brandColors.primary[400],
40
+ colorLinkActive: brandColors.primary[600],
41
+ // Semantic colors
42
+ colorSuccess: semanticColors.success.default,
43
+ colorWarning: semanticColors.warning.default,
44
+ colorError: semanticColors.error.default,
45
+ colorInfo: semanticColors.info.default,
46
+ // Typography
47
+ fontFamily: fontFamilies.base,
48
+ fontSize: fontSizes.sm, // 14px — Ant Design default
49
+ fontSizeLG: fontSizes.md, // 16px
50
+ fontSizeSM: fontSizes.xs, // 12px
51
+ fontSizeXL: fontSizes.lg, // 18px
52
+ // Spacing
53
+ padding: spacing.lg, // 16px
54
+ paddingSM: spacing.sm, // 8px
55
+ paddingXS: spacing.xs, // 4px
56
+ paddingLG: spacing['2xl'], // 24px
57
+ margin: spacing.lg, // 16px
58
+ marginSM: spacing.sm, // 8px
59
+ marginXS: spacing.xs, // 4px
60
+ marginLG: spacing['2xl'], // 24px
61
+ // Border
62
+ borderRadius: borderRadius.lg, // 6px — Ant Design default
63
+ borderRadiusLG: borderRadius.xl, // 8px
64
+ borderRadiusSM: borderRadius.md, // 4px
65
+ lineWidth: borderWidth.thin, // 1px
66
+ lineWidthFocus: borderWidth.thick, // 4px — focus ring
67
+ // Neutral
68
+ colorText: neutralColors.gray[800],
69
+ colorTextSecondary: neutralColors.gray[600],
70
+ colorTextTertiary: neutralColors.gray[500],
71
+ colorTextDisabled: neutralColors.gray[400],
72
+ colorBgBase: neutralColors.white,
73
+ colorBgLayout: neutralColors.gray[50],
74
+ colorBorder: neutralColors.gray[300],
75
+ colorBorderSecondary: neutralColors.gray[200],
76
+ // Shadow
77
+ boxShadow: shadows.sm,
78
+ boxShadowSecondary: shadows.md,
79
+ },
80
+ };
81
+
82
+ export { antdTheme, appTheme };
83
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sources":["../../../../src/theme/theme.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAyCA;AACA;AACA;AAEO,MAAM,QAAQ,GAAa;AAChC,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,OAAO,EAAE,aAAa;AACtB,QAAA,QAAQ,EAAE,cAAc;AACzB,KAAA;IACD,OAAO;AACP,IAAA,UAAU,EAAE;QACV,YAAY;QACZ,SAAS;QACT,WAAW;QACX,WAAW;AACZ,KAAA;IACD,OAAO;IACP,YAAY;IACZ,WAAW;IACX,WAAW;;AAGb;AACA;AACA;AACA;AACA;AAEO,MAAM,SAAS,GAAgB;AACpC,IAAA,KAAK,EAAE;;AAEL,QAAA,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;AACtC,QAAA,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;AACnC,QAAA,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;AACxC,QAAA,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;;AAGzC,QAAA,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO;AAC5C,QAAA,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO;AAC5C,QAAA,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO;AACxC,QAAA,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO;;QAGtC,UAAU,EAAE,YAAY,CAAC,IAAI;AAC7B,QAAA,QAAQ,EAAE,SAAS,CAAC,EAAE;AACtB,QAAA,UAAU,EAAE,SAAS,CAAC,EAAE;AACxB,QAAA,UAAU,EAAE,SAAS,CAAC,EAAE;AACxB,QAAA,UAAU,EAAE,SAAS,CAAC,EAAE;;AAGxB,QAAA,OAAO,EAAE,OAAO,CAAC,EAAE;AACnB,QAAA,SAAS,EAAE,OAAO,CAAC,EAAE;AACrB,QAAA,SAAS,EAAE,OAAO,CAAC,EAAE;AACrB,QAAA,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC;AACzB,QAAA,MAAM,EAAE,OAAO,CAAC,EAAE;AAClB,QAAA,QAAQ,EAAE,OAAO,CAAC,EAAE;AACpB,QAAA,QAAQ,EAAE,OAAO,CAAC,EAAE;AACpB,QAAA,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC;;AAGxB,QAAA,YAAY,EAAE,YAAY,CAAC,EAAE;AAC7B,QAAA,cAAc,EAAE,YAAY,CAAC,EAAE;AAC/B,QAAA,cAAc,EAAE,YAAY,CAAC,EAAE;AAC/B,QAAA,SAAS,EAAE,WAAW,CAAC,IAAI;AAC3B,QAAA,cAAc,EAAE,WAAW,CAAC,KAAK;;AAGjC,QAAA,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AAClC,QAAA,kBAAkB,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AAC3C,QAAA,iBAAiB,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1C,QAAA,iBAAiB,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1C,WAAW,EAAE,aAAa,CAAC,KAAK;AAChC,QAAA,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,QAAA,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AACpC,QAAA,oBAAoB,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;;QAG7C,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,kBAAkB,EAAE,OAAO,CAAC,EAAE;AAC/B,KAAA;;;;;"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Border Tokens
3
+ *
4
+ * Bao gồm border-radius và border-width.
5
+ */
6
+ // ============================================
7
+ // Border Radius
8
+ // ============================================
9
+ const borderRadius = {
10
+ /** 0px — Không bo góc */
11
+ none: 0,
12
+ /** 2px — Bo góc rất nhẹ */
13
+ sm: 2,
14
+ /** 4px — Bo góc nhẹ */
15
+ md: 4,
16
+ /** 6px — Ant Design default */
17
+ lg: 6,
18
+ /** 8px — Bo góc trung bình */
19
+ xl: 8,
20
+ /** 12px — Bo góc lớn */
21
+ '2xl': 12,
22
+ /** 16px — Bo góc rất lớn */
23
+ '3xl': 16,
24
+ /** 9999px — Bo tròn hoàn toàn (pill shape) */
25
+ full: 9999,
26
+ };
27
+ // ============================================
28
+ // Border Width
29
+ // ============================================
30
+ const borderWidth = {
31
+ /** 0px */
32
+ none: 0,
33
+ /** 1px — Default border */
34
+ thin: 1,
35
+ /** 2px — Medium border */
36
+ medium: 2,
37
+ /** 4px — Thick border (ví dụ: focus ring) */
38
+ thick: 4,
39
+ };
40
+ // ============================================
41
+ // Export gộp
42
+ // ============================================
43
+ const borders = {
44
+ radius: borderRadius,
45
+ width: borderWidth,
46
+ };
47
+
48
+ export { borderRadius, borderWidth, borders };
49
+ //# sourceMappingURL=borders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"borders.js","sources":["../../../../src/tokens/borders.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;AAIG;AAEH;AACA;AACA;AAEO,MAAM,YAAY,GAAG;;AAE1B,IAAA,IAAI,EAAE,CAAC;;AAEP,IAAA,EAAE,EAAE,CAAC;;AAEL,IAAA,EAAE,EAAE,CAAC;;AAEL,IAAA,EAAE,EAAE,CAAC;;AAEL,IAAA,EAAE,EAAE,CAAC;;AAEL,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,IAAI,EAAE,IAAI;;AAGZ;AACA;AACA;AAEO,MAAM,WAAW,GAAG;;AAEzB,IAAA,IAAI,EAAE,CAAC;;AAEP,IAAA,IAAI,EAAE,CAAC;;AAEP,IAAA,MAAM,EAAE,CAAC;;AAET,IAAA,KAAK,EAAE,CAAC;;AAGV;AACA;AACA;AAEO,MAAM,OAAO,GAAG;AACrB,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,KAAK,EAAE,WAAW;;;;;"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Breakpoint Tokens
3
+ *
4
+ * Các breakpoint responsive theo chuẩn phổ biến.
5
+ * Giá trị tính bằng pixel, dùng mobile-first (min-width).
6
+ */
7
+ const breakpoints = {
8
+ /** 480px — Mobile landscape */
9
+ xs: 480,
10
+ /** 576px — Small tablet */
11
+ sm: 576,
12
+ /** 768px — Tablet */
13
+ md: 768,
14
+ /** 992px — Small desktop */
15
+ lg: 992,
16
+ /** 1200px — Desktop */
17
+ xl: 1200,
18
+ /** 1600px — Large desktop */
19
+ '2xl': 1600,
20
+ };
21
+
22
+ export { breakpoints };
23
+ //# sourceMappingURL=breakpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breakpoints.js","sources":["../../../../src/tokens/breakpoints.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;AAKG;AAEI,MAAM,WAAW,GAAG;;AAEzB,IAAA,EAAE,EAAE,GAAG;;AAEP,IAAA,EAAE,EAAE,GAAG;;AAEP,IAAA,EAAE,EAAE,GAAG;;AAEP,IAAA,EAAE,EAAE,GAAG;;AAEP,IAAA,EAAE,EAAE,IAAI;;AAER,IAAA,KAAK,EAAE,IAAI;;;;;"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Color Tokens
3
+ *
4
+ * Hệ thống màu sắc được chia thành 3 nhóm:
5
+ * - Brand: Màu thương hiệu (primary, secondary)
6
+ * - Neutral: Màu trung tính (text, background, border)
7
+ * - Semantic: Màu mang ý nghĩa (success, warning, error, info)
8
+ */
9
+ // ============================================
10
+ // Brand Colors
11
+ // ============================================
12
+ const brandColors = {
13
+ primary: {
14
+ 50: '#E6F1FF',
15
+ 100: '#BAD9FF',
16
+ 200: '#8DC1FF',
17
+ 300: '#61A8FF',
18
+ 400: '#3490FF',
19
+ 500: '#1677FF', // Ant Design primary mặc định
20
+ 600: '#0958D9',
21
+ 700: '#003EB3',
22
+ 800: '#002C8C',
23
+ 900: '#001D66',
24
+ },
25
+ secondary: {
26
+ 50: '#F0E6FF',
27
+ 100: '#D3B8FF',
28
+ 200: '#B58AFF',
29
+ 300: '#985CFF',
30
+ 400: '#7A2EFF',
31
+ 500: '#6C2BD9',
32
+ 600: '#5A24B3',
33
+ 700: '#481D8C',
34
+ 800: '#361666',
35
+ 900: '#240F40',
36
+ },
37
+ };
38
+ // ============================================
39
+ // Neutral Colors
40
+ // ============================================
41
+ const neutralColors = {
42
+ white: '#FFFFFF',
43
+ black: '#000000',
44
+ gray: {
45
+ 50: '#FAFAFA',
46
+ 100: '#F5F5F5',
47
+ 200: '#F0F0F0',
48
+ 300: '#D9D9D9',
49
+ 400: '#BFBFBF',
50
+ 500: '#8C8C8C',
51
+ 600: '#595959',
52
+ 700: '#434343',
53
+ 800: '#262626',
54
+ 900: '#141414',
55
+ },
56
+ };
57
+ // ============================================
58
+ // Semantic Colors
59
+ // ============================================
60
+ const semanticColors = {
61
+ success: {
62
+ light: '#F6FFED',
63
+ default: '#52C41A',
64
+ dark: '#389E0D',
65
+ },
66
+ warning: {
67
+ light: '#FFFBE6',
68
+ default: '#FAAD14',
69
+ dark: '#D48806',
70
+ },
71
+ error: {
72
+ light: '#FFF2F0',
73
+ default: '#FF4D4F',
74
+ dark: '#CF1322',
75
+ },
76
+ info: {
77
+ light: '#E6F4FF',
78
+ default: '#1677FF',
79
+ dark: '#0958D9',
80
+ },
81
+ };
82
+ // ============================================
83
+ // Export gộp
84
+ // ============================================
85
+ const colors = {
86
+ brand: brandColors,
87
+ neutral: neutralColors,
88
+ semantic: semanticColors,
89
+ };
90
+
91
+ export { brandColors, colors, neutralColors, semanticColors };
92
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sources":["../../../../src/tokens/colors.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;AAOG;AAEH;AACA;AACA;AAEO,MAAM,WAAW,GAAG;AACzB,IAAA,OAAO,EAAE;AACP,QAAA,EAAE,EAAE,SAAS;AACb,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACf,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,EAAE,EAAE,SAAS;AACb,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACf,KAAA;;AAGH;AACA;AACA;AAEO,MAAM,aAAa,GAAG;AAC3B,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,KAAK,EAAE,SAAS;AAEhB,IAAA,IAAI,EAAE;AACJ,QAAA,EAAE,EAAE,SAAS;AACb,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,GAAG,EAAE,SAAS;AACf,KAAA;;AAGH;AACA;AACA;AAEO,MAAM,cAAc,GAAG;AAC5B,IAAA,OAAO,EAAE;AACP,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,IAAI,EAAE,SAAS;AAChB,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,IAAI,EAAE,SAAS;AAChB,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,IAAI,EAAE,SAAS;AAChB,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,IAAI,EAAE,SAAS;AAChB,KAAA;;AAGH;AACA;AACA;AAEO,MAAM,MAAM,GAAG;AACpB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,OAAO,EAAE,aAAa;AACtB,IAAA,QAAQ,EAAE,cAAc;;;;;"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shadow Tokens
3
+ *
4
+ * Hệ thống shadow tạo cảm giác elevation (độ nổi).
5
+ * Càng cao → shadow càng lớn và mờ → element trông càng "nổi" lên.
6
+ */
7
+ const shadows = {
8
+ /** Không có shadow */
9
+ none: 'none',
10
+ /** Shadow nhẹ — Cards, containers */
11
+ sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
12
+ /** Shadow trung bình — Dropdowns, popovers */
13
+ md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',
14
+ /** Shadow lớn — Modals, dialogs */
15
+ lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',
16
+ /** Shadow rất lớn — Elements nổi bật nhất */
17
+ xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',
18
+ };
19
+
20
+ export { shadows };
21
+ //# sourceMappingURL=shadows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadows.js","sources":["../../../../src/tokens/shadows.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;AAKG;AAEI,MAAM,OAAO,GAAG;;AAErB,IAAA,IAAI,EAAE,MAAM;;AAEZ,IAAA,EAAE,EAAE,iCAAiC;;AAErC,IAAA,EAAE,EAAE,sEAAsE;;AAE1E,IAAA,EAAE,EAAE,wEAAwE;;AAE5E,IAAA,EAAE,EAAE,yEAAyE;;;;;"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Spacing Tokens
3
+ *
4
+ * Hệ thống spacing dựa trên base unit 4px (4-point grid system).
5
+ * Mỗi bậc nhân đôi hoặc tăng dần đều → tạo nhịp điệu thị giác nhất quán.
6
+ *
7
+ * Quy ước đặt tên: xs, sm, md, lg, xl, 2xl, 3xl
8
+ */
9
+ const spacing = {
10
+ /** 0px */
11
+ none: 0,
12
+ /** 2px — Khoảng cách rất nhỏ (ví dụ: gap giữa icon và text nhỏ) */
13
+ xxs: 2,
14
+ /** 4px — Khoảng cách nhỏ */
15
+ xs: 4,
16
+ /** 8px — Khoảng cách cơ bản */
17
+ sm: 8,
18
+ /** 12px */
19
+ md: 12,
20
+ /** 16px — Padding mặc định */
21
+ lg: 16,
22
+ /** 20px */
23
+ xl: 20,
24
+ /** 24px — Padding lớn */
25
+ '2xl': 24,
26
+ /** 32px */
27
+ '3xl': 32,
28
+ /** 40px */
29
+ '4xl': 40,
30
+ /** 48px */
31
+ '5xl': 48,
32
+ /** 64px */
33
+ '6xl': 64,
34
+ };
35
+
36
+ export { spacing };
37
+ //# sourceMappingURL=spacing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spacing.js","sources":["../../../../src/tokens/spacing.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;AAOG;AAEI,MAAM,OAAO,GAAG;;AAErB,IAAA,IAAI,EAAE,CAAC;;AAEP,IAAA,GAAG,EAAE,CAAC;;AAEN,IAAA,EAAE,EAAE,CAAC;;AAEL,IAAA,EAAE,EAAE,CAAC;;AAEL,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,EAAE,EAAE,EAAE;;AAEN,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;AAET,IAAA,KAAK,EAAE,EAAE;;;;;"}