@vinhhypc/config-theme 0.1.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 (98) hide show
  1. package/README.md +57 -0
  2. package/dist/components/themed/Accordion.d.ts +23 -0
  3. package/dist/components/themed/Accordion.js +37 -0
  4. package/dist/components/themed/Accordion.js.map +1 -0
  5. package/dist/components/themed/Alert.d.ts +13 -0
  6. package/dist/components/themed/Alert.js +17 -0
  7. package/dist/components/themed/Alert.js.map +1 -0
  8. package/dist/components/themed/Avatar.d.ts +19 -0
  9. package/dist/components/themed/Avatar.js +30 -0
  10. package/dist/components/themed/Avatar.js.map +1 -0
  11. package/dist/components/themed/Badge.d.ts +11 -0
  12. package/dist/components/themed/Badge.js +17 -0
  13. package/dist/components/themed/Badge.js.map +1 -0
  14. package/dist/components/themed/Button.d.ts +14 -0
  15. package/dist/components/themed/Button.js +20 -0
  16. package/dist/components/themed/Button.js.map +1 -0
  17. package/dist/components/themed/Calendar.d.ts +18 -0
  18. package/dist/components/themed/Calendar.js +59 -0
  19. package/dist/components/themed/Calendar.js.map +1 -0
  20. package/dist/components/themed/Card.d.ts +17 -0
  21. package/dist/components/themed/Card.js +14 -0
  22. package/dist/components/themed/Card.js.map +1 -0
  23. package/dist/components/themed/Checkbox.d.ts +16 -0
  24. package/dist/components/themed/Checkbox.js +15 -0
  25. package/dist/components/themed/Checkbox.js.map +1 -0
  26. package/dist/components/themed/DropdownMenu.d.ts +20 -0
  27. package/dist/components/themed/DropdownMenu.js +39 -0
  28. package/dist/components/themed/DropdownMenu.js.map +1 -0
  29. package/dist/components/themed/Input.d.ts +18 -0
  30. package/dist/components/themed/Input.js +25 -0
  31. package/dist/components/themed/Input.js.map +1 -0
  32. package/dist/components/themed/Pagination.d.ts +17 -0
  33. package/dist/components/themed/Pagination.js +33 -0
  34. package/dist/components/themed/Pagination.js.map +1 -0
  35. package/dist/components/themed/Select.d.ts +16 -0
  36. package/dist/components/themed/Select.js +20 -0
  37. package/dist/components/themed/Select.js.map +1 -0
  38. package/dist/components/themed/Sheet.d.ts +19 -0
  39. package/dist/components/themed/Sheet.js +28 -0
  40. package/dist/components/themed/Sheet.js.map +1 -0
  41. package/dist/components/themed/Sidebar.d.ts +21 -0
  42. package/dist/components/themed/Sidebar.js +11 -0
  43. package/dist/components/themed/Sidebar.js.map +1 -0
  44. package/dist/components/themed/Table.d.ts +21 -0
  45. package/dist/components/themed/Table.js +10 -0
  46. package/dist/components/themed/Table.js.map +1 -0
  47. package/dist/components/themed/ThemeProvider.d.ts +41 -0
  48. package/dist/components/themed/ThemeProvider.js +53 -0
  49. package/dist/components/themed/ThemeProvider.js.map +1 -0
  50. package/dist/components/themed/Toast.d.ts +19 -0
  51. package/dist/components/themed/Toast.js +13 -0
  52. package/dist/components/themed/Toast.js.map +1 -0
  53. package/dist/components/themed/Tooltip.d.ts +15 -0
  54. package/dist/components/themed/Tooltip.js +11 -0
  55. package/dist/components/themed/Tooltip.js.map +1 -0
  56. package/dist/components/themed/index.d.ts +33 -0
  57. package/dist/components/themed/index.js +35 -0
  58. package/dist/components/themed/index.js.map +1 -0
  59. package/dist/components/themed/styles.d.ts +29 -0
  60. package/dist/components/themed/styles.js +270 -0
  61. package/dist/components/themed/styles.js.map +1 -0
  62. package/dist/components/themed/themeCss.d.ts +35 -0
  63. package/dist/components/themed/themeCss.js +76 -0
  64. package/dist/components/themed/themeCss.js.map +1 -0
  65. package/dist/lib/config/defaults.d.ts +5 -0
  66. package/dist/lib/config/defaults.js +86 -0
  67. package/dist/lib/config/defaults.js.map +1 -0
  68. package/dist/lib/config/presets.d.ts +13 -0
  69. package/dist/lib/config/presets.js +104 -0
  70. package/dist/lib/config/presets.js.map +1 -0
  71. package/dist/lib/config/types.d.ts +146 -0
  72. package/dist/lib/config/types.js +46 -0
  73. package/dist/lib/config/types.js.map +1 -0
  74. package/dist/lib/tokens/adapters.d.ts +15 -0
  75. package/dist/lib/tokens/adapters.js +102 -0
  76. package/dist/lib/tokens/adapters.js.map +1 -0
  77. package/dist/lib/tokens/color.d.ts +23 -0
  78. package/dist/lib/tokens/color.js +132 -0
  79. package/dist/lib/tokens/color.js.map +1 -0
  80. package/dist/lib/tokens/elevation.d.ts +6 -0
  81. package/dist/lib/tokens/elevation.js +40 -0
  82. package/dist/lib/tokens/elevation.js.map +1 -0
  83. package/dist/lib/tokens/index.d.ts +43 -0
  84. package/dist/lib/tokens/index.js +88 -0
  85. package/dist/lib/tokens/index.js.map +1 -0
  86. package/dist/lib/tokens/interactions.d.ts +12 -0
  87. package/dist/lib/tokens/interactions.js +72 -0
  88. package/dist/lib/tokens/interactions.js.map +1 -0
  89. package/dist/lib/tokens/opacity.d.ts +14 -0
  90. package/dist/lib/tokens/opacity.js +34 -0
  91. package/dist/lib/tokens/opacity.js.map +1 -0
  92. package/dist/lib/tokens/spacing.d.ts +17 -0
  93. package/dist/lib/tokens/spacing.js +32 -0
  94. package/dist/lib/tokens/spacing.js.map +1 -0
  95. package/dist/lib/tokens/typography.d.ts +16 -0
  96. package/dist/lib/tokens/typography.js +23 -0
  97. package/dist/lib/tokens/typography.js.map +1 -0
  98. package/package.json +42 -0
@@ -0,0 +1,270 @@
1
+ import { buttonHoverCss, cardHoverCss, activeCss, focusRingCss } from "../../lib/tokens/index.js";
2
+ function helpers(config) {
3
+ const i = config.interactions;
4
+ return {
5
+ base: config.typography.baseSize,
6
+ transition: "transition: all var(--duration) var(--easing);",
7
+ focus: focusRingCss(i.focusRing),
8
+ active: activeCss(i.pressFeedback),
9
+ btnHover: (c) => buttonHoverCss(i.hover, c),
10
+ ghostHover: i.hover === "darken"
11
+ ? "background: var(--color-primary-50);"
12
+ : buttonHoverCss(i.hover, "--color-primary"),
13
+ cardHover: cardHoverCss(i.hover),
14
+ };
15
+ }
16
+ /* ------------------------------- Button ------------------------------- */
17
+ export function buttonStyles(p, config) {
18
+ const { base, transition, focus, active, btnHover, ghostHover } = helpers(config);
19
+ return `
20
+ ${p}.tcb { font-family: var(--font-base); font-weight: 600; font-size: ${base - 1}px; padding: var(--space-2) var(--space-4); border-radius: var(--radius-md); border: var(--border-width) var(--border-style) transparent; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); line-height: 1.2; ${transition} }
21
+ ${p}.tcb:focus-visible { ${focus} }
22
+ ${p}.tcb:active { ${active} }
23
+ ${p}.tcb[disabled] { opacity: .5; pointer-events: none; }
24
+ ${p}.tcb--sm { padding: var(--space-1) var(--space-3); font-size: ${base - 3}px; }
25
+ ${p}.tcb--lg { padding: var(--space-3) var(--space-6); font-size: ${base + 1}px; }
26
+ ${p}.tcb--primary { background: var(--color-primary-600); color: #fff; }
27
+ ${p}.tcb--primary:hover { ${btnHover("--color-primary")} }
28
+ ${p}.tcb--secondary { background: var(--color-secondary-600); color: #fff; }
29
+ ${p}.tcb--secondary:hover { ${btnHover("--color-secondary")} }
30
+ ${p}.tcb--destructive { background: var(--color-error-600); color: #fff; }
31
+ ${p}.tcb--destructive:hover { ${btnHover("--color-error")} }
32
+ ${p}.tcb--ghost { background: transparent; color: var(--color-primary-700); }
33
+ ${p}.tcb--ghost:hover { ${ghostHover} }
34
+ ${p}.tcb--outline { background: transparent; color: var(--text); border-color: var(--border-c); }
35
+ ${p}.tcb--outline:hover { ${ghostHover} border-color: var(--color-primary-400); }`;
36
+ }
37
+ /* -------------------------- Input / Select --------------------------- */
38
+ export function inputStyles(p, config) {
39
+ const { base, transition } = helpers(config);
40
+ return `
41
+ ${p}.tci { font-family: var(--font-base); font-size: ${base - 1}px; color: var(--text); background: var(--surface-2); padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); border: var(--border-width) var(--border-style) var(--border-c); ${transition} width: 100%; }
42
+ ${p}.tci:hover { border-color: var(--color-primary-400); }
43
+ ${p}.tci:focus-visible { outline: none; border-color: var(--color-primary-500); }
44
+ ${p}.tci[disabled] { opacity: .5; }
45
+ ${p}.tci--filled { background: var(--color-neutral-100); border-color: transparent; }
46
+ ${p}.tci--underline { background: transparent; border: 0; border-bottom: var(--border-width) var(--border-style) var(--border-c); border-radius: 0; }
47
+ ${p}.tci--error { border-color: var(--color-error-500); }
48
+ ${p}.tc-field { display: grid; gap: var(--space-1); font-size: ${base - 2}px; color: var(--text-muted); }
49
+ ${p}.tc-field > span { color: var(--text); }`;
50
+ }
51
+ /* ------------------------------ Checkbox ----------------------------- */
52
+ export function checkboxStyles(p, config) {
53
+ const { base, transition } = helpers(config);
54
+ return `
55
+ ${p}.tc-checkbox { display: inline-flex; align-items: center; gap: var(--space-2); font-size: ${base - 1}px; color: var(--text); cursor: pointer; user-select: none; }
56
+ ${p}.tc-checkbox input { position: absolute; opacity: 0; width: 0; height: 0; }
57
+ ${p}.tc-checkbox__box { width: 18px; height: 18px; border-radius: var(--radius-sm); border: var(--border-width) var(--border-style) var(--border-c); display: inline-flex; align-items: center; justify-content: center; color: #fff; ${transition} }
58
+ ${p}.tc-checkbox__box svg { width: 12px; height: 12px; opacity: 0; }
59
+ ${p}.tc-checkbox[data-checked="true"] .tc-checkbox__box { background: var(--color-primary-600); border-color: var(--color-primary-600); }
60
+ ${p}.tc-checkbox[data-checked="true"] .tc-checkbox__box svg { opacity: 1; }
61
+ ${p}.tc-checkbox input:focus-visible + .tc-checkbox__box { outline: 2px solid var(--color-primary-500); outline-offset: 2px; }
62
+ ${p}.tc-checkbox[data-disabled="true"] { opacity: .5; pointer-events: none; }`;
63
+ }
64
+ /* ------------------------------- Badge ------------------------------- */
65
+ export function badgeStyles(p, config) {
66
+ const { base } = helpers(config);
67
+ return `
68
+ ${p}.tc-badge { display: inline-flex; align-items: center; gap: 4px; padding: var(--space-1) var(--space-2); border-radius: var(--radius-pill); font-size: ${base - 4}px; font-weight: 600; line-height: 1.4; }
69
+ ${p}.tc-badge--solid { background: var(--color-primary-600); color: #fff; }
70
+ ${p}.tc-badge--neutral { background: var(--color-neutral-200); color: var(--text); }
71
+ ${p}.tc-badge--success { background: var(--color-success-100); color: var(--color-success-700); }
72
+ ${p}.tc-badge--warning { background: var(--color-warning-100); color: var(--color-warning-700); }
73
+ ${p}.tc-badge--error { background: var(--color-error-100); color: var(--color-error-700); }
74
+ ${p}.tc-badge--info { background: var(--color-info-100); color: var(--color-info-700); }`;
75
+ }
76
+ /* ------------------------------- Alert ------------------------------- */
77
+ export function alertStyles(p, config) {
78
+ const { base } = helpers(config);
79
+ return `
80
+ ${p}.tc-alert { padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); font-size: ${base - 1}px; border-left: 3px solid; display: grid; gap: 2px; }
81
+ ${p}.tc-alert__title { font-weight: 600; }
82
+ ${p}.tc-alert--success { background: var(--color-success-50); color: var(--color-success-800); border-color: var(--color-success-500); }
83
+ ${p}.tc-alert--warning { background: var(--color-warning-50); color: var(--color-warning-800); border-color: var(--color-warning-500); }
84
+ ${p}.tc-alert--error { background: var(--color-error-50); color: var(--color-error-800); border-color: var(--color-error-500); }
85
+ ${p}.tc-alert--info { background: var(--color-info-50); color: var(--color-info-800); border-color: var(--color-info-500); }`;
86
+ }
87
+ /* ------------------------------ Avatar ------------------------------- */
88
+ export function avatarStyles(p) {
89
+ return `
90
+ ${p}.tc-avatar { width: 40px; height: 40px; border-radius: 9999px; background: var(--color-primary-600); color: #fff; display: inline-flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 700; overflow: hidden; }
91
+ ${p}.tc-avatar img { width: 100%; height: 100%; object-fit: cover; }
92
+ ${p}.tc-avatar--sm { width: 28px; height: 28px; font-size: 11px; }
93
+ ${p}.tc-avatar--lg { width: 56px; height: 56px; font-size: 18px; }
94
+ ${p}.tc-avatar--accent { background: var(--color-accent-500); }
95
+ ${p}.tc-avatar--soft { background: var(--color-neutral-200); color: var(--text); }`;
96
+ }
97
+ /* ------------------------------- Card -------------------------------- */
98
+ export function cardStyles(p, config) {
99
+ const { base, transition, cardHover } = helpers(config);
100
+ return `
101
+ ${p}.tc-card { padding: var(--space-5, 20px); border-radius: var(--radius-lg); background: var(--surface-2); ${transition} display: flex; flex-direction: column; gap: var(--space-2, 8px); }
102
+ ${p}.tc-card:hover { ${cardHover} }
103
+ ${p}.tc-card--elevated { box-shadow: var(--shadow-2, 0 4px 12px rgba(0,0,0,.10)); }
104
+ ${p}.tc-card--outlined { border: var(--border-width) var(--border-style) var(--border-c); box-shadow: none; }
105
+ ${p}.tc-card--flat { background: var(--color-neutral-100); box-shadow: none; }
106
+ ${p}.tc-card__title { font-family: var(--font-heading); font-size: ${base + 2}px; font-weight: 600; margin: 0; }
107
+ ${p}.tc-card__body { color: var(--text-muted); font-size: ${base - 1}px; margin: 0; flex: 1 1 auto; }
108
+ ${p}.tc-card__foot { margin-top: var(--space-3, 12px); display: flex; gap: var(--space-2); }`;
109
+ }
110
+ /* ------------------------------- Table ------------------------------- */
111
+ export function tableStyles(p, config) {
112
+ const { base, transition } = helpers(config);
113
+ return `
114
+ ${p}.tc-table { width: 100%; border-collapse: collapse; font-size: ${base - 2}px; color: var(--text); }
115
+ ${p}.tc-table th, ${p}.tc-table td { text-align: left; padding: var(--space-2) var(--space-3); border-bottom: var(--border-width) var(--border-style) var(--border-c); }
116
+ ${p}.tc-table th { color: var(--text-muted); font-weight: 600; background: var(--color-neutral-100); }
117
+ ${p}.tc-table tbody tr { ${transition} }
118
+ ${p}.tc-table tbody tr:hover { background: var(--color-primary-50); }`;
119
+ }
120
+ /* ----------------------------- Progress ------------------------------ */
121
+ export function progressStyles(p) {
122
+ return `
123
+ ${p}.tc-progress { height: 8px; background: var(--color-neutral-200); border-radius: var(--radius-pill); overflow: hidden; width: 100%; }
124
+ ${p}.tc-progress__bar { display: block; height: 100%; background: var(--color-primary-600); transition: width var(--duration) var(--easing); }`;
125
+ }
126
+ /* ------------------------------- Spin -------------------------------- */
127
+ export function spinStyles(p) {
128
+ return `
129
+ @keyframes tc-spin { to { transform: rotate(360deg); } }
130
+ ${p}.tc-spin { display: inline-block; width: 24px; height: 24px; border-radius: 9999px; border: 2px solid var(--color-neutral-200); border-top-color: var(--color-primary-600); animation: tc-spin .7s linear infinite; }
131
+ ${p}.tc-spin--sm { width: 16px; height: 16px; }
132
+ ${p}.tc-spin--lg { width: 36px; height: 36px; border-width: 3px; }
133
+ @media (prefers-reduced-motion: reduce) { ${p}.tc-spin { animation-duration: 2s; } }`;
134
+ }
135
+ /* ------------------------------- Tabs -------------------------------- */
136
+ export function tabsStyles(p, config) {
137
+ const { base, transition } = helpers(config);
138
+ return `
139
+ ${p}.tc-tabs__list { display: inline-flex; gap: 2px; padding: 3px; background: var(--color-neutral-100); border-radius: var(--radius-md); }
140
+ ${p}.tc-tab { padding: var(--space-1) var(--space-3); border: 0; background: transparent; border-radius: var(--radius-sm); font-size: ${base - 2}px; color: var(--text-muted); cursor: pointer; font-family: var(--font-base); ${transition} }
141
+ ${p}.tc-tab:hover { color: var(--text); }
142
+ ${p}.tc-tab--active { background: var(--surface-2); color: var(--text); box-shadow: var(--shadow-1); }
143
+ ${p}.tc-tabs__panel { padding: var(--space-3) 0; font-size: ${base - 1}px; color: var(--text); }`;
144
+ }
145
+ /* ------------------------------ Tooltip ------------------------------ */
146
+ export function tooltipStyles(p, config) {
147
+ const { base } = helpers(config);
148
+ return `
149
+ ${p}.tc-tooltip { position: relative; display: inline-flex; }
150
+ ${p}.tc-tooltip__pop { position: absolute; bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%); background: var(--color-neutral-900); color: var(--color-neutral-50); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); font-size: ${base - 4}px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity var(--duration) var(--easing); z-index: 30; }
151
+ ${p}.tc-tooltip:hover .tc-tooltip__pop, ${p}.tc-tooltip:focus-within .tc-tooltip__pop { opacity: 1; }
152
+ ${p}.tc-tooltip__pop::after { content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); border: 4px solid transparent; border-top-color: var(--color-neutral-900); }`;
153
+ }
154
+ /* ------------------------------ Dropdown ----------------------------- */
155
+ export function dropdownStyles(p, config) {
156
+ const { base, transition } = helpers(config);
157
+ return `
158
+ ${p}.tc-dropdown { position: relative; display: inline-flex; }
159
+ ${p}.tc-dropdown__menu { position: absolute; top: calc(100% + 6px); left: 0; min-width: 180px; background: var(--surface-2); border: var(--border-width) var(--border-style) var(--border-c); border-radius: var(--radius-md); box-shadow: var(--shadow-3, 0 12px 32px rgba(0,0,0,.18)); padding: var(--space-1); z-index: 20; display: grid; gap: 2px; }
160
+ ${p}.tc-dropdown__item { text-align: left; border: 0; background: transparent; font-family: var(--font-base); font-size: ${base - 1}px; color: var(--text); padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); cursor: pointer; ${transition} }
161
+ ${p}.tc-dropdown__item:hover { background: var(--color-primary-50); color: var(--color-primary-700); }`;
162
+ }
163
+ /* ----------------------- Dialog / Drawer overlay --------------------- */
164
+ export function overlayStyles(p, config) {
165
+ const { base } = helpers(config);
166
+ return `
167
+ ${p}.tc-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.45); display: grid; place-items: center; z-index: 50; }
168
+ ${p}.tc-dialog { background: var(--surface-2); color: var(--text); border-radius: var(--radius-lg); box-shadow: var(--shadow-3, 0 12px 32px rgba(0,0,0,.18)); padding: var(--space-5, 20px); display: grid; gap: var(--space-2, 8px); min-width: 300px; max-width: 92vw; }
169
+ ${p}.tc-dialog__title { font-family: var(--font-heading); font-size: ${base + 2}px; font-weight: 600; margin: 0; }
170
+ ${p}.tc-dialog__body { color: var(--text-muted); font-size: ${base - 1}px; margin: 0; }
171
+ ${p}.tc-dialog__foot { margin-top: var(--space-3); display: flex; justify-content: flex-end; gap: var(--space-2); }
172
+ ${p}.tc-drawer-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 50; }
173
+ ${p}.tc-drawer { position: fixed; top: 0; bottom: 0; width: min(360px, 90vw); background: var(--surface-2); color: var(--text); box-shadow: var(--shadow-3, 0 12px 32px rgba(0,0,0,.18)); padding: var(--space-5, 20px); display: grid; gap: var(--space-3); align-content: start; z-index: 51; }
174
+ ${p}.tc-drawer--right { right: 0; }
175
+ ${p}.tc-drawer--left { left: 0; }
176
+ ${p}.tc-dialog__title + .tc-dialog__body { margin-top: -4px; }`;
177
+ }
178
+ /* ----------------------------- Pagination ---------------------------- */
179
+ export function paginationStyles(p, config) {
180
+ const { base, transition } = helpers(config);
181
+ return `
182
+ ${p}.tc-pagination { display: inline-flex; gap: var(--space-1); align-items: center; }
183
+ ${p}.tc-page { min-width: 32px; height: 32px; padding: 0 var(--space-2); border-radius: var(--radius-md); border: var(--border-width) var(--border-style) var(--border-c); background: var(--surface-2); color: var(--text); font-size: ${base - 2}px; font-family: var(--font-base); cursor: pointer; ${transition} }
184
+ ${p}.tc-page:hover:not([disabled]) { border-color: var(--color-primary-400); }
185
+ ${p}.tc-page--active { background: var(--color-primary-600); border-color: var(--color-primary-600); color: #fff; }
186
+ ${p}.tc-page[disabled] { opacity: .5; cursor: default; }`;
187
+ }
188
+ /* ------------------------------ Calendar ----------------------------- */
189
+ export function calendarStyles(p, config) {
190
+ const { base, transition } = helpers(config);
191
+ return `
192
+ ${p}.tc-cal { background: var(--surface-2); border: var(--border-width) var(--border-style) var(--border-c); border-radius: var(--radius-lg); padding: var(--space-4); width: 280px; display: grid; gap: var(--space-3); }
193
+ ${p}.tc-cal__head { display: flex; align-items: center; justify-content: space-between; }
194
+ ${p}.tc-cal__title { font-weight: 600; font-size: ${base - 1}px; color: var(--text); }
195
+ ${p}.tc-cal__nav { width: 28px; height: 28px; border-radius: var(--radius-md); border: var(--border-width) var(--border-style) var(--border-c); background: var(--surface-2); color: var(--text); cursor: pointer; ${transition} }
196
+ ${p}.tc-cal__nav:hover { border-color: var(--color-primary-400); }
197
+ ${p}.tc-cal__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
198
+ ${p}.tc-cal__dow { text-align: center; font-size: ${base - 5}px; color: var(--text-muted); padding: 2px 0; }
199
+ ${p}.tc-cal__day { aspect-ratio: 1; border: 0; background: transparent; border-radius: var(--radius-sm); font-size: ${base - 3}px; color: var(--text); cursor: pointer; font-family: var(--font-base); ${transition} }
200
+ ${p}.tc-cal__day:hover { background: var(--color-primary-50); }
201
+ ${p}.tc-cal__day--muted { color: var(--text-muted); opacity: .45; }
202
+ ${p}.tc-cal__day--today { box-shadow: inset 0 0 0 1px var(--color-primary-400); }
203
+ ${p}.tc-cal__day--selected { background: var(--color-primary-600); color: #fff; }
204
+ ${p}.tc-cal__day--selected:hover { background: var(--color-primary-600); }`;
205
+ }
206
+ /* ------------------------------ Sidebar ------------------------------ */
207
+ export function sidebarStyles(p, config) {
208
+ const { base, transition } = helpers(config);
209
+ return `
210
+ ${p}.tc-sidebar { width: 220px; background: var(--surface-2); border: var(--border-width) var(--border-style) var(--border-c); border-radius: var(--radius-lg); padding: var(--space-3); display: grid; gap: 2px; align-content: start; }
211
+ ${p}.tc-sidebar__title { font-size: ${base - 5}px; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); padding: var(--space-1) var(--space-2); margin: 0; }
212
+ ${p}.tc-sidebar__item { display: flex; align-items: center; gap: var(--space-2); width: 100%; text-align: left; padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); border: 0; background: transparent; font-family: var(--font-base); font-size: ${base - 1}px; color: var(--text); cursor: pointer; ${transition} }
213
+ ${p}.tc-sidebar__item:hover { background: var(--color-primary-50); }
214
+ ${p}.tc-sidebar__item--active { background: var(--color-primary-600); color: #fff; }
215
+ ${p}.tc-sidebar__item--active:hover { background: var(--color-primary-600); }`;
216
+ }
217
+ /* ------------------------------- Toast ------------------------------- */
218
+ export function toastStyles(p, config) {
219
+ const { base } = helpers(config);
220
+ return `
221
+ ${p}.tc-toast { display: flex; align-items: flex-start; gap: var(--space-3); background: var(--surface-2); color: var(--text); border: var(--border-width) var(--border-style) var(--border-c); border-left: 3px solid var(--color-primary-500); border-radius: var(--radius-md); box-shadow: var(--shadow-3, 0 12px 32px rgba(0,0,0,.18)); padding: var(--space-3) var(--space-4); min-width: 260px; max-width: 360px; }
222
+ ${p}.tc-toast__body { display: grid; gap: 2px; flex: 1 1 auto; }
223
+ ${p}.tc-toast__title { font-weight: 600; font-size: ${base - 1}px; }
224
+ ${p}.tc-toast__msg { font-size: ${base - 2}px; color: var(--text-muted); }
225
+ ${p}.tc-toast__close { flex: 0 0 auto; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; font-size: 16px; line-height: 1; padding: 2px 4px; border-radius: var(--radius-sm); }
226
+ ${p}.tc-toast__close:hover { color: var(--text); background: var(--color-neutral-100); }
227
+ ${p}.tc-toast--success { border-left-color: var(--color-success-500); }
228
+ ${p}.tc-toast--warning { border-left-color: var(--color-warning-500); }
229
+ ${p}.tc-toast--error { border-left-color: var(--color-error-500); }
230
+ ${p}.tc-toast--info { border-left-color: var(--color-info-500); }`;
231
+ }
232
+ /* ----------------------------- Accordion ----------------------------- */
233
+ export function accordionStyles(p, config) {
234
+ const { base, transition } = helpers(config);
235
+ return `
236
+ ${p}.tc-accordion { display: grid; gap: var(--space-2); width: 100%; max-width: 480px; }
237
+ ${p}.tc-accordion__item { border: var(--border-width) var(--border-style) var(--border-c); border-radius: var(--radius-md); background: var(--surface-2); overflow: hidden; }
238
+ ${p}.tc-accordion__header { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); padding: var(--space-3) var(--space-4); background: transparent; border: 0; font-family: var(--font-base); font-size: ${base - 1}px; font-weight: 600; color: var(--text); cursor: pointer; text-align: left; ${transition} }
239
+ ${p}.tc-accordion__header:hover { background: var(--color-primary-50); }
240
+ ${p}.tc-accordion__header:focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: -2px; }
241
+ ${p}.tc-accordion__icon { flex: 0 0 auto; width: 16px; height: 16px; transition: transform var(--duration) var(--easing); }
242
+ ${p}.tc-accordion__item[data-open="true"] .tc-accordion__icon { transform: rotate(180deg); }
243
+ ${p}.tc-accordion__panel { padding: 0 var(--space-4) var(--space-4); font-size: ${base - 1}px; color: var(--text-muted); line-height: 1.5; }`;
244
+ }
245
+ /** Concatenate every component stylesheet for the given selector prefix. */
246
+ export function componentStyles(prefix, config) {
247
+ const parts = [
248
+ buttonStyles(prefix, config),
249
+ accordionStyles(prefix, config),
250
+ sidebarStyles(prefix, config),
251
+ toastStyles(prefix, config),
252
+ inputStyles(prefix, config),
253
+ checkboxStyles(prefix, config),
254
+ badgeStyles(prefix, config),
255
+ alertStyles(prefix, config),
256
+ avatarStyles(prefix),
257
+ cardStyles(prefix, config),
258
+ tableStyles(prefix, config),
259
+ progressStyles(prefix),
260
+ spinStyles(prefix),
261
+ tabsStyles(prefix, config),
262
+ tooltipStyles(prefix, config),
263
+ dropdownStyles(prefix, config),
264
+ overlayStyles(prefix, config),
265
+ paginationStyles(prefix, config),
266
+ calendarStyles(prefix, config),
267
+ ];
268
+ return parts.join("\n") + `\n@media (prefers-reduced-motion: reduce) { ${prefix}.tcb, ${prefix}.tc-card, ${prefix}.tc-page { transition: none !important; } }\n`;
269
+ }
270
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../components/themed/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Shared theming layer for the component showcase (Storybook) and any other
3
+ * surface that needs to render real components using a `DesignConfig`.
4
+ *
5
+ * It reuses the exact same token resolution + interaction helpers as the Live
6
+ * Preview, so a component shown in Storybook looks identical to how it appears
7
+ * in the in-app preview for the same config.
8
+ */
9
+ import type { CSSProperties } from "react";
10
+ import type { DesignConfig } from "../../lib/config/types.js";
11
+ export type Mode = "light" | "dark";
12
+ /**
13
+ * Semantic surface vars per mode (`--surface`, `--text`, …) layered on top of
14
+ * the raw colour scale. Single source of truth for the Live Preview, the
15
+ * showcase surface, and the baked `theme-tokens.css`.
16
+ */
17
+ export declare const SEMANTIC_VARS: Record<Mode, Record<string, string>>;
18
+ /**
19
+ * The full set of CSS custom properties for a config, plus the semantic
20
+ * surface vars resolved for the given light/dark mode. Mirrors `LivePreview`.
21
+ */
22
+ export declare function themeVars(config: DesignConfig, mode: Mode): CSSProperties;
23
+ /**
24
+ * Button stylesheet (`.tcb`), with every selector prefixed by `prefix`.
25
+ * Pass `".${scope} "` for a scoped instance (multiple themed surfaces on one
26
+ * page), or `""` for a global stylesheet (e.g. the baked `theme-tokens.css`
27
+ * shipped when a component is installed into another project). Hover / focus /
28
+ * active states are derived from `config.interactions`.
29
+ */
30
+ export declare function buttonRules(prefix: string, config: DesignConfig): string;
31
+ /**
32
+ * Scoped Button stylesheet — every selector prefixed by `.${scope}` so multiple
33
+ * themed surfaces can coexist on one page. Used by `<ThemedSurface>`.
34
+ */
35
+ export declare function buttonCss(scope: string, config: DesignConfig): string;
@@ -0,0 +1,76 @@
1
+ import { cssVarsToStyleObject, buttonHoverCss, activeCss, focusRingCss, } from "../../lib/tokens/index.js";
2
+ /**
3
+ * Semantic surface vars per mode (`--surface`, `--text`, …) layered on top of
4
+ * the raw colour scale. Single source of truth for the Live Preview, the
5
+ * showcase surface, and the baked `theme-tokens.css`.
6
+ */
7
+ export const SEMANTIC_VARS = {
8
+ light: {
9
+ "--surface": "var(--color-neutral-50)",
10
+ "--surface-2": "#ffffff",
11
+ "--text": "var(--color-neutral-900)",
12
+ "--text-muted": "var(--color-neutral-600)",
13
+ "--border-c": "var(--color-neutral-200)",
14
+ },
15
+ dark: {
16
+ "--surface": "var(--color-neutral-900)",
17
+ "--surface-2": "var(--color-neutral-800)",
18
+ "--text": "var(--color-neutral-50)",
19
+ "--text-muted": "var(--color-neutral-300)",
20
+ "--border-c": "var(--color-neutral-700)",
21
+ },
22
+ };
23
+ /**
24
+ * The full set of CSS custom properties for a config, plus the semantic
25
+ * surface vars resolved for the given light/dark mode. Mirrors `LivePreview`.
26
+ */
27
+ export function themeVars(config, mode) {
28
+ const vars = cssVarsToStyleObject(config);
29
+ Object.assign(vars, SEMANTIC_VARS[mode]);
30
+ return vars;
31
+ }
32
+ /**
33
+ * Button stylesheet (`.tcb`), with every selector prefixed by `prefix`.
34
+ * Pass `".${scope} "` for a scoped instance (multiple themed surfaces on one
35
+ * page), or `""` for a global stylesheet (e.g. the baked `theme-tokens.css`
36
+ * shipped when a component is installed into another project). Hover / focus /
37
+ * active states are derived from `config.interactions`.
38
+ */
39
+ export function buttonRules(prefix, config) {
40
+ const i = config.interactions;
41
+ const transition = "transition: all var(--duration) var(--easing);";
42
+ const focus = focusRingCss(i.focusRing);
43
+ const active = activeCss(i.pressFeedback);
44
+ const btnHover = (colorVar) => buttonHoverCss(i.hover, colorVar);
45
+ const ghostHover = i.hover === "darken"
46
+ ? "background: var(--color-primary-50);"
47
+ : buttonHoverCss(i.hover, "--color-primary");
48
+ const base = config.typography.baseSize;
49
+ return `
50
+ ${prefix}.tcb { font-family: var(--font-base); font-weight: 600; font-size: ${base - 1}px; padding: var(--space-2) var(--space-4); border-radius: var(--radius-md); border: var(--border-width) var(--border-style) transparent; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); line-height: 1.2; ${transition} }
51
+ ${prefix}.tcb:focus-visible { ${focus} }
52
+ ${prefix}.tcb:active { ${active} }
53
+ ${prefix}.tcb[disabled] { opacity: .5; pointer-events: none; }
54
+ ${prefix}.tcb--sm { padding: var(--space-1) var(--space-3); font-size: ${base - 3}px; }
55
+ ${prefix}.tcb--lg { padding: var(--space-3) var(--space-6); font-size: ${base + 1}px; }
56
+ ${prefix}.tcb--primary { background: var(--color-primary-600); color: #fff; }
57
+ ${prefix}.tcb--primary:hover { ${btnHover("--color-primary")} }
58
+ ${prefix}.tcb--secondary { background: var(--color-secondary-600); color: #fff; }
59
+ ${prefix}.tcb--secondary:hover { ${btnHover("--color-secondary")} }
60
+ ${prefix}.tcb--destructive { background: var(--color-error-600); color: #fff; }
61
+ ${prefix}.tcb--destructive:hover { ${btnHover("--color-error")} }
62
+ ${prefix}.tcb--ghost { background: transparent; color: var(--color-primary-700); }
63
+ ${prefix}.tcb--ghost:hover { ${ghostHover} }
64
+ ${prefix}.tcb--outline { background: transparent; color: var(--text); border-color: var(--border-c); }
65
+ ${prefix}.tcb--outline:hover { ${ghostHover} border-color: var(--color-primary-400); }
66
+ @media (prefers-reduced-motion: reduce) { ${prefix}.tcb { transition: none !important; } }
67
+ `;
68
+ }
69
+ /**
70
+ * Scoped Button stylesheet — every selector prefixed by `.${scope}` so multiple
71
+ * themed surfaces can coexist on one page. Used by `<ThemedSurface>`.
72
+ */
73
+ export function buttonCss(scope, config) {
74
+ return buttonRules(`.${scope} `, config);
75
+ }
76
+ //# sourceMappingURL=themeCss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themeCss.js","sourceRoot":"","sources":["../../../../../components/themed/themeCss.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAC;AAItB;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAyC;IACjE,KAAK,EAAE;QACL,WAAW,EAAE,yBAAyB;QACtC,aAAa,EAAE,SAAS;QACxB,QAAQ,EAAE,0BAA0B;QACpC,cAAc,EAAE,0BAA0B;QAC1C,YAAY,EAAE,0BAA0B;KACzC;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,0BAA0B;QACvC,aAAa,EAAE,0BAA0B;QACzC,QAAQ,EAAE,yBAAyB;QACnC,cAAc,EAAE,0BAA0B;QAC1C,YAAY,EAAE,0BAA0B;KACzC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,MAAoB,EAAE,IAAU;IACxD,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAA2B,CAAC;IACpE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,OAAO,IAAqB,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,MAAoB;IAC9D,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;IAC9B,MAAM,UAAU,GAAG,gDAAgD,CAAC;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,UAAU,GACd,CAAC,CAAC,KAAK,KAAK,QAAQ;QAClB,CAAC,CAAC,sCAAsC;QACxC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;IAExC,OAAO;EACP,MAAM,sEAAsE,IAAI,GAAG,CAAC,yQAAyQ,UAAU;EACvW,MAAM,wBAAwB,KAAK;EACnC,MAAM,iBAAiB,MAAM;EAC7B,MAAM;EACN,MAAM,iEAAiE,IAAI,GAAG,CAAC;EAC/E,MAAM,iEAAiE,IAAI,GAAG,CAAC;EAC/E,MAAM;EACN,MAAM,yBAAyB,QAAQ,CAAC,iBAAiB,CAAC;EAC1D,MAAM;EACN,MAAM,2BAA2B,QAAQ,CAAC,mBAAmB,CAAC;EAC9D,MAAM;EACN,MAAM,6BAA6B,QAAQ,CAAC,eAAe,CAAC;EAC5D,MAAM;EACN,MAAM,uBAAuB,UAAU;EACvC,MAAM;EACN,MAAM,yBAAyB,UAAU;4CACC,MAAM;CACjD,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAoB;IAC3D,OAAO,WAAW,CAAC,IAAI,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DesignConfig } from "./types.js";
2
+ /** The default design system shown when the app first loads. */
3
+ export declare const defaultConfig: DesignConfig;
4
+ /** Deep clone helper so callers never mutate the shared default object. */
5
+ export declare function cloneConfig(config: DesignConfig): DesignConfig;
@@ -0,0 +1,86 @@
1
+ /** The default design system shown when the app first loads. */
2
+ export const defaultConfig = {
3
+ meta: {
4
+ name: "Theme config System",
5
+ version: "1.0.0",
6
+ description: "A starter design system generated by Theme config System.",
7
+ targetStack: "react-tailwind",
8
+ componentLib: "none",
9
+ componentPackage: { install: false, name: "@vinhhypc/config-theme" },
10
+ },
11
+ theme: {
12
+ mode: "light",
13
+ style: "modern",
14
+ colors: {
15
+ primary: "#2563eb",
16
+ secondary: "#7c3aed",
17
+ accent: "#f59e0b",
18
+ neutral: "#64748b",
19
+ success: "#16a34a",
20
+ warning: "#d97706",
21
+ error: "#dc2626",
22
+ info: "#0ea5e9",
23
+ },
24
+ },
25
+ typography: {
26
+ fontFamilyBase: "'Inter', sans-serif",
27
+ fontFamilyHeading: "'Inter', sans-serif",
28
+ fontFamilyMono: "'JetBrains Mono', monospace",
29
+ baseSize: 16,
30
+ scaleRatio: 1.25,
31
+ weights: [400, 500, 600, 700],
32
+ lineHeight: 1.5,
33
+ },
34
+ spacing: {
35
+ baseUnit: 4,
36
+ scale: [0, 1, 2, 3, 4, 6, 8, 12, 16, 24],
37
+ },
38
+ radius: {
39
+ style: "rounded",
40
+ base: 8,
41
+ },
42
+ borders: {
43
+ width: 1,
44
+ style: "solid",
45
+ defaultColorToken: "neutral-200",
46
+ },
47
+ elevation: {
48
+ style: "soft",
49
+ levels: 4,
50
+ },
51
+ animation: {
52
+ enabled: true,
53
+ style: "smooth",
54
+ durationMs: 200,
55
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
56
+ },
57
+ interactions: {
58
+ hover: "darken",
59
+ pressFeedback: true,
60
+ focusRing: true,
61
+ underlineLinks: true,
62
+ },
63
+ components: {
64
+ button: {
65
+ variants: ["primary", "secondary", "ghost", "destructive"],
66
+ defaultSize: "md",
67
+ },
68
+ input: { variant: "outline" },
69
+ card: { variant: "elevated" },
70
+ badge: { enabled: true },
71
+ modal: { enabled: true },
72
+ table: { enabled: true },
73
+ },
74
+ aiRules: {
75
+ enforceTokensOnly: true,
76
+ namingConvention: "tailwind",
77
+ accessibility: "AA",
78
+ cleanCode: true,
79
+ customRules: [],
80
+ },
81
+ };
82
+ /** Deep clone helper so callers never mutate the shared default object. */
83
+ export function cloneConfig(config) {
84
+ return JSON.parse(JSON.stringify(config));
85
+ }
86
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../../../lib/config/defaults.ts"],"names":[],"mappings":"AAEA,gEAAgE;AAChE,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,gBAAgB;QAC7B,YAAY,EAAE,MAAM;QACpB,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE;KACrE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;SAChB;KACF;IACD,UAAU,EAAE;QACV,cAAc,EAAE,qBAAqB;QACrC,iBAAiB,EAAE,qBAAqB;QACxC,cAAc,EAAE,6BAA6B;QAC7C,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC7B,UAAU,EAAE,GAAG;KAChB;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;KACzC;IACD,MAAM,EAAE;QACN,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,CAAC;KACR;IACD,OAAO,EAAE;QACP,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,OAAO;QACd,iBAAiB,EAAE,aAAa;KACjC;IACD,SAAS,EAAE;QACT,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,CAAC;KACV;IACD,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,GAAG;QACf,MAAM,EAAE,8BAA8B;KACvC;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,QAAQ;QACf,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;KACrB;IACD,UAAU,EAAE;QACV,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC;YAC1D,WAAW,EAAE,IAAI;SAClB;QACD,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;QAC7B,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;QAC7B,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACxB,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACxB,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;KACzB;IACD,OAAO,EAAE;QACP,iBAAiB,EAAE,IAAI;QACvB,gBAAgB,EAAE,UAAU;QAC5B,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,EAAE;KAChB;CACF,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAiB,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { DesignConfig, ThemeStyle } from "./types.js";
2
+ /**
3
+ * Style presets fill the config quickly; the user can then fine-tune.
4
+ * Each preset is a deep-merge patch applied on top of `defaultConfig`.
5
+ */
6
+ export interface StylePreset {
7
+ id: ThemeStyle;
8
+ label: string;
9
+ description: string;
10
+ apply: (base: DesignConfig) => DesignConfig;
11
+ }
12
+ export declare const presets: StylePreset[];
13
+ export declare function applyPreset(id: ThemeStyle, base?: DesignConfig): DesignConfig;
@@ -0,0 +1,104 @@
1
+ import { cloneConfig, defaultConfig } from "./defaults.js";
2
+ function patch(base, fn) {
3
+ const next = cloneConfig(base);
4
+ fn(next);
5
+ return next;
6
+ }
7
+ export const presets = [
8
+ {
9
+ id: "modern",
10
+ label: "Hiện đại",
11
+ description: "Xanh dương/tím tươi, bóng mềm, chuyển động mượt, bo góc vừa.",
12
+ apply: (base) => patch(base, (c) => {
13
+ c.theme.style = "modern";
14
+ c.theme.colors.primary = "#2563eb";
15
+ c.theme.colors.secondary = "#7c3aed";
16
+ c.theme.colors.accent = "#f59e0b";
17
+ c.typography.fontFamilyBase = "'Inter', sans-serif";
18
+ c.typography.fontFamilyHeading = "'Inter', sans-serif";
19
+ c.radius = { style: "rounded", base: 8 };
20
+ c.elevation = { style: "soft", levels: 4 };
21
+ c.animation = { enabled: true, style: "smooth", durationMs: 200, easing: "cubic-bezier(0.4, 0, 0.2, 1)" };
22
+ c.interactions = { hover: "lift", pressFeedback: true, focusRing: true, underlineLinks: true };
23
+ }),
24
+ },
25
+ {
26
+ id: "classic",
27
+ label: "Cổ điển",
28
+ description: "Tiêu đề serif, xanh navy + vàng đồng, bo góc nhẹ, cạnh cứng.",
29
+ apply: (base) => patch(base, (c) => {
30
+ c.theme.style = "classic";
31
+ c.theme.colors.primary = "#1e3a8a";
32
+ c.theme.colors.secondary = "#334155";
33
+ c.theme.colors.accent = "#b45309";
34
+ c.typography.fontFamilyHeading = "'Times New Roman', serif";
35
+ c.typography.fontFamilyBase = "'Times New Roman', serif";
36
+ c.typography.scaleRatio = 1.2;
37
+ c.radius = { style: "rounded", base: 4 };
38
+ c.elevation = { style: "hard", levels: 3 };
39
+ c.animation = { enabled: true, style: "subtle", durationMs: 150, easing: "ease-in-out" };
40
+ c.interactions = { hover: "darken", pressFeedback: false, focusRing: true, underlineLinks: true };
41
+ }),
42
+ },
43
+ {
44
+ id: "minimal",
45
+ label: "Tối giản",
46
+ description: "Trung tính đơn sắc, bề mặt phẳng, góc vuông, gần như không chuyển động.",
47
+ apply: (base) => patch(base, (c) => {
48
+ c.theme.style = "minimal";
49
+ c.theme.colors.primary = "#111827";
50
+ c.theme.colors.secondary = "#374151";
51
+ c.theme.colors.accent = "#6b7280";
52
+ c.typography.fontFamilyBase = "'Inter', sans-serif";
53
+ c.typography.scaleRatio = 1.2;
54
+ c.radius = { style: "sharp", base: 2 };
55
+ c.elevation = { style: "flat", levels: 2 };
56
+ c.borders = { width: 1, style: "solid", defaultColorToken: "neutral-200" };
57
+ c.animation = { enabled: true, style: "subtle", durationMs: 120, easing: "ease-out" };
58
+ c.interactions = { hover: "darken", pressFeedback: false, focusRing: true, underlineLinks: false };
59
+ }),
60
+ },
61
+ {
62
+ id: "playful",
63
+ label: "Vui nhộn",
64
+ description: "Hồng/xanh ngọc tươi sáng, bo viên thuốc, chuyển động nảy, bo tròn mọi thứ.",
65
+ apply: (base) => patch(base, (c) => {
66
+ c.theme.style = "playful";
67
+ c.theme.colors.primary = "#ec4899";
68
+ c.theme.colors.secondary = "#14b8a6";
69
+ c.theme.colors.accent = "#facc15";
70
+ c.typography.fontFamilyHeading = "'Plus Jakarta Sans', sans-serif";
71
+ c.typography.fontFamilyBase = "'Plus Jakarta Sans', sans-serif";
72
+ c.typography.scaleRatio = 1.333;
73
+ c.radius = { style: "pill", base: 16 };
74
+ c.elevation = { style: "soft", levels: 5 };
75
+ c.animation = { enabled: true, style: "bouncy", durationMs: 300, easing: "cubic-bezier(0.34, 1.56, 0.64, 1)" };
76
+ c.interactions = { hover: "scale", pressFeedback: true, focusRing: true, underlineLinks: true };
77
+ }),
78
+ },
79
+ {
80
+ id: "brutalist",
81
+ label: "Brutalist",
82
+ description: "Đen/trắng tương phản cao, viền dày, không bo góc, bóng cứng.",
83
+ apply: (base) => patch(base, (c) => {
84
+ c.theme.style = "brutalist";
85
+ c.theme.colors.primary = "#000000";
86
+ c.theme.colors.secondary = "#ffffff";
87
+ c.theme.colors.accent = "#ff3b3b";
88
+ c.theme.colors.neutral = "#1a1a1a";
89
+ c.typography.fontFamilyBase = "'Barlow', sans-serif";
90
+ c.typography.fontFamilyHeading = "'Barlow', sans-serif";
91
+ c.typography.scaleRatio = 1.414;
92
+ c.radius = { style: "sharp", base: 0 };
93
+ c.elevation = { style: "hard", levels: 3 };
94
+ c.borders = { width: 3, style: "solid", defaultColorToken: "neutral-900" };
95
+ c.animation = { enabled: false, style: "none", durationMs: 0, easing: "linear" };
96
+ c.interactions = { hover: "none", pressFeedback: false, focusRing: true, underlineLinks: true };
97
+ }),
98
+ },
99
+ ];
100
+ export function applyPreset(id, base = defaultConfig) {
101
+ const preset = presets.find((p) => p.id === id);
102
+ return preset ? preset.apply(base) : cloneConfig(base);
103
+ }
104
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../../lib/config/presets.ts"],"names":[],"mappings":"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"}