@lobehub/ui 5.31.1 → 5.32.1
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.
- package/es/Alert/style.mjs +17 -4
- package/es/Alert/style.mjs.map +1 -1
- package/es/ColorSwatches/ColorSwatches.mjs +3 -3
- package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
- package/es/_virtual/_rolldown/runtime.mjs +1 -0
- package/es/base-ui/Input/style.d.mts +2 -2
- package/es/static-css/baseline.d.mts +6 -0
- package/es/static-css/baseline.mjs +39 -0
- package/es/static-css/baseline.mjs.map +1 -0
- package/es/static-css/buildAntdStaticCss.d.mts +31 -0
- package/es/static-css/buildAntdStaticCss.mjs +71 -0
- package/es/static-css/buildAntdStaticCss.mjs.map +1 -0
- package/es/static-css/emit/index.d.mts +18 -0
- package/es/static-css/emit/index.mjs +42 -0
- package/es/static-css/emit/index.mjs.map +1 -0
- package/es/static-css/hash.mjs +7 -0
- package/es/static-css/hash.mjs.map +1 -0
- package/es/static-css/index.d.mts +6 -0
- package/es/static-css/index.d.ts +1 -0
- package/es/static-css/index.js +1 -0
- package/es/static-css/index.mjs +6 -0
- package/es/static-css/registry.d.mts +20 -0
- package/es/static-css/registry.mjs +298 -0
- package/es/static-css/registry.mjs.map +1 -0
- package/es/static-css/runtime/index.d.mts +14 -0
- package/es/static-css/runtime/index.mjs +34 -0
- package/es/static-css/runtime/index.mjs.map +1 -0
- package/es/static-css/scan.d.mts +19 -0
- package/es/static-css/scan.mjs +87 -0
- package/es/static-css/scan.mjs.map +1 -0
- package/es/static-css/shared.mjs +6 -0
- package/es/static-css/shared.mjs.map +1 -0
- package/es/static-css/themeVars.d.mts +22 -0
- package/es/static-css/themeVars.mjs +130 -0
- package/es/static-css/themeVars.mjs.map +1 -0
- package/es/static-css/vite/index.d.mts +14 -0
- package/es/static-css/vite/index.mjs +48 -0
- package/es/static-css/vite/index.mjs.map +1 -0
- package/package.json +17 -1
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
import { Alert, Anchor, App, AutoComplete, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Col, Collapse, ColorPicker, DatePicker, Divider, Drawer, Dropdown, Empty, Flex, FloatButton, Form, Image, Input, InputNumber, Mentions, Menu, Modal, Pagination, Popover, Progress, QRCode, Radio, Rate, Row, Segmented, Select, Skeleton, Slider, Space, Spin, Steps, Switch, Table, Tabs, Tag, Tooltip, Tree, Typography, Upload } from "antd";
|
|
3
|
+
const antdProbeNames = [...[
|
|
4
|
+
"alert",
|
|
5
|
+
"anchor",
|
|
6
|
+
"app",
|
|
7
|
+
"auto-complete",
|
|
8
|
+
"avatar",
|
|
9
|
+
"badge",
|
|
10
|
+
"breadcrumb",
|
|
11
|
+
"button",
|
|
12
|
+
"card",
|
|
13
|
+
"checkbox",
|
|
14
|
+
"collapse",
|
|
15
|
+
"color-picker",
|
|
16
|
+
"date-picker",
|
|
17
|
+
"divider",
|
|
18
|
+
"drawer",
|
|
19
|
+
"dropdown",
|
|
20
|
+
"empty",
|
|
21
|
+
"flex",
|
|
22
|
+
"float-button",
|
|
23
|
+
"form",
|
|
24
|
+
"grid-col",
|
|
25
|
+
"grid-row",
|
|
26
|
+
"image",
|
|
27
|
+
"input",
|
|
28
|
+
"input-number",
|
|
29
|
+
"input-textarea",
|
|
30
|
+
"mentions",
|
|
31
|
+
"menu",
|
|
32
|
+
"modal",
|
|
33
|
+
"pagination",
|
|
34
|
+
"popover",
|
|
35
|
+
"progress",
|
|
36
|
+
"qrcode",
|
|
37
|
+
"radio",
|
|
38
|
+
"rate",
|
|
39
|
+
"segmented",
|
|
40
|
+
"select",
|
|
41
|
+
"skeleton",
|
|
42
|
+
"slider",
|
|
43
|
+
"space",
|
|
44
|
+
"spin",
|
|
45
|
+
"steps",
|
|
46
|
+
"switch",
|
|
47
|
+
"table",
|
|
48
|
+
"tabs",
|
|
49
|
+
"tag",
|
|
50
|
+
"tag-preset",
|
|
51
|
+
"tag-status",
|
|
52
|
+
"tooltip",
|
|
53
|
+
"tree",
|
|
54
|
+
"typography",
|
|
55
|
+
"upload"
|
|
56
|
+
]];
|
|
57
|
+
const antdProbeRegistry = {
|
|
58
|
+
"alert": {
|
|
59
|
+
detect: "Alert",
|
|
60
|
+
render: () => createElement(Alert, { message: "-" })
|
|
61
|
+
},
|
|
62
|
+
"anchor": {
|
|
63
|
+
detect: "Anchor",
|
|
64
|
+
render: () => createElement(Anchor, { items: [] })
|
|
65
|
+
},
|
|
66
|
+
"app": {
|
|
67
|
+
detect: "App",
|
|
68
|
+
render: () => createElement(App, null, "-")
|
|
69
|
+
},
|
|
70
|
+
"auto-complete": {
|
|
71
|
+
detect: "AutoComplete",
|
|
72
|
+
render: () => createElement(AutoComplete)
|
|
73
|
+
},
|
|
74
|
+
"avatar": {
|
|
75
|
+
detect: "Avatar",
|
|
76
|
+
render: () => createElement(Avatar)
|
|
77
|
+
},
|
|
78
|
+
"badge": {
|
|
79
|
+
detect: "Badge",
|
|
80
|
+
render: () => createElement(Badge, { count: 1 })
|
|
81
|
+
},
|
|
82
|
+
"breadcrumb": {
|
|
83
|
+
detect: "Breadcrumb",
|
|
84
|
+
render: () => createElement(Breadcrumb, { items: [] })
|
|
85
|
+
},
|
|
86
|
+
"button": {
|
|
87
|
+
detect: "Button",
|
|
88
|
+
render: () => createElement(Button, null, "-")
|
|
89
|
+
},
|
|
90
|
+
"card": {
|
|
91
|
+
detect: "Card",
|
|
92
|
+
render: () => createElement(Card, null, "-")
|
|
93
|
+
},
|
|
94
|
+
"checkbox": {
|
|
95
|
+
detect: "Checkbox",
|
|
96
|
+
render: () => createElement(Checkbox)
|
|
97
|
+
},
|
|
98
|
+
"collapse": {
|
|
99
|
+
detect: "Collapse",
|
|
100
|
+
render: () => createElement(Collapse, { items: [] })
|
|
101
|
+
},
|
|
102
|
+
"color-picker": {
|
|
103
|
+
detect: "ColorPicker",
|
|
104
|
+
render: () => createElement(ColorPicker)
|
|
105
|
+
},
|
|
106
|
+
"date-picker": {
|
|
107
|
+
detect: "DatePicker",
|
|
108
|
+
render: () => createElement(DatePicker)
|
|
109
|
+
},
|
|
110
|
+
"divider": {
|
|
111
|
+
detect: "Divider",
|
|
112
|
+
render: () => createElement(Divider)
|
|
113
|
+
},
|
|
114
|
+
"drawer": {
|
|
115
|
+
detect: "Drawer",
|
|
116
|
+
render: () => createElement(Drawer, { open: false })
|
|
117
|
+
},
|
|
118
|
+
"dropdown": {
|
|
119
|
+
detect: "Dropdown",
|
|
120
|
+
render: () => createElement(Dropdown, { menu: { items: [] } }, createElement("span"))
|
|
121
|
+
},
|
|
122
|
+
"empty": {
|
|
123
|
+
detect: "Empty",
|
|
124
|
+
render: () => createElement(Empty)
|
|
125
|
+
},
|
|
126
|
+
"flex": {
|
|
127
|
+
detect: "Flex",
|
|
128
|
+
render: () => createElement(Flex, null, createElement("span"))
|
|
129
|
+
},
|
|
130
|
+
"float-button": {
|
|
131
|
+
detect: "FloatButton",
|
|
132
|
+
render: () => createElement(FloatButton)
|
|
133
|
+
},
|
|
134
|
+
"form": {
|
|
135
|
+
detect: "Form",
|
|
136
|
+
render: () => createElement(Form, null, createElement(Form.Item, { label: "-" }, createElement("span")))
|
|
137
|
+
},
|
|
138
|
+
"grid-col": {
|
|
139
|
+
detect: "Col",
|
|
140
|
+
render: () => createElement(Col, { span: 1 })
|
|
141
|
+
},
|
|
142
|
+
"grid-row": {
|
|
143
|
+
detect: "Row",
|
|
144
|
+
render: () => createElement(Row)
|
|
145
|
+
},
|
|
146
|
+
"image": {
|
|
147
|
+
detect: "Image",
|
|
148
|
+
render: () => createElement(Image, { src: "" })
|
|
149
|
+
},
|
|
150
|
+
"input": {
|
|
151
|
+
detect: "Input",
|
|
152
|
+
render: () => createElement(Input)
|
|
153
|
+
},
|
|
154
|
+
"input-number": {
|
|
155
|
+
detect: "InputNumber",
|
|
156
|
+
render: () => createElement(InputNumber)
|
|
157
|
+
},
|
|
158
|
+
"input-textarea": {
|
|
159
|
+
detect: "Input",
|
|
160
|
+
render: () => createElement(Input.TextArea)
|
|
161
|
+
},
|
|
162
|
+
"mentions": {
|
|
163
|
+
detect: "Mentions",
|
|
164
|
+
render: () => createElement(Mentions)
|
|
165
|
+
},
|
|
166
|
+
"menu": {
|
|
167
|
+
detect: "Menu",
|
|
168
|
+
render: () => createElement(Menu, { items: [] })
|
|
169
|
+
},
|
|
170
|
+
"modal": {
|
|
171
|
+
detect: "Modal",
|
|
172
|
+
render: () => createElement(Modal, { open: false })
|
|
173
|
+
},
|
|
174
|
+
"pagination": {
|
|
175
|
+
detect: "Pagination",
|
|
176
|
+
render: () => createElement(Pagination)
|
|
177
|
+
},
|
|
178
|
+
"popover": {
|
|
179
|
+
detect: "Popover",
|
|
180
|
+
render: () => createElement(Popover, null, createElement("span"))
|
|
181
|
+
},
|
|
182
|
+
"progress": {
|
|
183
|
+
detect: "Progress",
|
|
184
|
+
render: () => createElement(Progress, { percent: 0 })
|
|
185
|
+
},
|
|
186
|
+
"qrcode": {
|
|
187
|
+
detect: "QRCode",
|
|
188
|
+
render: () => createElement(QRCode, { value: "-" })
|
|
189
|
+
},
|
|
190
|
+
"radio": {
|
|
191
|
+
detect: "Radio",
|
|
192
|
+
render: () => createElement(Radio)
|
|
193
|
+
},
|
|
194
|
+
"rate": {
|
|
195
|
+
detect: "Rate",
|
|
196
|
+
render: () => createElement(Rate)
|
|
197
|
+
},
|
|
198
|
+
"segmented": {
|
|
199
|
+
detect: "Segmented",
|
|
200
|
+
render: () => createElement(Segmented, { options: ["-"] })
|
|
201
|
+
},
|
|
202
|
+
"select": {
|
|
203
|
+
detect: "Select",
|
|
204
|
+
render: () => createElement(Select)
|
|
205
|
+
},
|
|
206
|
+
"skeleton": {
|
|
207
|
+
detect: "Skeleton",
|
|
208
|
+
render: () => createElement(Skeleton)
|
|
209
|
+
},
|
|
210
|
+
"slider": {
|
|
211
|
+
detect: "Slider",
|
|
212
|
+
render: () => createElement(Slider)
|
|
213
|
+
},
|
|
214
|
+
"space": {
|
|
215
|
+
detect: "Space",
|
|
216
|
+
render: () => createElement(Space, null, createElement("span"))
|
|
217
|
+
},
|
|
218
|
+
"spin": {
|
|
219
|
+
detect: "Spin",
|
|
220
|
+
render: () => createElement(Spin)
|
|
221
|
+
},
|
|
222
|
+
"steps": {
|
|
223
|
+
detect: "Steps",
|
|
224
|
+
render: () => createElement(Steps, { items: [] })
|
|
225
|
+
},
|
|
226
|
+
"switch": {
|
|
227
|
+
detect: "Switch",
|
|
228
|
+
render: () => createElement(Switch)
|
|
229
|
+
},
|
|
230
|
+
"table": {
|
|
231
|
+
detect: "Table",
|
|
232
|
+
render: () => createElement(Table, {
|
|
233
|
+
columns: [],
|
|
234
|
+
dataSource: []
|
|
235
|
+
})
|
|
236
|
+
},
|
|
237
|
+
"tabs": {
|
|
238
|
+
detect: "Tabs",
|
|
239
|
+
render: () => createElement(Tabs, { items: [] })
|
|
240
|
+
},
|
|
241
|
+
"tag": {
|
|
242
|
+
detect: "Tag",
|
|
243
|
+
render: () => createElement(Tag, null, "-")
|
|
244
|
+
},
|
|
245
|
+
"tag-preset": {
|
|
246
|
+
detect: "Tag",
|
|
247
|
+
render: () => createElement(Tag, { color: "blue" }, "-")
|
|
248
|
+
},
|
|
249
|
+
"tag-status": {
|
|
250
|
+
detect: "Tag",
|
|
251
|
+
render: () => createElement(Tag, { color: "success" }, "-")
|
|
252
|
+
},
|
|
253
|
+
"tooltip": {
|
|
254
|
+
detect: "Tooltip",
|
|
255
|
+
render: () => createElement(Tooltip, { title: "-" }, createElement("span"))
|
|
256
|
+
},
|
|
257
|
+
"tree": {
|
|
258
|
+
detect: "Tree",
|
|
259
|
+
render: () => createElement(Tree, { treeData: [] })
|
|
260
|
+
},
|
|
261
|
+
"typography": {
|
|
262
|
+
detect: "Typography",
|
|
263
|
+
render: () => createElement(Typography.Text, null, "-")
|
|
264
|
+
},
|
|
265
|
+
"upload": {
|
|
266
|
+
detect: "Upload",
|
|
267
|
+
render: () => createElement(Upload)
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
const nonProbeAntdExports = /* @__PURE__ */ new Set([
|
|
271
|
+
"ConfigProvider",
|
|
272
|
+
"Grid",
|
|
273
|
+
"message",
|
|
274
|
+
"notification",
|
|
275
|
+
"theme",
|
|
276
|
+
"Theme",
|
|
277
|
+
"version"
|
|
278
|
+
]);
|
|
279
|
+
const expandComponentsToProbes = (components) => {
|
|
280
|
+
const probes = /* @__PURE__ */ new Set();
|
|
281
|
+
const unmatched = [];
|
|
282
|
+
for (const component of components) {
|
|
283
|
+
let matched = false;
|
|
284
|
+
for (const name of antdProbeNames) if (antdProbeRegistry[name].detect === component) {
|
|
285
|
+
probes.add(name);
|
|
286
|
+
matched = true;
|
|
287
|
+
}
|
|
288
|
+
if (!matched && !nonProbeAntdExports.has(component)) unmatched.push(component);
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
probes: [...probes].sort(),
|
|
292
|
+
unmatched: unmatched.sort()
|
|
293
|
+
};
|
|
294
|
+
};
|
|
295
|
+
//#endregion
|
|
296
|
+
export { antdProbeNames, antdProbeRegistry, expandComponentsToProbes, nonProbeAntdExports };
|
|
297
|
+
|
|
298
|
+
//# sourceMappingURL=registry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.mjs","names":[],"sources":["../../src/static-css/registry.ts"],"sourcesContent":["import {\n Alert,\n Anchor,\n App,\n AutoComplete,\n Avatar,\n Badge,\n Breadcrumb,\n Button,\n Card,\n Checkbox,\n Col,\n Collapse,\n ColorPicker,\n DatePicker,\n Divider,\n Drawer,\n Dropdown,\n Empty,\n Flex,\n FloatButton,\n Form,\n Image,\n Input,\n InputNumber,\n Mentions,\n Menu,\n Modal,\n Pagination,\n Popover,\n Progress,\n QRCode,\n Radio,\n Rate,\n Row,\n Segmented,\n Select,\n Skeleton,\n Slider,\n Space,\n Spin,\n Steps,\n Switch,\n Table,\n Tabs,\n Tag,\n Tooltip,\n Tree,\n Typography,\n Upload,\n} from 'antd';\nimport type { ReactElement } from 'react';\nimport { createElement } from 'react';\n\nexport interface AntdProbeDef {\n /** antd export name whose usage activates this probe during auto scan */\n detect: string;\n render: () => ReactElement;\n}\n\nconst PROBE_NAMES = [\n 'alert',\n 'anchor',\n 'app',\n 'auto-complete',\n 'avatar',\n 'badge',\n 'breadcrumb',\n 'button',\n 'card',\n 'checkbox',\n 'collapse',\n 'color-picker',\n 'date-picker',\n 'divider',\n 'drawer',\n 'dropdown',\n 'empty',\n 'flex',\n 'float-button',\n 'form',\n 'grid-col',\n 'grid-row',\n 'image',\n 'input',\n 'input-number',\n 'input-textarea',\n 'mentions',\n 'menu',\n 'modal',\n 'pagination',\n 'popover',\n 'progress',\n 'qrcode',\n 'radio',\n 'rate',\n 'segmented',\n 'select',\n 'skeleton',\n 'slider',\n 'space',\n 'spin',\n 'steps',\n 'switch',\n 'table',\n 'tabs',\n 'tag',\n 'tag-preset',\n 'tag-status',\n 'tooltip',\n 'tree',\n 'typography',\n 'upload',\n] as const;\n\nexport type AntdProbeName = (typeof PROBE_NAMES)[number];\n\nexport const antdProbeNames: AntdProbeName[] = [...PROBE_NAMES];\n\nexport const antdProbeRegistry: Record<AntdProbeName, AntdProbeDef> = {\n 'alert': { detect: 'Alert', render: () => createElement(Alert, { message: '-' }) },\n 'anchor': { detect: 'Anchor', render: () => createElement(Anchor, { items: [] }) },\n 'app': { detect: 'App', render: () => createElement(App, null, '-') },\n 'auto-complete': { detect: 'AutoComplete', render: () => createElement(AutoComplete) },\n 'avatar': { detect: 'Avatar', render: () => createElement(Avatar) },\n 'badge': { detect: 'Badge', render: () => createElement(Badge, { count: 1 }) },\n 'breadcrumb': { detect: 'Breadcrumb', render: () => createElement(Breadcrumb, { items: [] }) },\n 'button': { detect: 'Button', render: () => createElement(Button, null, '-') },\n 'card': { detect: 'Card', render: () => createElement(Card, null, '-') },\n 'checkbox': { detect: 'Checkbox', render: () => createElement(Checkbox) },\n 'collapse': { detect: 'Collapse', render: () => createElement(Collapse, { items: [] }) },\n 'color-picker': { detect: 'ColorPicker', render: () => createElement(ColorPicker) },\n 'date-picker': { detect: 'DatePicker', render: () => createElement(DatePicker) },\n 'divider': { detect: 'Divider', render: () => createElement(Divider) },\n 'drawer': { detect: 'Drawer', render: () => createElement(Drawer, { open: false }) },\n 'dropdown': {\n detect: 'Dropdown',\n render: () => createElement(Dropdown, { menu: { items: [] } }, createElement('span')),\n },\n 'empty': { detect: 'Empty', render: () => createElement(Empty) },\n 'flex': { detect: 'Flex', render: () => createElement(Flex, null, createElement('span')) },\n 'float-button': { detect: 'FloatButton', render: () => createElement(FloatButton) },\n 'form': {\n detect: 'Form',\n render: () =>\n createElement(Form, null, createElement(Form.Item, { label: '-' }, createElement('span'))),\n },\n 'grid-col': { detect: 'Col', render: () => createElement(Col, { span: 1 }) },\n 'grid-row': { detect: 'Row', render: () => createElement(Row) },\n 'image': { detect: 'Image', render: () => createElement(Image, { src: '' }) },\n 'input': { detect: 'Input', render: () => createElement(Input) },\n 'input-number': { detect: 'InputNumber', render: () => createElement(InputNumber) },\n 'input-textarea': { detect: 'Input', render: () => createElement(Input.TextArea) },\n 'mentions': { detect: 'Mentions', render: () => createElement(Mentions) },\n 'menu': { detect: 'Menu', render: () => createElement(Menu, { items: [] }) },\n 'modal': { detect: 'Modal', render: () => createElement(Modal, { open: false }) },\n 'pagination': { detect: 'Pagination', render: () => createElement(Pagination) },\n 'popover': {\n detect: 'Popover',\n render: () => createElement(Popover, null, createElement('span')),\n },\n 'progress': { detect: 'Progress', render: () => createElement(Progress, { percent: 0 }) },\n 'qrcode': { detect: 'QRCode', render: () => createElement(QRCode, { value: '-' }) },\n 'radio': { detect: 'Radio', render: () => createElement(Radio) },\n 'rate': { detect: 'Rate', render: () => createElement(Rate) },\n 'segmented': { detect: 'Segmented', render: () => createElement(Segmented, { options: ['-'] }) },\n 'select': { detect: 'Select', render: () => createElement(Select) },\n 'skeleton': { detect: 'Skeleton', render: () => createElement(Skeleton) },\n 'slider': { detect: 'Slider', render: () => createElement(Slider) },\n 'space': { detect: 'Space', render: () => createElement(Space, null, createElement('span')) },\n 'spin': { detect: 'Spin', render: () => createElement(Spin) },\n 'steps': { detect: 'Steps', render: () => createElement(Steps, { items: [] }) },\n 'switch': { detect: 'Switch', render: () => createElement(Switch) },\n 'table': { detect: 'Table', render: () => createElement(Table, { columns: [], dataSource: [] }) },\n 'tabs': { detect: 'Tabs', render: () => createElement(Tabs, { items: [] }) },\n 'tag': { detect: 'Tag', render: () => createElement(Tag, null, '-') },\n 'tag-preset': { detect: 'Tag', render: () => createElement(Tag, { color: 'blue' }, '-') },\n 'tag-status': { detect: 'Tag', render: () => createElement(Tag, { color: 'success' }, '-') },\n 'tooltip': {\n detect: 'Tooltip',\n render: () => createElement(Tooltip, { title: '-' }, createElement('span')),\n },\n 'tree': { detect: 'Tree', render: () => createElement(Tree, { treeData: [] }) },\n 'typography': { detect: 'Typography', render: () => createElement(Typography.Text, null, '-') },\n 'upload': { detect: 'Upload', render: () => createElement(Upload) },\n};\n\n// Imperative or unstyled antd exports the scanner may find but no probe should cover.\nexport const nonProbeAntdExports = new Set([\n 'ConfigProvider',\n 'Grid',\n 'message',\n 'notification',\n 'theme',\n // kebabToPascal('antd/es/theme') during deep-import scan\n 'Theme',\n 'version',\n]);\n\nexport interface ExpandedProbes {\n probes: AntdProbeName[];\n unmatched: string[];\n}\n\nexport const expandComponentsToProbes = (components: Iterable<string>): ExpandedProbes => {\n const probes = new Set<AntdProbeName>();\n const unmatched: string[] = [];\n\n for (const component of components) {\n let matched = false;\n for (const name of antdProbeNames) {\n if (antdProbeRegistry[name].detect === component) {\n probes.add(name);\n matched = true;\n }\n }\n if (!matched && !nonProbeAntdExports.has(component)) unmatched.push(component);\n }\n\n return { probes: [...probes].sort(), unmatched: unmatched.sort() };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/static-css/runtime/index.d.ts
|
|
2
|
+
interface InlineAntdStyleResult {
|
|
3
|
+
css: string;
|
|
4
|
+
/** css wrapped in a prepend-ordered style tag, '' when empty */
|
|
5
|
+
html: string;
|
|
6
|
+
/** probe-uncovered components whose rules fell back inline */
|
|
7
|
+
uncovered: string[];
|
|
8
|
+
}
|
|
9
|
+
declare const buildInlineAntdStyle: (runtimeCache: unknown, payload: {
|
|
10
|
+
styleKeys: Iterable<string>;
|
|
11
|
+
}) => InlineAntdStyleResult;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { InlineAntdStyleResult, buildInlineAntdStyle };
|
|
14
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { styleKeysOf } from "../shared.mjs";
|
|
2
|
+
import { extractStyle } from "@ant-design/cssinjs";
|
|
3
|
+
//#region src/static-css/runtime/index.ts
|
|
4
|
+
const buildInlineAntdStyle = (runtimeCache, payload) => {
|
|
5
|
+
const staticKeys = payload.styleKeys instanceof Set ? payload.styleKeys : new Set(payload.styleKeys);
|
|
6
|
+
const cssinjsCache = runtimeCache;
|
|
7
|
+
const cssVarCss = extractStyle(cssinjsCache, {
|
|
8
|
+
plain: true,
|
|
9
|
+
types: ["cssVar"]
|
|
10
|
+
});
|
|
11
|
+
const uncoveredKeys = styleKeysOf(cssinjsCache).filter((key) => !staticKeys.has(key));
|
|
12
|
+
let uncoveredCss = "";
|
|
13
|
+
if (uncoveredKeys.length > 0) {
|
|
14
|
+
const pseudoCache = {
|
|
15
|
+
cache: new Map(uncoveredKeys.map((key) => [key, cssinjsCache.cache.get(key)])),
|
|
16
|
+
extracted: /* @__PURE__ */ new Set(),
|
|
17
|
+
updateTimes: cssinjsCache.updateTimes
|
|
18
|
+
};
|
|
19
|
+
uncoveredCss = extractStyle(pseudoCache, {
|
|
20
|
+
plain: true,
|
|
21
|
+
types: ["style"]
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const css = cssVarCss + uncoveredCss;
|
|
25
|
+
return {
|
|
26
|
+
css,
|
|
27
|
+
html: css ? `<style data-rc-order="prepend" data-rc-priority="-9999">${css}</style>` : "",
|
|
28
|
+
uncovered: uncoveredKeys.map((key) => key.split("%")[2] ?? key)
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { buildInlineAntdStyle };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["extractCssinjsStyle"],"sources":["../../../src/static-css/runtime/index.ts"],"sourcesContent":["import { extractStyle as extractCssinjsStyle } from '@ant-design/cssinjs';\n\nimport { styleKeysOf } from '../shared';\n\ninterface CssinjsCache {\n cache: Map<string, unknown>;\n extracted: Set<string>;\n updateTimes: Map<string, number>;\n}\n\nexport interface InlineAntdStyleResult {\n css: string;\n /** css wrapped in a prepend-ordered style tag, '' when empty */\n html: string;\n /** probe-uncovered components whose rules fell back inline */\n uncovered: string[];\n}\n\n// Replaces antd-style's inline antd entry: component css-var blocks always stay\n// inline (their values are the light-theme truth for this render), while style\n// rules ship via the static stylesheet — except components the probe set missed,\n// which fall back to inline rules.\nexport const buildInlineAntdStyle = (\n runtimeCache: unknown,\n payload: { styleKeys: Iterable<string> },\n): InlineAntdStyleResult => {\n const staticKeys =\n payload.styleKeys instanceof Set ? payload.styleKeys : new Set(payload.styleKeys);\n const cssinjsCache = runtimeCache as CssinjsCache;\n\n const cssVarCss = extractCssinjsStyle(cssinjsCache as never, {\n plain: true,\n types: ['cssVar'],\n });\n\n const uncoveredKeys = styleKeysOf(cssinjsCache).filter((key) => !staticKeys.has(key));\n let uncoveredCss = '';\n if (uncoveredKeys.length > 0) {\n const pseudoCache = {\n cache: new Map(uncoveredKeys.map((key) => [key, cssinjsCache.cache.get(key)])),\n extracted: new Set<string>(),\n updateTimes: cssinjsCache.updateTimes,\n };\n uncoveredCss = extractCssinjsStyle(pseudoCache as never, { plain: true, types: ['style'] });\n }\n\n const css = cssVarCss + uncoveredCss;\n\n return {\n css,\n html: css ? `<style data-rc-order=\"prepend\" data-rc-priority=\"-9999\">${css}</style>` : '',\n uncovered: uncoveredKeys.map((key) => key.split('%')[2] ?? key),\n };\n};\n"],"mappings":";;;AAsBA,MAAa,wBACX,cACA,YAC0B;CAC1B,MAAM,aACJ,QAAQ,qBAAqB,MAAM,QAAQ,YAAY,IAAI,IAAI,QAAQ,SAAS;CAClF,MAAM,eAAe;CAErB,MAAM,YAAYA,aAAoB,cAAuB;EAC3D,OAAO;EACP,OAAO,CAAC,QAAQ;CAClB,CAAC;CAED,MAAM,gBAAgB,YAAY,YAAY,CAAC,CAAC,QAAQ,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;CACpF,IAAI,eAAe;CACnB,IAAI,cAAc,SAAS,GAAG;EAC5B,MAAM,cAAc;GAClB,OAAO,IAAI,IAAI,cAAc,KAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;GAC7E,2BAAW,IAAI,IAAY;GAC3B,aAAa,aAAa;EAC5B;EACA,eAAeA,aAAoB,aAAsB;GAAE,OAAO;GAAM,OAAO,CAAC,OAAO;EAAE,CAAC;CAC5F;CAEA,MAAM,MAAM,YAAY;CAExB,OAAO;EACL;EACA,MAAM,MAAM,2DAA2D,IAAI,YAAY;EACvF,WAAW,cAAc,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG;CAChE;AACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/static-css/scan.d.ts
|
|
2
|
+
interface ScanAntdUsageOptions {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
exclude?: RegExp[];
|
|
5
|
+
extensions?: string[];
|
|
6
|
+
roots?: string[];
|
|
7
|
+
}
|
|
8
|
+
interface AntdUsageScanResult {
|
|
9
|
+
/** PascalCase antd export names found in value imports */
|
|
10
|
+
components: string[];
|
|
11
|
+
importsLobeUi: boolean;
|
|
12
|
+
scannedFiles: number;
|
|
13
|
+
/** a namespace/default antd import was found — usage is not statically enumerable */
|
|
14
|
+
wildcard: boolean;
|
|
15
|
+
}
|
|
16
|
+
declare const scanAntdUsage: (options?: ScanAntdUsageOptions) => AntdUsageScanResult;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { AntdUsageScanResult, ScanAntdUsageOptions, scanAntdUsage };
|
|
19
|
+
//# sourceMappingURL=scan.d.mts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
//#region src/static-css/scan.ts
|
|
4
|
+
const DEFAULT_EXTENSIONS = [
|
|
5
|
+
"ts",
|
|
6
|
+
"tsx",
|
|
7
|
+
"js",
|
|
8
|
+
"jsx",
|
|
9
|
+
"mjs",
|
|
10
|
+
"mts",
|
|
11
|
+
"cjs",
|
|
12
|
+
"cts"
|
|
13
|
+
];
|
|
14
|
+
const DEFAULT_EXCLUDE = [
|
|
15
|
+
/node_modules/,
|
|
16
|
+
/\.test\./,
|
|
17
|
+
/\.spec\./,
|
|
18
|
+
/\.d\.[cm]?ts$/,
|
|
19
|
+
/__tests__/
|
|
20
|
+
];
|
|
21
|
+
const NAMED_IMPORT_RE = /import\s+(type\s+)?((?:[\w$]+\s*,\s*)?\{[^}]*\}|[\w$]+|\*\s+as\s+[\w$]+)\s+from\s+['"]antd['"]/g;
|
|
22
|
+
const DEEP_IMPORT_RE = /from\s+['"]antd\/(?:es|lib)\/([\w-]+)/g;
|
|
23
|
+
const LOBE_UI_RE = /from\s+['"]@lobehub\/ui(?:['"]|\/)/;
|
|
24
|
+
const kebabToPascal = (name) => name.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
|
|
25
|
+
const parseImportClause = (clause, components) => {
|
|
26
|
+
const braceStart = clause.indexOf("{");
|
|
27
|
+
const wildcard = (braceStart === -1 ? clause : clause.slice(0, braceStart)).trim().length > 0;
|
|
28
|
+
if (braceStart === -1) return wildcard;
|
|
29
|
+
const inner = clause.slice(braceStart + 1, clause.lastIndexOf("}"));
|
|
30
|
+
for (const rawSpecifier of inner.split(",")) {
|
|
31
|
+
const specifier = rawSpecifier.trim();
|
|
32
|
+
if (!specifier || specifier.startsWith("type ")) continue;
|
|
33
|
+
const name = specifier.split(/\s+as\s+/)[0].trim();
|
|
34
|
+
if (/^[A-Za-z_$][\w$]*$/.test(name)) components.add(name);
|
|
35
|
+
}
|
|
36
|
+
return wildcard;
|
|
37
|
+
};
|
|
38
|
+
const listFiles = (root, extensions, exclude) => {
|
|
39
|
+
let entries;
|
|
40
|
+
try {
|
|
41
|
+
entries = readdirSync(root, { recursive: true });
|
|
42
|
+
} catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
return entries.map((entry) => path.join(root, entry)).filter((path) => {
|
|
46
|
+
if (exclude.some((pattern) => pattern.test(path))) return false;
|
|
47
|
+
const extension = path.split(".").pop();
|
|
48
|
+
if (!extension || !extensions.has(extension)) return false;
|
|
49
|
+
try {
|
|
50
|
+
return statSync(path).isFile();
|
|
51
|
+
} catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
const scanAntdUsage = (options = {}) => {
|
|
57
|
+
const { cwd = process.cwd(), roots = ["src"], extensions = DEFAULT_EXTENSIONS, exclude = DEFAULT_EXCLUDE } = options;
|
|
58
|
+
const components = /* @__PURE__ */ new Set();
|
|
59
|
+
let importsLobeUi = false;
|
|
60
|
+
let wildcard = false;
|
|
61
|
+
let scannedFiles = 0;
|
|
62
|
+
for (const root of roots) for (const file of listFiles(path.resolve(cwd, root), new Set(extensions), exclude)) {
|
|
63
|
+
let source;
|
|
64
|
+
try {
|
|
65
|
+
source = readFileSync(file, "utf8");
|
|
66
|
+
} catch {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
scannedFiles += 1;
|
|
70
|
+
if (!importsLobeUi && LOBE_UI_RE.test(source)) importsLobeUi = true;
|
|
71
|
+
for (const match of source.matchAll(NAMED_IMPORT_RE)) {
|
|
72
|
+
if (match[1]) continue;
|
|
73
|
+
if (parseImportClause(match[2], components)) wildcard = true;
|
|
74
|
+
}
|
|
75
|
+
for (const match of source.matchAll(DEEP_IMPORT_RE)) components.add(kebabToPascal(match[1]));
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
components: [...components].sort(),
|
|
79
|
+
importsLobeUi,
|
|
80
|
+
scannedFiles,
|
|
81
|
+
wildcard
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
//#endregion
|
|
85
|
+
export { scanAntdUsage };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=scan.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.mjs","names":[],"sources":["../../src/static-css/scan.ts"],"sourcesContent":["import { readdirSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nexport interface ScanAntdUsageOptions {\n cwd?: string;\n exclude?: RegExp[];\n extensions?: string[];\n roots?: string[];\n}\n\nexport interface AntdUsageScanResult {\n /** PascalCase antd export names found in value imports */\n components: string[];\n importsLobeUi: boolean;\n scannedFiles: number;\n /** a namespace/default antd import was found — usage is not statically enumerable */\n wildcard: boolean;\n}\n\nconst DEFAULT_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'mts', 'cjs', 'cts'];\nconst DEFAULT_EXCLUDE = [/node_modules/, /\\.test\\./, /\\.spec\\./, /\\.d\\.[cm]?ts$/, /__tests__/];\n\n// clause alternatives ({named} / Default / Default, {named} / * as ns) deliberately\n// exclude statement-crossing text so one match never spans two imports\nconst NAMED_IMPORT_RE =\n /import\\s+(type\\s+)?((?:[\\w$]+\\s*,\\s*)?\\{[^}]*\\}|[\\w$]+|\\*\\s+as\\s+[\\w$]+)\\s+from\\s+['\"]antd['\"]/g;\n// type-only deep imports are included too — over-approximation is harmless here\nconst DEEP_IMPORT_RE = /from\\s+['\"]antd\\/(?:es|lib)\\/([\\w-]+)/g;\nconst LOBE_UI_RE = /from\\s+['\"]@lobehub\\/ui(?:['\"]|\\/)/;\n\nconst kebabToPascal = (name: string) =>\n name\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n\nconst parseImportClause = (clause: string, components: Set<string>): boolean => {\n const braceStart = clause.indexOf('{');\n\n const bare = (braceStart === -1 ? clause : clause.slice(0, braceStart)).trim();\n const wildcard = bare.length > 0;\n\n if (braceStart === -1) return wildcard;\n\n const inner = clause.slice(braceStart + 1, clause.lastIndexOf('}'));\n for (const rawSpecifier of inner.split(',')) {\n const specifier = rawSpecifier.trim();\n if (!specifier || specifier.startsWith('type ')) continue;\n const name = specifier.split(/\\s+as\\s+/)[0]!.trim();\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) components.add(name);\n }\n\n return wildcard;\n};\n\nconst listFiles = (root: string, extensions: Set<string>, exclude: RegExp[]): string[] => {\n let entries: string[];\n try {\n entries = readdirSync(root, { recursive: true }) as string[];\n } catch {\n return [];\n }\n\n return entries\n .map((entry) => path.join(root, entry))\n .filter((path) => {\n if (exclude.some((pattern) => pattern.test(path))) return false;\n const extension = path.split('.').pop();\n if (!extension || !extensions.has(extension)) return false;\n try {\n return statSync(path).isFile();\n } catch {\n return false;\n }\n });\n};\n\nexport const scanAntdUsage = (options: ScanAntdUsageOptions = {}): AntdUsageScanResult => {\n const {\n cwd = process.cwd(),\n roots = ['src'],\n extensions = DEFAULT_EXTENSIONS,\n exclude = DEFAULT_EXCLUDE,\n } = options;\n\n const components = new Set<string>();\n let importsLobeUi = false;\n let wildcard = false;\n let scannedFiles = 0;\n\n for (const root of roots) {\n for (const file of listFiles(path.resolve(cwd, root), new Set(extensions), exclude)) {\n let source: string;\n try {\n source = readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n scannedFiles += 1;\n\n if (!importsLobeUi && LOBE_UI_RE.test(source)) importsLobeUi = true;\n\n for (const match of source.matchAll(NAMED_IMPORT_RE)) {\n if (match[1]) continue;\n if (parseImportClause(match[2]!, components)) wildcard = true;\n }\n\n for (const match of source.matchAll(DEEP_IMPORT_RE)) {\n components.add(kebabToPascal(match[1]!));\n }\n }\n }\n\n return { components: [...components].sort(), importsLobeUi, scannedFiles, wildcard };\n};\n"],"mappings":";;;AAmBA,MAAM,qBAAqB;CAAC;CAAM;CAAO;CAAM;CAAO;CAAO;CAAO;CAAO;AAAK;AAChF,MAAM,kBAAkB;CAAC;CAAgB;CAAY;CAAY;CAAiB;AAAW;AAI7F,MAAM,kBACJ;AAEF,MAAM,iBAAiB;AACvB,MAAM,aAAa;AAEnB,MAAM,iBAAiB,SACrB,KACG,MAAM,GAAG,CAAC,CACV,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC3D,KAAK,EAAE;AAEZ,MAAM,qBAAqB,QAAgB,eAAqC;CAC9E,MAAM,aAAa,OAAO,QAAQ,GAAG;CAGrC,MAAM,YADQ,eAAe,KAAK,SAAS,OAAO,MAAM,GAAG,UAAU,EAAA,CAAG,KACpD,CAAC,CAAC,SAAS;CAE/B,IAAI,eAAe,IAAI,OAAO;CAE9B,MAAM,QAAQ,OAAO,MAAM,aAAa,GAAG,OAAO,YAAY,GAAG,CAAC;CAClE,KAAK,MAAM,gBAAgB,MAAM,MAAM,GAAG,GAAG;EAC3C,MAAM,YAAY,aAAa,KAAK;EACpC,IAAI,CAAC,aAAa,UAAU,WAAW,OAAO,GAAG;EACjD,MAAM,OAAO,UAAU,MAAM,UAAU,CAAC,CAAC,EAAE,CAAE,KAAK;EAClD,IAAI,qBAAqB,KAAK,IAAI,GAAG,WAAW,IAAI,IAAI;CAC1D;CAEA,OAAO;AACT;AAEA,MAAM,aAAa,MAAc,YAAyB,YAAgC;CACxF,IAAI;CACJ,IAAI;EACF,UAAU,YAAY,MAAM,EAAE,WAAW,KAAK,CAAC;CACjD,QAAQ;EACN,OAAO,CAAC;CACV;CAEA,OAAO,QACJ,KAAK,UAAU,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CACtC,QAAQ,SAAS;EAChB,IAAI,QAAQ,MAAM,YAAY,QAAQ,KAAK,IAAI,CAAC,GAAG,OAAO;EAC1D,MAAM,YAAY,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI;EACtC,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,SAAS,GAAG,OAAO;EACrD,IAAI;GACF,OAAO,SAAS,IAAI,CAAC,CAAC,OAAO;EAC/B,QAAQ;GACN,OAAO;EACT;CACF,CAAC;AACL;AAEA,MAAa,iBAAiB,UAAgC,CAAC,MAA2B;CACxF,MAAM,EACJ,MAAM,QAAQ,IAAI,GAClB,QAAQ,CAAC,KAAK,GACd,aAAa,oBACb,UAAU,oBACR;CAEJ,MAAM,6BAAa,IAAI,IAAY;CACnC,IAAI,gBAAgB;CACpB,IAAI,WAAW;CACf,IAAI,eAAe;CAEnB,KAAK,MAAM,QAAQ,OACjB,KAAK,MAAM,QAAQ,UAAU,KAAK,QAAQ,KAAK,IAAI,GAAG,IAAI,IAAI,UAAU,GAAG,OAAO,GAAG;EACnF,IAAI;EACJ,IAAI;GACF,SAAS,aAAa,MAAM,MAAM;EACpC,QAAQ;GACN;EACF;EACA,gBAAgB;EAEhB,IAAI,CAAC,iBAAiB,WAAW,KAAK,MAAM,GAAG,gBAAgB;EAE/D,KAAK,MAAM,SAAS,OAAO,SAAS,eAAe,GAAG;GACpD,IAAI,MAAM,IAAI;GACd,IAAI,kBAAkB,MAAM,IAAK,UAAU,GAAG,WAAW;EAC3D;EAEA,KAAK,MAAM,SAAS,OAAO,SAAS,cAAc,GAChD,WAAW,IAAI,cAAc,MAAM,EAAG,CAAC;CAE3C;CAGF,OAAO;EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,CAAC,KAAK;EAAG;EAAe;EAAc;CAAS;AACrF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.mjs","names":[],"sources":["../../src/static-css/shared.ts"],"sourcesContent":["export interface CssinjsCacheLike {\n cache: Map<string, unknown>;\n}\n\nexport const styleKeysOf = (cache: CssinjsCacheLike): string[] =>\n [...cache.cache.keys()].filter((key) => key.startsWith('style%'));\n"],"mappings":";AAIA,MAAa,eAAe,UAC1B,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,QAAQ,QAAQ,IAAI,WAAW,QAAQ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ThemeConfig } from "antd";
|
|
2
|
+
//#region src/static-css/themeVars.d.ts
|
|
3
|
+
type ThemeAppearance = 'dark' | 'light';
|
|
4
|
+
interface ThemeVarsCssOptions {
|
|
5
|
+
/** selector activating an appearance; default matches next-themes' data-theme attribute */
|
|
6
|
+
appearanceSelector?: (appearance: ThemeAppearance) => string;
|
|
7
|
+
/** dark fixups for lobe-ui antdOverride rules that keep literal polished-derived colors */
|
|
8
|
+
compatRules?: boolean;
|
|
9
|
+
hrefTemplate?: (hash: string) => string;
|
|
10
|
+
/** same theme factory the app hands to ConfigProvider/ThemeProvider */
|
|
11
|
+
theme?: (appearance: ThemeAppearance) => ThemeConfig;
|
|
12
|
+
}
|
|
13
|
+
interface ThemeVarsCssPayload {
|
|
14
|
+
css: string;
|
|
15
|
+
hash: string;
|
|
16
|
+
href: string;
|
|
17
|
+
skippedComponents: string[];
|
|
18
|
+
}
|
|
19
|
+
declare const buildThemeVarsCss: (options?: ThemeVarsCssOptions) => ThemeVarsCssPayload;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { ThemeVarsCssOptions, ThemeVarsCssPayload, buildThemeVarsCss };
|
|
22
|
+
//# sourceMappingURL=themeVars.d.mts.map
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { createLobeAntdTheme } from "../styles/theme/antdTheme.mjs";
|
|
2
|
+
import { hashCss } from "./hash.mjs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { theme } from "antd";
|
|
5
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
//#region src/static-css/themeVars.ts
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const unitless = /* @__PURE__ */ new Set([
|
|
10
|
+
"fontWeightStrong",
|
|
11
|
+
"lineHeight",
|
|
12
|
+
"lineHeightHeading1",
|
|
13
|
+
"lineHeightHeading2",
|
|
14
|
+
"lineHeightHeading3",
|
|
15
|
+
"lineHeightHeading4",
|
|
16
|
+
"lineHeightHeading5",
|
|
17
|
+
"lineHeightLG",
|
|
18
|
+
"lineHeightSM",
|
|
19
|
+
"opacityImage",
|
|
20
|
+
"opacityLoading",
|
|
21
|
+
"zIndexBase",
|
|
22
|
+
"zIndexPopupBase"
|
|
23
|
+
]);
|
|
24
|
+
const ignoredTokens = /* @__PURE__ */ new Set(["motionBase", "motionUnit"]);
|
|
25
|
+
const toKebabCase = (str) => str.replaceAll(/([a-z])([A-Z])/g, "$1-$2").replaceAll(/([a-z])(\d)/g, "$1-$2").replaceAll(/(\d)([A-Z])/g, "$1-$2").replaceAll(/([A-Z]+)([A-Z][a-z])/g, "$1-$2").toLowerCase();
|
|
26
|
+
const defaultThemeFactory = (appearance) => createLobeAntdTheme({ appearance });
|
|
27
|
+
const buildDesignToken = (themeFactory, appearance) => {
|
|
28
|
+
const themeConfig = themeFactory(appearance);
|
|
29
|
+
return theme.getDesignToken({
|
|
30
|
+
...themeConfig,
|
|
31
|
+
algorithm: [appearance === "dark" ? theme.darkAlgorithm : theme.defaultAlgorithm, themeConfig.algorithm ?? []].flat()
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
const toDeclarations = (token) => Object.entries(token).filter(([key, value]) => !key.startsWith("_") && !key.startsWith("screen") && !key.includes("-") && !ignoredTokens.has(key) && (typeof value === "string" || typeof value === "number")).map(([key, value]) => {
|
|
35
|
+
const cssValue = typeof value === "number" && !unitless.has(key) ? `${value}px` : String(value);
|
|
36
|
+
return `--ant-${toKebabCase(key)}: ${cssValue};`;
|
|
37
|
+
}).join("\n");
|
|
38
|
+
const isBrightColor = (value) => {
|
|
39
|
+
const hex = /^#([\da-f]{6})/i.exec(value)?.[1];
|
|
40
|
+
const rgb = /^rgba?\((\d+)[\s,]+(\d+)[\s,]+(\d+)/.exec(value);
|
|
41
|
+
const [r, g, b] = hex ? [
|
|
42
|
+
Number.parseInt(hex.slice(0, 2), 16),
|
|
43
|
+
Number.parseInt(hex.slice(2, 4), 16),
|
|
44
|
+
Number.parseInt(hex.slice(4, 6), 16)
|
|
45
|
+
] : rgb ? [
|
|
46
|
+
Number(rgb[1]),
|
|
47
|
+
Number(rgb[2]),
|
|
48
|
+
Number(rgb[3])
|
|
49
|
+
] : [
|
|
50
|
+
0,
|
|
51
|
+
0,
|
|
52
|
+
0
|
|
53
|
+
];
|
|
54
|
+
return (r * 299 + g * 587 + b * 114) / 1e3 > 128;
|
|
55
|
+
};
|
|
56
|
+
const loadAntdTokenModules = () => {
|
|
57
|
+
const antdLibDir = path.join(path.dirname(require.resolve("antd/package.json")), "lib");
|
|
58
|
+
return readdirSync(antdLibDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort().map((name) => ({
|
|
59
|
+
component: name,
|
|
60
|
+
path: path.join(antdLibDir, name, "style", "token.js")
|
|
61
|
+
})).filter(({ path }) => existsSync(path));
|
|
62
|
+
};
|
|
63
|
+
const buildDarkComponentVars = (tokens) => {
|
|
64
|
+
const declarations = [];
|
|
65
|
+
const skipped = [];
|
|
66
|
+
for (const { component, path } of loadAntdTokenModules()) try {
|
|
67
|
+
const prepare = require(path).prepareComponentToken;
|
|
68
|
+
if (typeof prepare !== "function") continue;
|
|
69
|
+
const light = prepare(tokens.light);
|
|
70
|
+
const dark = prepare(tokens.dark);
|
|
71
|
+
for (const [key, value] of Object.entries(dark)) {
|
|
72
|
+
if (typeof value !== "string" || light[key] === value) continue;
|
|
73
|
+
declarations.push(`--ant-${component}-${toKebabCase(key)}:${value};`);
|
|
74
|
+
}
|
|
75
|
+
} catch {
|
|
76
|
+
skipped.push(component);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
css: declarations.join(""),
|
|
80
|
+
skipped
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
const buildCompatRules = (darkSelector, darkToken) => {
|
|
84
|
+
const readableOnPrimary = isBrightColor(String(darkToken.colorPrimary)) ? "#000" : "#fff";
|
|
85
|
+
return [
|
|
86
|
+
[
|
|
87
|
+
`${darkSelector} .ant-btn-primary:not(:disabled)`,
|
|
88
|
+
`${darkSelector} .ant-btn-primary:not(:disabled):hover`,
|
|
89
|
+
`${darkSelector} .ant-btn-primary:not(:disabled):active`
|
|
90
|
+
].join(",") + `{color:${readableOnPrimary} !important;}`,
|
|
91
|
+
`${darkSelector} .ant-checkbox-inner:after{border-color:${readableOnPrimary} !important;}`,
|
|
92
|
+
`${darkSelector} .ant-radio-wrapper .ant-radio-checked .ant-radio-inner:after{background:${readableOnPrimary};}`
|
|
93
|
+
].join("\n");
|
|
94
|
+
};
|
|
95
|
+
const buildThemeVarsCss = (options = {}) => {
|
|
96
|
+
const { theme = defaultThemeFactory, appearanceSelector = (appearance) => `html[data-theme='${appearance}']`, compatRules = true, hrefTemplate = (hash) => `/theme-vars.css?v=${hash}` } = options;
|
|
97
|
+
const tokens = {
|
|
98
|
+
dark: buildDesignToken(theme, "dark"),
|
|
99
|
+
light: buildDesignToken(theme, "light")
|
|
100
|
+
};
|
|
101
|
+
const light = appearanceSelector("light");
|
|
102
|
+
const dark = appearanceSelector("dark");
|
|
103
|
+
const componentVars = buildDarkComponentVars(tokens);
|
|
104
|
+
const blocks = [
|
|
105
|
+
[
|
|
106
|
+
":root",
|
|
107
|
+
`${light} [class*='css-var-']`,
|
|
108
|
+
`${light} .ant-app`
|
|
109
|
+
].join(",") + `{${toDeclarations(tokens.light)}}`,
|
|
110
|
+
[
|
|
111
|
+
dark,
|
|
112
|
+
`${dark} [class*='css-var-']`,
|
|
113
|
+
`${dark} .ant-app`
|
|
114
|
+
].join(",") + `{${toDeclarations(tokens.dark)}}`,
|
|
115
|
+
`${dark} [class*='css-var-']{${componentVars.css}}`
|
|
116
|
+
];
|
|
117
|
+
if (compatRules) blocks.push(buildCompatRules(dark, tokens.dark));
|
|
118
|
+
const css = blocks.join("\n");
|
|
119
|
+
const hash = hashCss(css);
|
|
120
|
+
return {
|
|
121
|
+
css,
|
|
122
|
+
hash,
|
|
123
|
+
href: hrefTemplate(hash),
|
|
124
|
+
skippedComponents: componentVars.skipped
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
//#endregion
|
|
128
|
+
export { buildThemeVarsCss, toKebabCase };
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=themeVars.mjs.map
|