@vestow/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.
@@ -0,0 +1,274 @@
1
+ /* =============================================================================
2
+ Lớp văn xuôi `.typeset` — CSS THUẦN, điều khiển hoàn toàn bằng biến.
3
+
4
+ <article class="typeset">…</article>
5
+
6
+ Bảy biến dưới đây là toàn bộ API. Đặt lại chúng ở BẤT KỲ phần tử cha nào là
7
+ đổi được diện mạo của cả khối chữ mà không sửa một dòng markup:
8
+
9
+ .typeset-compact { --typeset-size: 13px; --typeset-flow: 1em; }
10
+
11
+ Đó đúng cơ chế của nhóm `--ui-control-*` / `--ui-field-*` trong tokens.css,
12
+ và nó qua cùng một tiêu chí kết nạp: có thứ BÊN NGOÀI khối chữ phải với vào
13
+ trong nó — trang /typeset, và về sau là từng trang docs muốn nhịp riêng.
14
+
15
+ VÌ SAO CẦN: năm trang của `apps/kit` — Addons, Components, Guides, Resources,
16
+ Tokens — đang chép nguyên văn cùng hai chuỗi class (`max-w-[75ch] text-pretty
17
+ text-[14.5px] leading-[1.7]` và hằng HEADING_2), kèm chép luôn cả đoạn chú
18
+ thích giải thích chúng. Đúng khuôn "13 file chép cùng một chuỗi class rồi
19
+ trôi khỏi nhau" mà `lib/focus.ts` sinh ra để dập.
20
+
21
+ KHÔNG có màu literal nào ở đây: mọi màu đều đọc token ngữ nghĩa, nên lớp này
22
+ tự đúng theo bảng màu và theo sáng/tối mà không khai lại gì.
23
+ ========================================================================== */
24
+
25
+ :root {
26
+ /* Ba họ chữ. Mặc định trỏ vào token font của hệ, nên nạp lớp này vào mà không
27
+ đặt gì thêm thì diện mạo không đổi một chút nào. */
28
+ /* Rơi lui về token TOÀN CỤC chứ không về `--font-sans`: chọn họ chữ tiêu đề
29
+ ở trục chung thì khối văn xuôi phải đi theo, còn muốn khác thì đặt lại
30
+ đúng biến này ở phạm vi hẹp hơn. */
31
+ --typeset-font-heading: var(--font-heading);
32
+ --typeset-font-body: var(--font-sans);
33
+ --typeset-font-mono: var(--font-mono);
34
+
35
+ /* Cỡ chữ thân bài. 14.5px là con số năm trang docs đang dùng. */
36
+ --typeset-size: 14.5px;
37
+
38
+ /* Giãn dòng của thân bài. Tiêu đề có nhịp riêng — xem ghi chú dưới. */
39
+ --typeset-leading: 1.7;
40
+
41
+ /* Khoảng cách giữa hai khối liền nhau. Đơn vị `em` chứ không px: nó ăn theo
42
+ cỡ chữ của CHÍNH khối đó, nên đổi `--typeset-size` là nhịp dọc tự theo. */
43
+ --typeset-flow: 1.25em;
44
+
45
+ /* Bề rộng tối đa của một DÒNG CHỮ, không phải của cột.
46
+
47
+ Ranh giới này là quyết định đã có sẵn trong repo, chép nguyên ý: cột nội
48
+ dung lấp trọn track của lưới nên bảng, khối code và ảnh chạm được tới mép —
49
+ nhưng một dòng chữ dài 240 ký tự ở màn 2560px thì mắt mất dấu khi xuống
50
+ dòng. Hai nhu cầu khác nhau nên hai giới hạn khác nhau.
51
+
52
+ `ch` NẰM ĐƯỢC trong một custom property, và nó tính ở phần tử DÙNG chứ
53
+ không ở phần tử khai. Đã đo để chắc, vì trực giác nói ngược: dựng ba khối
54
+ 14.5 / 16 / 24px rồi so `width: 75ch` với `width: var(--x)` (khai `75ch` ở
55
+ `:root`) — ba cặp trùng khít 721 / 795,59 / 1193,39px.
56
+
57
+ Nhờ vậy đoạn mở đầu 16px và đoạn thân bài 14.5px cùng ra khoảng 75 ký tự mà
58
+ chỉ phải khai một con số. */
59
+ --typeset-measure: 75ch;
60
+ }
61
+
62
+ .typeset {
63
+ font-family: var(--typeset-font-body);
64
+ font-size: var(--typeset-size);
65
+ line-height: var(--typeset-leading);
66
+ color: var(--foreground);
67
+
68
+ /* Cân lại chỗ ngắt dòng để không còn dòng cuối trơ một chữ. */
69
+ text-wrap: pretty;
70
+ }
71
+
72
+ /* --- Nhịp dọc -------------------------------------------------------------
73
+ Một luật duy nhất, đặt trên phần tử SAU. Không dùng `margin-bottom` cho từng
74
+ thẻ: hai lề kề nhau sẽ chồng (margin collapsing) và khoảng cách thật hoá ra
75
+ phụ thuộc thẻ nào đứng cạnh thẻ nào — đúng thứ đang muốn bỏ. */
76
+
77
+ .typeset > * + * {
78
+ margin-block-start: var(--typeset-flow);
79
+ }
80
+
81
+ /* --- Bề rộng dòng ---------------------------------------------------------
82
+ Chỉ chặn khối MANG CHỮ. `pre`, `table`, `figure`, `img` cố ý đứng ngoài. */
83
+
84
+ .typeset > p,
85
+ .typeset > ul,
86
+ .typeset > ol,
87
+ .typeset > dl,
88
+ .typeset > blockquote,
89
+ .typeset > h1,
90
+ .typeset > h2,
91
+ .typeset > h3,
92
+ .typeset > h4 {
93
+ max-inline-size: var(--typeset-measure);
94
+ }
95
+
96
+ /* --- Tiêu đề --------------------------------------------------------------
97
+ Cỡ khai bằng `em` nên cả thang tự co giãn theo `--typeset-size`.
98
+
99
+ Giãn dòng thì KHÔNG đọc thẳng `--typeset-leading`: ở 1.9 thì một tiêu đề hai
100
+ dòng sẽ rời hẳn ra thành hai câu không dính nhau. Nó đọc theo một PHẦN của
101
+ phần vượt trên 1 — `--typeset-leading: 1.7` cho ra 1.196 ở h1 — nên vặn nút
102
+ giãn dòng vẫn thấy tiêu đề nhúc nhích, mà không bao giờ nhúc nhích quá tay. */
103
+
104
+ .typeset h1,
105
+ .typeset h2,
106
+ .typeset h3,
107
+ .typeset h4 {
108
+ font-family: var(--typeset-font-heading);
109
+ font-weight: 600;
110
+ letter-spacing: -0.02em;
111
+ text-wrap: balance;
112
+
113
+ /* Tiêu đề thuộc về phần chữ ngay DƯỚI nó, nên khoảng trên phải rộng hơn
114
+ khoảng dưới. Đây là lý do lề trên nhân lên chứ không dùng flow trần. */
115
+ margin-block-start: calc(var(--typeset-flow) * 1.9);
116
+ }
117
+
118
+ .typeset h1 {
119
+ font-size: 2.1em;
120
+ line-height: calc(1 + (var(--typeset-leading) - 1) * 0.28);
121
+ letter-spacing: -0.032em;
122
+ }
123
+
124
+ .typeset h2 {
125
+ font-size: 1.5em;
126
+ line-height: calc(1 + (var(--typeset-leading) - 1) * 0.36);
127
+ letter-spacing: -0.026em;
128
+ }
129
+
130
+ .typeset h3 {
131
+ font-size: 1.18em;
132
+ line-height: calc(1 + (var(--typeset-leading) - 1) * 0.48);
133
+ }
134
+
135
+ .typeset h4 {
136
+ font-size: 1em;
137
+ line-height: calc(1 + (var(--typeset-leading) - 1) * 0.6);
138
+ }
139
+
140
+ /* Khối đầu tiên không có gì ở trên để mà cách ra. */
141
+ .typeset > :first-child {
142
+ margin-block-start: 0;
143
+ }
144
+
145
+ /* --- Danh sách ----------------------------------------------------------- */
146
+
147
+ .typeset ul,
148
+ .typeset ol {
149
+ padding-inline-start: 1.4em;
150
+ }
151
+
152
+ .typeset ul {
153
+ list-style: disc;
154
+ }
155
+
156
+ .typeset ol {
157
+ list-style: decimal;
158
+ }
159
+
160
+ .typeset li::marker {
161
+ color: var(--muted-foreground);
162
+ }
163
+
164
+ /* Mục trong cùng một danh sách đứng gần nhau hơn hai đoạn văn: chúng là một ý
165
+ bị bẻ nhỏ, không phải mấy ý rời nhau. */
166
+ .typeset li + li,
167
+ .typeset li > ul,
168
+ .typeset li > ol {
169
+ margin-block-start: calc(var(--typeset-flow) * 0.35);
170
+ }
171
+
172
+ /* --- Code ---------------------------------------------------------------- */
173
+
174
+ .typeset code {
175
+ font-family: var(--typeset-font-mono);
176
+
177
+ /* `0.88em` chứ không px: chữ mono ở cùng cỡ với chữ thường luôn trông to hơn
178
+ vì nó rộng bản. Hệ số ăn theo cỡ của đoạn chứa nó. */
179
+ font-size: 0.88em;
180
+ background: var(--code-bg);
181
+ color: var(--code-fg);
182
+ border-radius: var(--radius-sm);
183
+ padding: 0.12em 0.36em;
184
+ }
185
+
186
+ .typeset pre {
187
+ font-family: var(--typeset-font-mono);
188
+ font-size: 0.88em;
189
+ line-height: 1.7;
190
+ background: var(--code-bg);
191
+ color: var(--code-fg);
192
+ border-radius: var(--radius-md);
193
+ padding: 1em 1.15em;
194
+
195
+ /* Khối code KHÔNG bị chặn theo `--typeset-measure`, nên nó phải tự cuộn
196
+ ngang — nếu không một dòng code dài sẽ đẩy cả trang trượt theo. */
197
+ overflow-x: auto;
198
+ }
199
+
200
+ /* `code` lồng trong `pre` bỏ hết trang trí của bản inline: nền và padding đã là
201
+ việc của `pre`, để cả hai là ra một cái hộp nằm trong một cái hộp. */
202
+ .typeset pre code {
203
+ background: none;
204
+ border-radius: 0;
205
+ padding: 0;
206
+ font-size: inherit;
207
+ }
208
+
209
+ /* --- Trích dẫn, đường kẻ, liên kết ---------------------------------------- */
210
+
211
+ .typeset blockquote {
212
+ border-inline-start: 2px solid var(--border);
213
+ padding-inline-start: 1.1em;
214
+ color: var(--muted-foreground);
215
+ font-style: italic;
216
+ }
217
+
218
+ .typeset hr {
219
+ border: 0;
220
+ border-block-start: 1px solid var(--border);
221
+ margin-block: calc(var(--typeset-flow) * 2);
222
+ }
223
+
224
+ .typeset a {
225
+ color: var(--primary);
226
+ text-decoration: underline;
227
+
228
+ /* Gạch chân cách chữ ra một chút để không cắt qua phần đuôi của g, y, và
229
+ không đè lên dấu nặng của ạ, ợ — dấu tiếng Việt nằm đúng vùng đó. */
230
+ text-underline-offset: 3px;
231
+ text-decoration-thickness: 1px;
232
+ }
233
+
234
+ /* --- Bảng ---------------------------------------------------------------- */
235
+
236
+ .typeset table {
237
+ width: 100%;
238
+ border-collapse: collapse;
239
+ font-size: 0.94em;
240
+ }
241
+
242
+ .typeset th,
243
+ .typeset td {
244
+ text-align: start;
245
+ padding: 0.55em 0.8em;
246
+ border-block-end: 1px solid var(--border);
247
+ }
248
+
249
+ .typeset th {
250
+ font-weight: 600;
251
+ color: var(--muted-foreground);
252
+ font-size: 0.92em;
253
+ letter-spacing: 0.01em;
254
+ text-transform: uppercase;
255
+ }
256
+
257
+ /* --- Ảnh ----------------------------------------------------------------- */
258
+
259
+ .typeset img {
260
+ max-inline-size: 100%;
261
+ height: auto;
262
+ border-radius: var(--radius-md);
263
+ }
264
+
265
+ /* --- Chữ phụ ------------------------------------------------------------- */
266
+
267
+ .typeset strong {
268
+ font-weight: 600;
269
+ }
270
+
271
+ .typeset small {
272
+ font-size: 0.86em;
273
+ color: var(--muted-foreground);
274
+ }
@@ -0,0 +1,56 @@
1
+ import type { BaseId, ChartId, ColorMode, MenuAccentId, MenuAppearanceId, MenuColorId, PaletteId, StyleId, SurfaceId, ThemeState } from './registry.js';
2
+ /**
3
+ * Theme controller thuần TypeScript — không Vue, không React, không Angular.
4
+ *
5
+ * Toàn bộ phần "khó mà dễ sai" của chín trục giao diện nằm ở đây: đọc localStorage,
6
+ * theo dõi `prefers-color-scheme`, ghi class/thuộc tính lên `<html>`. Vỏ bọc cho
7
+ * từng framework chỉ còn việc nối `subscribe()` vào hệ reactivity của nó.
8
+ *
9
+ * Đó là điều kiện để cây vue / cây react / woodblock-angular sau này không lệch
10
+ * nhau: nếu mỗi bên tự viết lại, chỉ cần một bên quên `colorScheme` hay đặt sai
11
+ * khoá localStorage là người dùng đổi framework sẽ mất lựa chọn đã lưu.
12
+ *
13
+ * KHÔNG chạm `document` ở tầng module: package phải import được trong SSR
14
+ * (Nuxt, Next). Mọi thứ đụng DOM chỉ xảy ra bên trong `init()`.
15
+ *
16
+ * Ghi chú về đuôi `.js` trong import ở trên: TypeScript giữ nguyên specifier khi
17
+ * emit, nên viết `./registry` sẽ ra file ESM mà Node không resolve được. Đây là
18
+ * package có build ra `dist`, khác với `packages/ui` (ship thẳng source).
19
+ */
20
+ export interface ThemeController {
21
+ /** Ảnh chụp trạng thái hiện tại. Không reactive — dùng `subscribe`. */
22
+ getState: () => ThemeState;
23
+ /**
24
+ * Đăng ký lắng nghe. Gọi ngay một lần với trạng thái hiện tại, nên vỏ bọc
25
+ * framework không cần đọc riêng lúc khởi tạo. Trả về hàm huỷ đăng ký.
26
+ */
27
+ subscribe: (listener: (state: ThemeState) => void) => () => void;
28
+ /**
29
+ * Đọc localStorage, áp lên `<html>`, bắt đầu theo dõi `prefers-color-scheme`.
30
+ * Gọi bao nhiêu lần cũng được — lần thứ hai trở đi không làm gì thêm.
31
+ * Trả về hàm dọn dẹp (chỉ có tác dụng ở lần gọi đầu).
32
+ */
33
+ init: () => () => void;
34
+ setColorMode: (value: ColorMode) => void;
35
+ /** Đảo sáng/tối theo cái đang THẤY, nên từ `system` cũng đảo được. */
36
+ toggleColorMode: () => void;
37
+ setPalette: (value: PaletteId) => void;
38
+ setSurface: (value: SurfaceId) => void;
39
+ setStyle: (value: StyleId) => void;
40
+ setChart: (value: ChartId) => void;
41
+ setBase: (value: BaseId) => void;
42
+ setMenuAccent: (value: MenuAccentId) => void;
43
+ setMenuColor: (value: MenuColorId) => void;
44
+ setMenuAppearance: (value: MenuAppearanceId) => void;
45
+ }
46
+ export declare function createThemeController(): ThemeController;
47
+ /**
48
+ * Instance dùng chung cho cả app.
49
+ *
50
+ * Ba trục giao diện là trạng thái của `<html>`, tức là singleton theo đúng
51
+ * nghĩa — hai controller song song sẽ ghi đè lẫn nhau và cái nào ghi sau thì
52
+ * thắng. Mọi vỏ bọc framework nên dùng đúng instance này; `createThemeController`
53
+ * để dành cho test hoặc cho trường hợp nhúng nhiều app vào một trang.
54
+ */
55
+ export declare const themeController: ThemeController;
56
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,OAAO,EACP,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,OAAO,EACP,SAAS,EACT,UAAU,EACX,MAAM,eAAe,CAAA;AAgBtB;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,QAAQ,EAAE,MAAM,UAAU,CAAA;IAC1B;;;OAGG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IAChE;;;;OAIG;IACH,IAAI,EAAE,MAAM,MAAM,IAAI,CAAA;IACtB,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACxC,sEAAsE;IACtE,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACtC,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IAC5C,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;IAC1C,iBAAiB,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;CACrD;AAyBD,wBAAgB,qBAAqB,IAAI,eAAe,CAwQvD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,eAAyC,CAAA"}
@@ -0,0 +1,256 @@
1
+ import { defaults, domTargets, isBaseId, isChartId, isColorMode, isMenuAccentId, isMenuAppearanceId, isMenuColorId, isPaletteId, isStyleId, isSurfaceId, storageKeys, } from './registry.js';
2
+ function noop() { }
3
+ function readStored(key, guard, fallback) {
4
+ try {
5
+ const raw = localStorage.getItem(key);
6
+ if (raw !== null && guard(raw))
7
+ return raw;
8
+ }
9
+ catch {
10
+ // localStorage có thể bị chặn (private mode, policy) -> dùng mặc định.
11
+ }
12
+ return fallback;
13
+ }
14
+ function writeStored(key, value) {
15
+ try {
16
+ localStorage.setItem(key, value);
17
+ }
18
+ catch {
19
+ // Không lưu được thì chỉ mất lựa chọn sau khi tải lại trang.
20
+ }
21
+ }
22
+ export function createThemeController() {
23
+ let colorMode = defaults.colorMode;
24
+ let palette = defaults.palette;
25
+ let surface = defaults.surface;
26
+ let style = defaults.style;
27
+ let chart = defaults.chart;
28
+ let base = defaults.base;
29
+ let menuAccent = defaults.menuAccent;
30
+ let menuColor = defaults.menuColor;
31
+ let menuAppearance = defaults.menuAppearance;
32
+ let systemPrefersDark = false;
33
+ let started = false;
34
+ const listeners = new Set();
35
+ const isDark = () => colorMode === 'system' ? systemPrefersDark : colorMode === 'dark';
36
+ const getState = () => ({
37
+ colorMode,
38
+ palette,
39
+ surface,
40
+ style,
41
+ chart,
42
+ base,
43
+ menuAccent,
44
+ menuColor,
45
+ menuAppearance,
46
+ isDark: isDark(),
47
+ });
48
+ function notify() {
49
+ const state = getState();
50
+ for (const listener of listeners)
51
+ listener(state);
52
+ }
53
+ /** Ghi cả chín trục lên `<html>`. Gọi lại được, không cộng dồn gì. */
54
+ function applyToDocument() {
55
+ if (typeof document === 'undefined')
56
+ return;
57
+ const root = document.documentElement;
58
+ const dark = isDark();
59
+ root.classList.toggle(domTargets.darkClass, dark);
60
+ // `color-scheme` để trình duyệt tự đổi màu scrollbar và control mặc định.
61
+ // Thiếu nó thì ô nhập ngày, dropdown gốc vẫn trắng giữa theme tối.
62
+ root.style.colorScheme = dark ? 'dark' : 'light';
63
+ // Giá trị mặc định không có khối CSS nào -> gỡ thuộc tính thay vì ghi vào.
64
+ if (palette === defaults.palette)
65
+ root.removeAttribute(domTargets.paletteAttribute);
66
+ else
67
+ root.setAttribute(domTargets.paletteAttribute, palette);
68
+ if (surface === defaults.surface)
69
+ root.removeAttribute(domTargets.surfaceAttribute);
70
+ else
71
+ root.setAttribute(domTargets.surfaceAttribute, surface);
72
+ if (style === defaults.style)
73
+ root.removeAttribute(domTargets.styleAttribute);
74
+ else
75
+ root.setAttribute(domTargets.styleAttribute, style);
76
+ // `theme` nghĩa là "để bảng màu quyết định", nên nó GỠ thuộc tính — giống
77
+ // hệt ba trục trên, chỉ khác là ở đây giá trị mặc định có tên riêng thay vì
78
+ // trùng tên một bộ.
79
+ if (chart === defaults.chart)
80
+ root.removeAttribute(domTargets.chartAttribute);
81
+ else
82
+ root.setAttribute(domTargets.chartAttribute, chart);
83
+ if (base === defaults.base)
84
+ root.removeAttribute(domTargets.baseAttribute);
85
+ else
86
+ root.setAttribute(domTargets.baseAttribute, base);
87
+ if (menuAccent === defaults.menuAccent)
88
+ root.removeAttribute(domTargets.menuAccentAttribute);
89
+ else
90
+ root.setAttribute(domTargets.menuAccentAttribute, menuAccent);
91
+ if (menuColor === defaults.menuColor)
92
+ root.removeAttribute(domTargets.menuColorAttribute);
93
+ else
94
+ root.setAttribute(domTargets.menuColorAttribute, menuColor);
95
+ if (menuAppearance === defaults.menuAppearance)
96
+ root.removeAttribute(domTargets.menuAppearanceAttribute);
97
+ else
98
+ root.setAttribute(domTargets.menuAppearanceAttribute, menuAppearance);
99
+ }
100
+ /** Đọc lại cả chín trục từ localStorage vào biến trong closure. */
101
+ function readStoredState() {
102
+ colorMode = readStored(storageKeys.colorMode, isColorMode, defaults.colorMode);
103
+ palette = readStored(storageKeys.palette, isPaletteId, defaults.palette);
104
+ surface = readStored(storageKeys.surface, isSurfaceId, defaults.surface);
105
+ style = readStored(storageKeys.style, isStyleId, defaults.style);
106
+ chart = readStored(storageKeys.chart, isChartId, defaults.chart);
107
+ base = readStored(storageKeys.base, isBaseId, defaults.base);
108
+ menuAccent = readStored(storageKeys.menuAccent, isMenuAccentId, defaults.menuAccent);
109
+ menuColor = readStored(storageKeys.menuColor, isMenuColorId, defaults.menuColor);
110
+ menuAppearance = readStored(storageKeys.menuAppearance, isMenuAppearanceId, defaults.menuAppearance);
111
+ }
112
+ function init() {
113
+ if (started || typeof window === 'undefined')
114
+ return noop;
115
+ started = true;
116
+ readStoredState();
117
+ const query = window.matchMedia('(prefers-color-scheme: dark)');
118
+ systemPrefersDark = query.matches;
119
+ const onSystemChange = (event) => {
120
+ systemPrefersDark = event.matches;
121
+ // Chỉ ảnh hưởng khi đang ở `system`, nhưng cứ áp lại cho gọn — hàm này
122
+ // idempotent nên không tốn gì.
123
+ applyToDocument();
124
+ notify();
125
+ };
126
+ query.addEventListener('change', onSystemChange);
127
+ /**
128
+ * Đồng bộ giữa các document CÙNG ORIGIN: tab thứ hai của app, và iframe
129
+ * xem trước của trang Blocks.
130
+ *
131
+ * `storage` chỉ phát ở document KHÁC document vừa ghi, nên không có vòng
132
+ * lặp — bên ghi đã tự áp rồi trong `setColorMode`/`setPalette`/`setSurface`/
133
+ * `setStyle`.
134
+ *
135
+ * `event.key === null` nghĩa là `localStorage.clear()`, khi đó đọc lại cả
136
+ * chín. KHÔNG so `event.storageArea` với `localStorage`: chỉ riêng việc chạm
137
+ * vào `localStorage` đã ném lỗi ở môi trường chặn cookie, mà so tên khoá
138
+ * thì đủ — chín khoá này không đụng ai.
139
+ */
140
+ const onStorage = (event) => {
141
+ const watched = [
142
+ storageKeys.colorMode,
143
+ storageKeys.palette,
144
+ storageKeys.surface,
145
+ storageKeys.style,
146
+ storageKeys.chart,
147
+ storageKeys.base,
148
+ storageKeys.menuAccent,
149
+ storageKeys.menuColor,
150
+ storageKeys.menuAppearance,
151
+ ];
152
+ if (event.key !== null && !watched.includes(event.key))
153
+ return;
154
+ readStoredState();
155
+ applyToDocument();
156
+ notify();
157
+ };
158
+ window.addEventListener('storage', onStorage);
159
+ applyToDocument();
160
+ notify();
161
+ return () => {
162
+ query.removeEventListener('change', onSystemChange);
163
+ window.removeEventListener('storage', onStorage);
164
+ started = false;
165
+ };
166
+ }
167
+ function setColorMode(value) {
168
+ colorMode = value;
169
+ writeStored(storageKeys.colorMode, value);
170
+ applyToDocument();
171
+ notify();
172
+ }
173
+ function setPalette(value) {
174
+ palette = value;
175
+ writeStored(storageKeys.palette, value);
176
+ applyToDocument();
177
+ notify();
178
+ }
179
+ function setSurface(value) {
180
+ surface = value;
181
+ writeStored(storageKeys.surface, value);
182
+ applyToDocument();
183
+ notify();
184
+ }
185
+ function setStyle(value) {
186
+ style = value;
187
+ writeStored(storageKeys.style, value);
188
+ applyToDocument();
189
+ notify();
190
+ }
191
+ function setChart(value) {
192
+ chart = value;
193
+ writeStored(storageKeys.chart, value);
194
+ applyToDocument();
195
+ notify();
196
+ }
197
+ function setBase(value) {
198
+ base = value;
199
+ writeStored(storageKeys.base, value);
200
+ applyToDocument();
201
+ notify();
202
+ }
203
+ function setMenuAccent(value) {
204
+ menuAccent = value;
205
+ writeStored(storageKeys.menuAccent, value);
206
+ applyToDocument();
207
+ notify();
208
+ }
209
+ function setMenuColor(value) {
210
+ menuColor = value;
211
+ writeStored(storageKeys.menuColor, value);
212
+ applyToDocument();
213
+ notify();
214
+ }
215
+ function setMenuAppearance(value) {
216
+ menuAppearance = value;
217
+ writeStored(storageKeys.menuAppearance, value);
218
+ applyToDocument();
219
+ notify();
220
+ }
221
+ function toggleColorMode() {
222
+ setColorMode(isDark() ? 'light' : 'dark');
223
+ }
224
+ function subscribe(listener) {
225
+ listeners.add(listener);
226
+ listener(getState());
227
+ return () => {
228
+ listeners.delete(listener);
229
+ };
230
+ }
231
+ return {
232
+ getState,
233
+ subscribe,
234
+ init,
235
+ setColorMode,
236
+ toggleColorMode,
237
+ setPalette,
238
+ setSurface,
239
+ setStyle,
240
+ setChart,
241
+ setBase,
242
+ setMenuAccent,
243
+ setMenuColor,
244
+ setMenuAppearance,
245
+ };
246
+ }
247
+ /**
248
+ * Instance dùng chung cho cả app.
249
+ *
250
+ * Ba trục giao diện là trạng thái của `<html>`, tức là singleton theo đúng
251
+ * nghĩa — hai controller song song sẽ ghi đè lẫn nhau và cái nào ghi sau thì
252
+ * thắng. Mọi vỏ bọc framework nên dùng đúng instance này; `createThemeController`
253
+ * để dành cho test hoặc cho trường hợp nhúng nhiều app vào một trang.
254
+ */
255
+ export const themeController = createThemeController();
256
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAA;AAgDtB,SAAS,IAAI,KAAU,CAAC;AAExB,SAAS,UAAU,CAAI,GAAW,EAAE,KAAqC,EAAE,QAAW;IACpF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACrC,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC;YAC5B,OAAO,GAAG,CAAA;IACd,CAAC;IACD,MAAM,CAAC;QACL,uEAAuE;IACzE,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,KAAa;IAC7C,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAClC,CAAC;IACD,MAAM,CAAC;QACL,6DAA6D;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,SAAS,GAAc,QAAQ,CAAC,SAAS,CAAA;IAC7C,IAAI,OAAO,GAAc,QAAQ,CAAC,OAAO,CAAA;IACzC,IAAI,OAAO,GAAc,QAAQ,CAAC,OAAO,CAAA;IACzC,IAAI,KAAK,GAAY,QAAQ,CAAC,KAAK,CAAA;IACnC,IAAI,KAAK,GAAY,QAAQ,CAAC,KAAK,CAAA;IACnC,IAAI,IAAI,GAAW,QAAQ,CAAC,IAAI,CAAA;IAChC,IAAI,UAAU,GAAiB,QAAQ,CAAC,UAAU,CAAA;IAClD,IAAI,SAAS,GAAgB,QAAQ,CAAC,SAAS,CAAA;IAC/C,IAAI,cAAc,GAAqB,QAAQ,CAAC,cAAc,CAAA;IAC9D,IAAI,iBAAiB,GAAG,KAAK,CAAA;IAC7B,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAA;IAExD,MAAM,MAAM,GAAG,GAAY,EAAE,CAC3B,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAA;IAEnE,MAAM,QAAQ,GAAG,GAAe,EAAE,CAAC,CAAC;QAClC,SAAS;QACT,OAAO;QACP,OAAO;QACP,KAAK;QACL,KAAK;QACL,IAAI;QACJ,UAAU;QACV,SAAS;QACT,cAAc;QACd,MAAM,EAAE,MAAM,EAAE;KACjB,CAAC,CAAA;IAEF,SAAS,MAAM;QACb,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;QACxB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAC9B,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,sEAAsE;IACtE,SAAS,eAAe;QACtB,IAAI,OAAO,QAAQ,KAAK,WAAW;YACjC,OAAM;QAER,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAA;QACrC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;QAErB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACjD,0EAA0E;QAC1E,mEAAmE;QACnE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;QAEhD,2EAA2E;QAC3E,IAAI,OAAO,KAAK,QAAQ,CAAC,OAAO;YAC9B,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;;YAEjD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QAEzD,IAAI,OAAO,KAAK,QAAQ,CAAC,OAAO;YAC9B,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;;YAEjD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QAEzD,IAAI,KAAK,KAAK,QAAQ,CAAC,KAAK;YAC1B,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;;YAE/C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAErD,0EAA0E;QAC1E,4EAA4E;QAC5E,oBAAoB;QACpB,IAAI,KAAK,KAAK,QAAQ,CAAC,KAAK;YAC1B,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;;YAE/C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAErD,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI;YACxB,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;;YAE9C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAEnD,IAAI,UAAU,KAAK,QAAQ,CAAC,UAAU;YACpC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;;YAEpD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAA;QAE/D,IAAI,SAAS,KAAK,QAAQ,CAAC,SAAS;YAClC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAA;;YAEnD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAA;QAE7D,IAAI,cAAc,KAAK,QAAQ,CAAC,cAAc;YAC5C,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAA;;YAExD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAA;IACzE,CAAC;IAED,mEAAmE;IACnE,SAAS,eAAe;QACtB,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;QAC9E,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxE,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxE,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChE,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChE,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5D,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;QACpF,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;QAChF,cAAc,GAAG,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IACtG,CAAC;IAED,SAAS,IAAI;QACX,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,WAAW;YAC1C,OAAO,IAAI,CAAA;QAEb,OAAO,GAAG,IAAI,CAAA;QAEd,eAAe,EAAE,CAAA;QAEjB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAA;QAC/D,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAA;QAEjC,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAQ,EAAE;YAC1D,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAA;YACjC,uEAAuE;YACvE,+BAA+B;YAC/B,eAAe,EAAE,CAAA;YACjB,MAAM,EAAE,CAAA;QACV,CAAC,CAAA;QAED,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;QAEhD;;;;;;;;;;;;WAYG;QACH,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC9C,MAAM,OAAO,GAAa;gBACxB,WAAW,CAAC,SAAS;gBACrB,WAAW,CAAC,OAAO;gBACnB,WAAW,CAAC,OAAO;gBACnB,WAAW,CAAC,KAAK;gBACjB,WAAW,CAAC,KAAK;gBACjB,WAAW,CAAC,IAAI;gBAChB,WAAW,CAAC,UAAU;gBACtB,WAAW,CAAC,SAAS;gBACrB,WAAW,CAAC,cAAc;aAC3B,CAAA;YACD,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;gBACpD,OAAM;YAER,eAAe,EAAE,CAAA;YACjB,eAAe,EAAE,CAAA;YACjB,MAAM,EAAE,CAAA;QACV,CAAC,CAAA;QAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAE7C,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;QAER,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;YACnD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAChD,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC,CAAA;IACH,CAAC;IAED,SAAS,YAAY,CAAC,KAAgB;QACpC,SAAS,GAAG,KAAK,CAAA;QACjB,WAAW,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACzC,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,UAAU,CAAC,KAAgB;QAClC,OAAO,GAAG,KAAK,CAAA;QACf,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACvC,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,UAAU,CAAC,KAAgB;QAClC,OAAO,GAAG,KAAK,CAAA;QACf,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACvC,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,QAAQ,CAAC,KAAc;QAC9B,KAAK,GAAG,KAAK,CAAA;QACb,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACrC,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,QAAQ,CAAC,KAAc;QAC9B,KAAK,GAAG,KAAK,CAAA;QACb,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACrC,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,OAAO,CAAC,KAAa;QAC5B,IAAI,GAAG,KAAK,CAAA;QACZ,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACpC,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,aAAa,CAAC,KAAmB;QACxC,UAAU,GAAG,KAAK,CAAA;QAClB,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QAC1C,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,YAAY,CAAC,KAAkB;QACtC,SAAS,GAAG,KAAK,CAAA;QACjB,WAAW,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACzC,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,iBAAiB,CAAC,KAAuB;QAChD,cAAc,GAAG,KAAK,CAAA;QACtB,WAAW,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9C,eAAe,EAAE,CAAA;QACjB,MAAM,EAAE,CAAA;IACV,CAAC;IAED,SAAS,eAAe;QACtB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED,SAAS,SAAS,CAAC,QAAqC;QACtD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpB,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5B,CAAC,CAAA;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS;QACT,IAAI;QACJ,YAAY;QACZ,eAAe;QACf,UAAU;QACV,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,aAAa;QACb,YAAY;QACZ,iBAAiB;KAClB,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoB,qBAAqB,EAAE,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `@vestow/theme` — nguồn duy nhất của Design Token, dùng chung cho mọi
3
+ * framework.
4
+ *
5
+ * Phần CSS không đi qua entry này; nạp thẳng bằng đường dẫn:
6
+ *
7
+ * @import "@vestow/theme/css/tailwind.css"; // app dùng Tailwind v4
8
+ * @import "@vestow/theme/css/index.css"; // mọi chỗ còn lại
9
+ */
10
+ export type { ThemeController } from './controller.js';
11
+ export { createThemeController, themeController } from './controller.js';
12
+ export type { Preset, TokenMap } from './preset.js';
13
+ export { clearPreset, definePreset, PRESET_STYLE_ID, presetToCss } from './preset.js';
14
+ export type { BaseId, BaseOption, ChartId, ChartOption, ColorMode, MenuAccentId, MenuAccentOption, MenuAppearanceId, MenuAppearanceOption, MenuColorId, MenuColorOption, PaletteId, PaletteOption, StyleId, StyleOption, SurfaceId, SurfaceOption, ThemeState, } from './registry.js';
15
+ export { bases, chartPalettes, colorModes, defaults, domTargets, isBaseId, isChartId, isColorMode, isMenuAccentId, isMenuAppearanceId, isMenuColorId, isPaletteId, isStyleId, isSurfaceId, menuAccents, menuAppearances, menuColors, palettes, storageKeys, styleVariants, surfaces, } from './registry.js';
16
+ export type { TokenName } from './token-names.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAExE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAErF,YAAY,EACV,MAAM,EACN,UAAU,EACV,OAAO,EACP,WAAW,EACX,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,SAAS,EACT,aAAa,EACb,OAAO,EACP,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,GACX,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,eAAe,EACf,UAAU,EACV,QAAQ,EACR,WAAW,EACX,aAAa,EACb,QAAQ,GACT,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `@vestow/theme` — nguồn duy nhất của Design Token, dùng chung cho mọi
3
+ * framework.
4
+ *
5
+ * Phần CSS không đi qua entry này; nạp thẳng bằng đường dẫn:
6
+ *
7
+ * @import "@vestow/theme/css/tailwind.css"; // app dùng Tailwind v4
8
+ * @import "@vestow/theme/css/index.css"; // mọi chỗ còn lại
9
+ */
10
+ export { createThemeController, themeController } from './controller.js';
11
+ export { clearPreset, definePreset, PRESET_STYLE_ID, presetToCss } from './preset.js';
12
+ export { bases, chartPalettes, colorModes, defaults, domTargets, isBaseId, isChartId, isColorMode, isMenuAccentId, isMenuAppearanceId, isMenuColorId, isPaletteId, isStyleId, isSurfaceId, menuAccents, menuAppearances, menuColors, palettes, storageKeys, styleVariants, surfaces, } from './registry.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAIxE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAuBrF,OAAO,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,eAAe,EACf,UAAU,EACV,QAAQ,EACR,WAAW,EACX,aAAa,EACb,QAAQ,GACT,MAAM,eAAe,CAAA"}