@fwkui/x-css 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README-EN.md +1159 -0
- package/README.md +45 -4
- package/index.js +1 -1
- package/package.json +1 -2
package/README-EN.md
ADDED
|
@@ -0,0 +1,1159 @@
|
|
|
1
|
+
# x-css User Guide
|
|
2
|
+
|
|
3
|
+
`x-css` is a compact and efficient CSS-JavaScript library for building reactive user interfaces. The library provides utilities to manage state and to automatically and efficiently manipulate the DOM.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
To use `x-css`, import it into your project:
|
|
8
|
+
|
|
9
|
+
```packages/fkui/css-dist/README-EN.md#L1-20
|
|
10
|
+
<script type="module">
|
|
11
|
+
import $ from "https://unpkg.com/@fwkui/x-css@1.0.2/index.js";
|
|
12
|
+
$.cssObserve(document);
|
|
13
|
+
</script>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
# Using xCSS
|
|
17
|
+
|
|
18
|
+
xCSS is a CSS-in-JS system that lets you write concise, powerful CSS via special class names. After learning it you will be able to:
|
|
19
|
+
|
|
20
|
+
- Read and write class names following the syntax and understand how they compile into CSS
|
|
21
|
+
- Control media queries, `@layer`, `!important`, pseudo selectors, and combine multiple properties in a single class
|
|
22
|
+
|
|
23
|
+
> Note: A full list of property and value abbreviations is below in this document.
|
|
24
|
+
|
|
25
|
+
## Design Tokens (CSS Variables)
|
|
26
|
+
|
|
27
|
+
- Purpose: Reduce the length and complexity of inline values in classes, ensure consistent branding, and make it easier to maintain changes to colors, spacing, shadows, gradients, etc.
|
|
28
|
+
- How to declare:
|
|
29
|
+
- Put variables in a style tag at the top of the document or in a CSS file imported before using xCSS.
|
|
30
|
+
- Use CSS variable names starting with `--`, e.g. `--bg-gradient-login`, `--panel`, `--shadow-card`, `--color-primary`, `--space-md`, …
|
|
31
|
+
- How to use in xCSS:
|
|
32
|
+
- Use directly inside braces: `bg{var(--bg-gradient-login)}` or `bxsh{var(--shadow-card)}` or `p{var(--space-md)}`
|
|
33
|
+
- Use available aliases if configured: `bgc--panel` or `c--primary` (if alias maps exist)
|
|
34
|
+
- You can use fallbacks with `var(--name, fallbackValue)` for older browser compatibility.
|
|
35
|
+
- Note: CSS variables must be loaded before rendering classes that depend on them.
|
|
36
|
+
|
|
37
|
+
- Example token declarations (put at the document head or an early-imported stylesheet):
|
|
38
|
+
```packages/fkui/css-dist/README-EN.md#L21-40
|
|
39
|
+
<style>
|
|
40
|
+
:root {
|
|
41
|
+
--bg-gradient-login: linear-gradient(#6a11cb, #2575fc);
|
|
42
|
+
--panel: #ffffff;
|
|
43
|
+
--shadow-card: 0 10px 20px rgba(0,0,0,.15);
|
|
44
|
+
--radius-card: 12px;
|
|
45
|
+
--color-primary: #0070f3;
|
|
46
|
+
--space-md: 16px;
|
|
47
|
+
}
|
|
48
|
+
</style>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- Example: using tokens on a login page:
|
|
52
|
+
```packages/fkui/css-dist/README-EN.md#L41-70
|
|
53
|
+
<body class="bg{var(--bg-gradient-login)} h100vh w100% dF jcC aiC">
|
|
54
|
+
<main class="w360px md:w420px lg:w480px bgcWhite p28px bxsh{var(--shadow-card)} bdra12px">
|
|
55
|
+
...
|
|
56
|
+
<button class="w100% p12px cWhite bdN bdra8px bxsh{var(--shadow-card)}" style="--color-primary: #0070f3;">
|
|
57
|
+
Sign in
|
|
58
|
+
</button>
|
|
59
|
+
</main>
|
|
60
|
+
</body>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- Migration & alias hints:
|
|
64
|
+
- If you have aliases like `bgc--panel` or `c--primary`, define tokens and use them consistently.
|
|
65
|
+
- Example: `:root { --panel: #fff; }` and use either `bgc--panel` or `bgc{var(--panel)}` depending on your build setup.
|
|
66
|
+
|
|
67
|
+
See examples and the Design Tokens section below for integration patterns.
|
|
68
|
+
|
|
69
|
+
## General Syntax
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
[MQ:][layer]<property><value>[@selector]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Important note: `<property><value>` is REQUIRED — a class must contain both property and value.
|
|
76
|
+
|
|
77
|
+
Examples of valid syntax:
|
|
78
|
+
|
|
79
|
+
- `cRed` — color red (layer 0)
|
|
80
|
+
- `5cRed` — color red at layer 5
|
|
81
|
+
- `md:cRed` — color red on medium screens
|
|
82
|
+
- `md:5cRed` — color red at layer 5 on medium screens
|
|
83
|
+
|
|
84
|
+
### Components
|
|
85
|
+
|
|
86
|
+
#### 1. Media Query (MQ) — Optional
|
|
87
|
+
|
|
88
|
+
- `xs:` — small screens (max-width: 575px)
|
|
89
|
+
- `sm:` — small screens (min-width: 576px)
|
|
90
|
+
- `md:` — medium screens (min-width: 768px)
|
|
91
|
+
- `lg:` — large screens (min-width: 992px)
|
|
92
|
+
- `xl:` — extra large screens (min-width: 1200px)
|
|
93
|
+
- `2xl:` — very large screens (min-width: 1400px)
|
|
94
|
+
- `sma:` — up to small screens (max-width: 768px)
|
|
95
|
+
- `mda:` — up to medium screens (max-width: 992px)
|
|
96
|
+
- `lga:` — up to large screens (max-width: 1200px)
|
|
97
|
+
- `xla:` — up to extra large screens (max-width: 1400px)
|
|
98
|
+
|
|
99
|
+
#### 2. Layer — Optional
|
|
100
|
+
|
|
101
|
+
- `1` to `19` — CSS layer priority (higher number = higher priority)
|
|
102
|
+
- Default: `0` (layer 0)
|
|
103
|
+
- Purpose: group rules by layer (base, component, utilities, overrides…)
|
|
104
|
+
|
|
105
|
+
#### 3. Property — REQUIRED
|
|
106
|
+
|
|
107
|
+
- Lowercase; can be full name or abbreviation
|
|
108
|
+
- No `-` except special cases starting with `-w` for hyphenated properties
|
|
109
|
+
- Examples: `w` (width), `h` (height), `c` (color), `bg` (background)
|
|
110
|
+
|
|
111
|
+
#### 4. Value — REQUIRED
|
|
112
|
+
|
|
113
|
+
- Numbers: `10`, `-4.5`, `0.5`, optionally with units: `10px`, `1.5rem`, `100%`
|
|
114
|
+
- Named values start with uppercase: `Red`, `Center`, `Block`, `Fixed`, `None`
|
|
115
|
+
- Literal values inside braces: `c{rgb(255,0,0)}`, `bg{linear-gradient(...)}`
|
|
116
|
+
- CSS variables: start with `--`: `c--primary` → `color: var(--primary)`
|
|
117
|
+
- Important: prefix `!` before value to mark `!important`: `w!10px` → `width: 10px !important`
|
|
118
|
+
- Functions: use TitleCase + parentheses and `;` instead of spaces:
|
|
119
|
+
- `wCalc(100%;-;20px)` → `width: calc(100% - 20px)`
|
|
120
|
+
- `tTranslate(50%;,;-50%)` → `transform: translate(50% , -50%)`
|
|
121
|
+
|
|
122
|
+
#### 5. Selector — Optional
|
|
123
|
+
|
|
124
|
+
- Starts with `@`
|
|
125
|
+
- Use `;` in place of spaces
|
|
126
|
+
- Can include pseudo classes/elements, child selectors, or combinations
|
|
127
|
+
- Examples: `@:hover`, `@:focus`, `@:active`, `@>a`, `@.btn;:hover`
|
|
128
|
+
|
|
129
|
+
## Examples
|
|
130
|
+
|
|
131
|
+
### Basic
|
|
132
|
+
|
|
133
|
+
```packages/fkui/css-dist/README-EN.md#L71-90
|
|
134
|
+
<!-- Red color -->
|
|
135
|
+
<div class="cRed">Text in red</div>
|
|
136
|
+
|
|
137
|
+
<!-- Width 100px -->
|
|
138
|
+
<div class="w100px">Width 100px</div>
|
|
139
|
+
|
|
140
|
+
<!-- Padding 20px -->
|
|
141
|
+
<div class="p20px">Padding 20px</div>
|
|
142
|
+
|
|
143
|
+
<!-- Opacity 50% -->
|
|
144
|
+
<div class="opc50%">50% opacity</div>
|
|
145
|
+
|
|
146
|
+
<!-- Font size 14px -->
|
|
147
|
+
<div class="fns14px">Font size 14px</div>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### With Media Query
|
|
151
|
+
|
|
152
|
+
```packages/fkui/css-dist/README-EN.md#L91-110
|
|
153
|
+
<!-- Red on large screens -->
|
|
154
|
+
<div class="lg:cRed">Red on desktop</div>
|
|
155
|
+
|
|
156
|
+
<!-- Hidden on extra small screens -->
|
|
157
|
+
<div class="xs:vHidden">Hidden on mobile</div>
|
|
158
|
+
|
|
159
|
+
<!-- Responsive width -->
|
|
160
|
+
<div class="w100% md:w50% lg:w33%">Responsive width</div>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### With Layer
|
|
164
|
+
|
|
165
|
+
```packages/fkui/css-dist/README-EN.md#L111-130
|
|
166
|
+
<!-- High-priority layer -->
|
|
167
|
+
<div class="5cRed">High-priority red</div>
|
|
168
|
+
|
|
169
|
+
<!-- Low-priority layer -->
|
|
170
|
+
<div class="1cBlue">Low-priority blue</div>
|
|
171
|
+
|
|
172
|
+
<!-- Combine layer and media query -->
|
|
173
|
+
<div class="md:7cGreen">Green at layer 7 on desktop</div>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### With Selector
|
|
177
|
+
|
|
178
|
+
```packages/fkui/css-dist/README-EN.md#L131-150
|
|
179
|
+
<!-- Hover effect -->
|
|
180
|
+
<div class="cRed@:hover">Red on hover</div>
|
|
181
|
+
|
|
182
|
+
<!-- Focus effect -->
|
|
183
|
+
<input class="bdw2px@:focus" placeholder="Border on focus" />
|
|
184
|
+
|
|
185
|
+
<!-- Child selector -->
|
|
186
|
+
<div class="cBlue@>a">Blue color for child anchor</div>
|
|
187
|
+
|
|
188
|
+
<!-- Complex selector -->
|
|
189
|
+
<div class="cRed@.btn;:hover">Red when hovering a .btn</div>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### With Special Values
|
|
193
|
+
|
|
194
|
+
```packages/fkui/css-dist/README-EN.md#L151-170
|
|
195
|
+
<!-- !important -->
|
|
196
|
+
<div class="c!red">Red !important</div>
|
|
197
|
+
|
|
198
|
+
<!-- CSS Variable -->
|
|
199
|
+
<div class="c--primary">Color from CSS variable</div>
|
|
200
|
+
|
|
201
|
+
<!-- Custom literal value -->
|
|
202
|
+
<div class="w{calc(100%;-;20px)}">Computed width</div>
|
|
203
|
+
|
|
204
|
+
<!-- CSS function -->
|
|
205
|
+
<div class="wClamp(280px;640px;100%)">Width with clamp</div>
|
|
206
|
+
|
|
207
|
+
<!-- Complex box-shadow -->
|
|
208
|
+
<div class="bxsh{0;2px;8px;rgba(0,0,0,.1)}">Complex shadow</div>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Combine multiple properties with `&`
|
|
212
|
+
|
|
213
|
+
```packages/fkui/css-dist/README-EN.md#L171-190
|
|
214
|
+
<!-- Multiple properties at once -->
|
|
215
|
+
<div class="cRed&fw700&taC">Red, font-weight 700, centered</div>
|
|
216
|
+
|
|
217
|
+
<!-- Flexbox layout -->
|
|
218
|
+
<div class="dF&aiC&jcSp">Flexbox center + space-between</div>
|
|
219
|
+
|
|
220
|
+
<!-- Padding and margin -->
|
|
221
|
+
<div class="p8px&m0">Padding 8px and margin 0</div>
|
|
222
|
+
|
|
223
|
+
<!-- Combine with selector -->
|
|
224
|
+
<div class="cRed&fw700@:hover">Red and fw700 on hover</div>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Priority & Collision Rules
|
|
228
|
+
|
|
229
|
+
1. `@layer`: rules from larger-numbered layers override smaller ones (when same origin/specificity)
|
|
230
|
+
2. Selector specificity: more specific selector wins
|
|
231
|
+
3. Order of appearance: later rules in the same layer and specificity win
|
|
232
|
+
4. `!important` beats normal rules in the same cascade scope
|
|
233
|
+
|
|
234
|
+
Example: `5cBlue` vs `9cRed` → `9cRed` wins. But `5cBlue!` (written as `c!Blue` or `c!{blue}`) can still win if within the same layer/scope depending on cascade.
|
|
235
|
+
|
|
236
|
+
## Important Rules
|
|
237
|
+
|
|
238
|
+
### ✅ Valid
|
|
239
|
+
|
|
240
|
+
- `cRed` — color red (property: `c`, value: `Red`)
|
|
241
|
+
- `w10px` — width 10px (property: `w`, value: `10px`)
|
|
242
|
+
- `md:cRed` — red on medium screens (MQ: `md`, property: `c`, value: `Red`)
|
|
243
|
+
- `2w100px` — width 100px at layer 2 (layer: `2`, property: `w`, value: `100px`)
|
|
244
|
+
- `cRed@:hover` — red on hover
|
|
245
|
+
- `w!100px` — width 100px `!important`
|
|
246
|
+
- `c{red}` — custom literal value for color
|
|
247
|
+
- `cRed&w700` — combine multiple properties
|
|
248
|
+
- `wCalc(100%;-;20px)` — function-style value with `;`
|
|
249
|
+
|
|
250
|
+
### ❌ Invalid
|
|
251
|
+
|
|
252
|
+
- `Cred` — uppercase `C` used for property (properties must be lowercase)
|
|
253
|
+
- `C{red}` — property must be lowercase
|
|
254
|
+
- `cRed}` — missing opening brace
|
|
255
|
+
- `c-red` — hyphen not allowed in property
|
|
256
|
+
- `W-10px` — uppercase property and hyphen
|
|
257
|
+
- `w-!10px` — hyphen misuse; use `w!10px`
|
|
258
|
+
- `cRed @:hover` — spaces in class name not allowed
|
|
259
|
+
- `c` — missing value
|
|
260
|
+
- `Red` — missing property
|
|
261
|
+
|
|
262
|
+
## Common Mistakes & How to Avoid Them
|
|
263
|
+
|
|
264
|
+
- Using uppercase on property names → incorrect. Properties must be lowercase or `--var`.
|
|
265
|
+
- Missing property or value → both are required.
|
|
266
|
+
- Confusing `-` and `!`: `w-!10px` is wrong; use `w!10px`.
|
|
267
|
+
- Forgetting `;` inside values that contain spaces: `ff{Courier New}` should be `ff{Courier;New}`.
|
|
268
|
+
- Selectors that contain spaces must use `;` and will be converted during output.
|
|
269
|
+
- If you don't provide an abbreviation table, the compiler cannot map `ta` to `text-align`, for example.
|
|
270
|
+
|
|
271
|
+
## Notes
|
|
272
|
+
|
|
273
|
+
1. Property and Value are required — each class must include both.
|
|
274
|
+
2. Class names should be lowercase for properties; values may contain uppercase letters.
|
|
275
|
+
3. Avoid spaces in class names — use `;` instead.
|
|
276
|
+
4. CSS.supports validation — classes should produce supported CSS.
|
|
277
|
+
5. Layer priority — higher layer number wins.
|
|
278
|
+
6. Media queries apply only within their specified ranges.
|
|
279
|
+
7. Use `;` to represent whitespace in values. Example: `ff{Courier;New;monospace}` → `font-family: Courier New, monospace`
|
|
280
|
+
|
|
281
|
+
## Practical Tips (from real-world experience)
|
|
282
|
+
|
|
283
|
+
### 🎯 Class naming principles
|
|
284
|
+
|
|
285
|
+
#### ✅ Recommended
|
|
286
|
+
|
|
287
|
+
- Keep class names short and readable: `cRed`, `w100px`, `p16px`
|
|
288
|
+
- Use conventional abbreviations: `dF` instead of `displayFlex` (d: display, F: Flex)
|
|
289
|
+
|
|
290
|
+
#### ❌ Avoid
|
|
291
|
+
|
|
292
|
+
- Extremely long names: `wCalc(100%;-;20px;-;30px;-;10px)` — prefer CSS variables
|
|
293
|
+
- Complex inline values: `bxsh{0;4px;8px;12px;rgba(0,0,0,0.1);inset}` — prefer variables
|
|
294
|
+
- Repeating properties for colors: `cRed`, `cBlue`, `cGreen` — use a color palette
|
|
295
|
+
|
|
296
|
+
### 🎨 Managing complex values
|
|
297
|
+
|
|
298
|
+
#### Use CSS Variables for long values:
|
|
299
|
+
|
|
300
|
+
```packages/fkui/css-dist/README-EN.md#L191-210
|
|
301
|
+
:root {
|
|
302
|
+
--shadow-card: 0 4px 8px rgba(0, 0, 0, 0.1);
|
|
303
|
+
--shadow-hover: 0 8px 16px rgba(0, 0, 0, 0.15);
|
|
304
|
+
--border-radius: 8px;
|
|
305
|
+
--spacing-sm: 8px;
|
|
306
|
+
--spacing-md: 16px;
|
|
307
|
+
--spacing-lg: 24px;
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
```packages/fkui/css-dist/README-EN.md#L211-230
|
|
312
|
+
<!-- Instead of writing a long value -->
|
|
313
|
+
<div class="bxsh{0;4px;8px;rgba(0,0,0,0.1)} bdra8px p16px">
|
|
314
|
+
<!-- Use variables -->
|
|
315
|
+
<div class="bxsh--shadow-card bdra--border-radius p--spacing-md"></div>
|
|
316
|
+
</div>
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
#### Create component classes for common patterns:
|
|
320
|
+
|
|
321
|
+
```packages/fkui/css-dist/README-EN.md#L231-250
|
|
322
|
+
<!-- Instead of repeating many utilities -->
|
|
323
|
+
<div class="dF&aiC&jcSp&p16px&bgcWhite&bxsh{0;2px;4px;rgba(0,0,0,0.1)}">
|
|
324
|
+
<!-- Define a component class -->
|
|
325
|
+
<div class="card"></div>
|
|
326
|
+
</div>
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### 📱 Responsive Design Best Practices
|
|
330
|
+
|
|
331
|
+
#### Mobile-first approach
|
|
332
|
+
|
|
333
|
+
```packages/fkui/css-dist/README-EN.md#L251-270
|
|
334
|
+
<!-- Base styles for mobile -->
|
|
335
|
+
<div class="w100% p8px">
|
|
336
|
+
<!-- Overrides for desktop -->
|
|
337
|
+
<div class="md:w50% md:p16px lg:w33% lg:p24px"></div>
|
|
338
|
+
</div>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### Group breakpoints logically
|
|
342
|
+
|
|
343
|
+
```packages/fkui/css-dist/README-EN.md#L271-290
|
|
344
|
+
<!-- Main layout -->
|
|
345
|
+
<div class="dB md:dF">
|
|
346
|
+
<!-- Responsive spacing -->
|
|
347
|
+
<div class="p8px md:p16px lg:p24px">
|
|
348
|
+
<!-- Responsive typography -->
|
|
349
|
+
<div class="fns14px md:fns16px lg:fns18px"></div>
|
|
350
|
+
</div>
|
|
351
|
+
</div>
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### 🎭 Layer Management
|
|
355
|
+
|
|
356
|
+
#### Organize layers by hierarchy
|
|
357
|
+
|
|
358
|
+
```packages/fkui/css-dist/README-EN.md#L291-310
|
|
359
|
+
<!-- Base styles (0) -->
|
|
360
|
+
<div class="cBlack fns16px">
|
|
361
|
+
<!-- Component styles (1-5) -->
|
|
362
|
+
<div class="2btnPrimary">
|
|
363
|
+
<!-- Utility styles (6-10) -->
|
|
364
|
+
<div class="8m16px">
|
|
365
|
+
<!-- Override styles (11-19) -->
|
|
366
|
+
<div class="15cRed"></div>
|
|
367
|
+
</div>
|
|
368
|
+
</div>
|
|
369
|
+
</div>
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### 🔧 Performance Tips
|
|
373
|
+
|
|
374
|
+
#### Avoid over-engineering
|
|
375
|
+
|
|
376
|
+
```packages/fkui/css-dist/README-EN.md#L311-330
|
|
377
|
+
<!-- Simple and effective -->
|
|
378
|
+
<div class="dF&aiC&p16px">
|
|
379
|
+
<!-- Instead of over-complicating -->
|
|
380
|
+
<div class="dF&aiC&jcC&p16px&m0&b0&bgcT"></div>
|
|
381
|
+
</div>
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
#### Use shorthand when possible
|
|
385
|
+
|
|
386
|
+
```packages/fkui/css-dist/README-EN.md#L331-350
|
|
387
|
+
<!-- Margin shorthand -->
|
|
388
|
+
<div class="m16px">
|
|
389
|
+
<!-- margin: 16px -->
|
|
390
|
+
<div class="mt8px&mb8px">
|
|
391
|
+
<!-- margin-top: 8px; margin-bottom: 8px -->
|
|
392
|
+
<div class="p16px">
|
|
393
|
+
<!-- padding: 16px -->
|
|
394
|
+
<div class="px16px&py8px"><!-- padding: 8px 16px --></div>
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### 🎨 Design System Integration
|
|
401
|
+
|
|
402
|
+
#### Create design tokens:
|
|
403
|
+
|
|
404
|
+
```packages/fkui/css-dist/README-EN.md#L351-380
|
|
405
|
+
:root {
|
|
406
|
+
/* Colors */
|
|
407
|
+
--color-primary: #0070f3;
|
|
408
|
+
--color-secondary: #7928ca;
|
|
409
|
+
--color-success: #0070f3;
|
|
410
|
+
--color-warning: #f5a623;
|
|
411
|
+
--color-error: #e00;
|
|
412
|
+
|
|
413
|
+
/* Spacing scale */
|
|
414
|
+
--space-1: 4px;
|
|
415
|
+
--space-2: 8px;
|
|
416
|
+
--space-3: 12px;
|
|
417
|
+
--space-4: 16px;
|
|
418
|
+
--space-5: 20px;
|
|
419
|
+
--space-6: 24px;
|
|
420
|
+
|
|
421
|
+
/* Typography scale */
|
|
422
|
+
--text-xs: 12px;
|
|
423
|
+
--text-sm: 14px;
|
|
424
|
+
--text-base: 16px;
|
|
425
|
+
--text-lg: 18px;
|
|
426
|
+
--text-xl: 20px;
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
#### Use semantic naming
|
|
431
|
+
|
|
432
|
+
```packages/fkui/css-dist/README-EN.md#L381-400
|
|
433
|
+
<!-- Instead of a specific color class -->
|
|
434
|
+
<div class="cBlue">
|
|
435
|
+
<!-- Prefer semantic names -->
|
|
436
|
+
<div class="cPrimary">
|
|
437
|
+
<div class="cSuccess">
|
|
438
|
+
<div class="cError"></div>
|
|
439
|
+
</div>
|
|
440
|
+
</div>
|
|
441
|
+
</div>
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### 🚀 Maintenance Tips
|
|
445
|
+
|
|
446
|
+
#### Document for your team
|
|
447
|
+
|
|
448
|
+
```packages/fkui/css-dist/README-EN.md#L401-420
|
|
449
|
+
<!-- Component: Button Primary -->
|
|
450
|
+
<!-- Usage: <button class="btnPrimary">Click me</button> -->
|
|
451
|
+
<!-- Variants: btnSecondary, btnDanger, btnGhost -->
|
|
452
|
+
<button class="btnPrimary">Click me</button>
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
#### Consistent naming convention
|
|
456
|
+
|
|
457
|
+
```packages/fkui/css-dist/README-EN.md#L421-440
|
|
458
|
+
<!-- Layout -->
|
|
459
|
+
<div class="container">
|
|
460
|
+
<div class="row">
|
|
461
|
+
<div class="col">
|
|
462
|
+
<!-- Components -->
|
|
463
|
+
<div class="card">
|
|
464
|
+
<div class="btn">
|
|
465
|
+
<div class="input">
|
|
466
|
+
<!-- Utilities -->
|
|
467
|
+
<div class="textCenter">
|
|
468
|
+
<div class="mAuto">
|
|
469
|
+
<div class="dNone"></div>
|
|
470
|
+
</div>
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
</div>
|
|
474
|
+
</div>
|
|
475
|
+
</div>
|
|
476
|
+
</div>
|
|
477
|
+
</div>
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### 💡 Pro Tips
|
|
481
|
+
|
|
482
|
+
1. Always test on mobile first — mobile-first approach.
|
|
483
|
+
2. Use browser dev tools to inspect compiled CSS output.
|
|
484
|
+
3. Create a style guide documenting common patterns.
|
|
485
|
+
4. Perform code reviews to ensure consistency across the team.
|
|
486
|
+
5. Monitor performance and CSS bundle size.
|
|
487
|
+
6. Put accessibility first.
|
|
488
|
+
|
|
489
|
+
## Composite Example
|
|
490
|
+
|
|
491
|
+
**HTML**
|
|
492
|
+
|
|
493
|
+
```packages/fkui/css-dist/README-EN.md#L441-470
|
|
494
|
+
<div
|
|
495
|
+
class="md:7 dF&aiC&jcSp p16px bgc--panel bxsh{0;2px;8px;rgba(0,0,0,.1)} c--fg@>a;:hover"
|
|
496
|
+
>
|
|
497
|
+
<a class="cBlue wClamp(120px;240px;100%)">Link</a>
|
|
498
|
+
<button class="w!120px h40px bdra8px cWhite bgc#0070f3">Button</button>
|
|
499
|
+
</div>
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**Generated CSS (conceptual)**
|
|
503
|
+
|
|
504
|
+
```packages/fkui/css-dist/README-EN.md#L471-510
|
|
505
|
+
@media (min-width: 768px) {
|
|
506
|
+
@layer l7 {
|
|
507
|
+
.md\:7\.dF\&aiC\&jcSp\:where(*) {
|
|
508
|
+
display: flex;
|
|
509
|
+
align-items: center;
|
|
510
|
+
justify-content: space-between;
|
|
511
|
+
padding: 16px;
|
|
512
|
+
background-color: var(--panel);
|
|
513
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
514
|
+
}
|
|
515
|
+
.md\:7\.c\-\-fg\@\>a\;\:hover > a:hover {
|
|
516
|
+
color: var(--fg);
|
|
517
|
+
}
|
|
518
|
+
.md\:7\.wClamp\(120px\;240px\;100\%\) {
|
|
519
|
+
width: clamp(120px, 240px, 100%);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
.cBlue {
|
|
524
|
+
color: blue;
|
|
525
|
+
}
|
|
526
|
+
.w\!120px {
|
|
527
|
+
width: 120px !important;
|
|
528
|
+
}
|
|
529
|
+
.h40px {
|
|
530
|
+
height: 40px;
|
|
531
|
+
}
|
|
532
|
+
.bdra8px {
|
|
533
|
+
border-radius: 8px;
|
|
534
|
+
}
|
|
535
|
+
.cWhite {
|
|
536
|
+
color: #fff;
|
|
537
|
+
}
|
|
538
|
+
.bgc\#0070f3 {
|
|
539
|
+
background-color: #0070f3;
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
## Quick Reference
|
|
544
|
+
|
|
545
|
+
### Media Query
|
|
546
|
+
|
|
547
|
+
| Abbrev | Screen size |
|
|
548
|
+
| ------ | ----------- |
|
|
549
|
+
| `xs:` | ≤ 575px |
|
|
550
|
+
| `sm:` | ≥ 576px |
|
|
551
|
+
| `md:` | ≥ 768px |
|
|
552
|
+
| `lg:` | ≥ 992px |
|
|
553
|
+
| `xl:` | ≥ 1200px |
|
|
554
|
+
| `2xl:` | ≥ 1400px |
|
|
555
|
+
|
|
556
|
+
### Layer
|
|
557
|
+
|
|
558
|
+
| Abbrev | Description |
|
|
559
|
+
| ------ | ------------------------------------------- |
|
|
560
|
+
| `0` | Default layer (low priority) |
|
|
561
|
+
| `1-19` | Custom layers (higher number = higher priority) |
|
|
562
|
+
|
|
563
|
+
### Special values
|
|
564
|
+
|
|
565
|
+
| Symbol | Meaning |
|
|
566
|
+
| ------ | ----------------- |
|
|
567
|
+
| `!` | !important |
|
|
568
|
+
| `--` | CSS Variable |
|
|
569
|
+
| `{}` | Literal/custom value |
|
|
570
|
+
| `;` | Replacement for spaces inside class names |
|
|
571
|
+
|
|
572
|
+
## FAQ
|
|
573
|
+
|
|
574
|
+
**Q:** Why must keyword values start with an uppercase letter?
|
|
575
|
+
|
|
576
|
+
**A:** To distinguish properties (lowercase) from named values (capitalized). This avoids confusion between `red` as a value and a potential property.
|
|
577
|
+
|
|
578
|
+
**Q:** What should I use for spaces inside values?
|
|
579
|
+
|
|
580
|
+
**A:** Use `;` inside values and selectors to avoid breaking the class name.
|
|
581
|
+
|
|
582
|
+
**Q:** I want to add a new breakpoint — how?
|
|
583
|
+
|
|
584
|
+
**A:** Add a new prefix (e.g. `xxl:`) and map it to `@media (min-width: ...)` in your compiler configuration.
|
|
585
|
+
|
|
586
|
+
**Q:** Do I need to escape classes when writing them in HTML?
|
|
587
|
+
|
|
588
|
+
**A:** No. Write them as-is; the compiler will escape characters when generating CSS output.
|
|
589
|
+
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
# Full reference: all xCSS properties and abbreviations
|
|
593
|
+
|
|
594
|
+
## Data structure
|
|
595
|
+
|
|
596
|
+
- Abbrev: short token used in class names
|
|
597
|
+
- CSS Property: full CSS property name
|
|
598
|
+
- Value abbreviations: mapping of short tokens to CSS values (if any)
|
|
599
|
+
|
|
600
|
+
---
|
|
601
|
+
|
|
602
|
+
## 1. Layout & Display
|
|
603
|
+
|
|
604
|
+
### Display
|
|
605
|
+
|
|
606
|
+
| Abbrev | Property | Value abbreviations |
|
|
607
|
+
| ------ | --------- | ------------------- |
|
|
608
|
+
| `d` | `display` | `b:block`, `ib:inline-block`, `i:inline`, `f:flex`, `if:inline-flex`, `t:table`, `it:inline-table`, `tcp:table-caption`, `tcell:table-cell`, `tcol:table-column`, `tcolg:table-column-group`, `tfg:table-footer-group`, `thg:table-header-group`, `trg:table-row-group`, `tr:table-row`, `fr:flow-root`, `g:grid`, `ig:inline-grid`, `c:contents`, `li:list-item` |
|
|
609
|
+
|
|
610
|
+
### Position
|
|
611
|
+
|
|
612
|
+
| Abbrev | Property | Values |
|
|
613
|
+
| ------ | ---------- | --------------------------- |
|
|
614
|
+
| `pos` | `position` | `s:static`, `f:fixed`, `a:absolute`, `r:relative`, `st:sticky` |
|
|
615
|
+
|
|
616
|
+
### Sizing
|
|
617
|
+
|
|
618
|
+
| Abbrev | Property | Notes/values |
|
|
619
|
+
| ------ | --------------- | ------------------------------------------- |
|
|
620
|
+
| `w` | `width` | `mic:min-content`, `mac:max-content`, `fc:fit-content`, `f:100%` |
|
|
621
|
+
| `h` | `height` | `mic:min-content`, `mac:max-content`, `fc:fit-content` |
|
|
622
|
+
| `mw` | `max-width` | - |
|
|
623
|
+
| `mxw` | `max-width` | - |
|
|
624
|
+
| `mh` | `max-height` | - |
|
|
625
|
+
| `miw` | `min-width` | `f:100%`, `mic:min-content`, `mac:max-content`, `fc:fit-content` |
|
|
626
|
+
| `mih` | `min-height` | `f:100%`, `mic:min-content`, `mac:max-content`, `fc:fit-content` |
|
|
627
|
+
| `blks` | `block-size` | - |
|
|
628
|
+
| `ins` | `inline-size` | - |
|
|
629
|
+
| `mbs` | `max-block-size`| - |
|
|
630
|
+
| `mis` | `max-inline-size`| - |
|
|
631
|
+
| `mibs` | `min-block-size`| - |
|
|
632
|
+
| `misz` | `min-inline-size`| - |
|
|
633
|
+
|
|
634
|
+
### Positioning
|
|
635
|
+
|
|
636
|
+
| Abbrev | Property | Notes |
|
|
637
|
+
| ------ | ------------------------- | ----- |
|
|
638
|
+
| `t` | `top` | - |
|
|
639
|
+
| `r` | `right` | - |
|
|
640
|
+
| `b` | `bottom` | - |
|
|
641
|
+
| `l` | `left` | - |
|
|
642
|
+
| `i` | `inset` | - |
|
|
643
|
+
| `iblk` | `inset-block` | - |
|
|
644
|
+
| `ibe` | `inset-block-end` | - |
|
|
645
|
+
| `ibsta`| `inset-block-start` | - |
|
|
646
|
+
| `ii` | `inset-inline` | - |
|
|
647
|
+
| `iie` | `inset-inline-end` | - |
|
|
648
|
+
| `iis` | `inset-inline-start` | - |
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## 2. Spacing
|
|
653
|
+
|
|
654
|
+
### Margin
|
|
655
|
+
|
|
656
|
+
| Abbrev | Property | Notes |
|
|
657
|
+
| ------ | ------------------- | ----- |
|
|
658
|
+
| `m` | `margin` | - |
|
|
659
|
+
| `mt` | `margin-top` | - |
|
|
660
|
+
| `mr` | `margin-right` | - |
|
|
661
|
+
| `mb` | `margin-bottom` | - |
|
|
662
|
+
| `ml` | `margin-left` | - |
|
|
663
|
+
| `mblk` | `margin-block` | - |
|
|
664
|
+
| `mbe` | `margin-block-end` | - |
|
|
665
|
+
| `mbsta`| `margin-block-start`| - |
|
|
666
|
+
| `min` | `margin-inline` | - |
|
|
667
|
+
| `mie` | `margin-inline-end` | - |
|
|
668
|
+
| `mista`| `margin-inline-start`| - |
|
|
669
|
+
|
|
670
|
+
### Padding
|
|
671
|
+
|
|
672
|
+
| Abbrev | Property | Notes/values |
|
|
673
|
+
| ------ | ---------------------- | ------------ |
|
|
674
|
+
| `p` | `padding` | - |
|
|
675
|
+
| `pt` | `padding-top` | - |
|
|
676
|
+
| `pr` | `padding-right` | - |
|
|
677
|
+
| `pb` | `padding-bottom` | - |
|
|
678
|
+
| `pl` | `padding-left` | - |
|
|
679
|
+
| `pblk` | `padding-block` | - |
|
|
680
|
+
| `pbe` | `padding-block-end` | - |
|
|
681
|
+
| `pbs` | `padding-block-start` | - |
|
|
682
|
+
| `pi` | `padding-inline` | `s:start`, `c:center`, `e:end`, `b:baseline`, `st:stretch` |
|
|
683
|
+
| `pie` | `padding-inline-end` | - |
|
|
684
|
+
| `pis` | `padding-inline-start` | - |
|
|
685
|
+
|
|
686
|
+
---
|
|
687
|
+
|
|
688
|
+
## 3. Colors & Background
|
|
689
|
+
|
|
690
|
+
### Color
|
|
691
|
+
|
|
692
|
+
| Abbrev | Property | Values |
|
|
693
|
+
| ------ | -------- | ----------------------------- |
|
|
694
|
+
| `c` | `color` | `i:inherit`, `t:transparent` |
|
|
695
|
+
|
|
696
|
+
### Background
|
|
697
|
+
|
|
698
|
+
| Abbrev | Property | Notes/values |
|
|
699
|
+
| ------ | ------------------------ | ------------ |
|
|
700
|
+
| `bg` | `background` | - |
|
|
701
|
+
| `bgc` | `background-color` | `t:transparent`, `c:currentcolor` |
|
|
702
|
+
| `bgi` | `background-image` | - |
|
|
703
|
+
| `bgp` | `background-position` | `t:top`, `b:bottom`, `l:left`, `r:right`, `c:center`, `lt:left top`, `ct:center top`, `rt:right top`, `lc:left center`, `cc:center center`, `rc:right center`, `lb:left bottom`, `cb:center bottom`, `rb:right bottom` |
|
|
704
|
+
| `bgpx` | `background-position-x` | `l:left`, `r:right`, `c:center` |
|
|
705
|
+
| `bgpy` | `background-position-y` | `t:top`, `b:bottom`, `c:center` |
|
|
706
|
+
| `bgr` | `background-repeat` | `r:repeat`, `x:repeat-x`, `y:repeat-y`, `s:space`, `rn:round`, `n:no-repeat`, `rs:repeat space`, `rr:repeat repeat`, `nr:no-repeat round` |
|
|
707
|
+
| `bgs` | `background-size` | `c:contain` |
|
|
708
|
+
| `bga` | `background-attachment` | `s:scroll`, `f:fixed`, `l:local`|
|
|
709
|
+
| `bgbm` | `background-blend-mode` | `n:normal`, `m:multiply`, `s:screen`, `o:overlay`, `d:darken`, `l:lighten`, `cd:color-dodge`, `i:color-burn`, `hl:hard-light`, `sl:soft-light`, `di:difference`, `e:exclusion`, `h:hue`, `sa:saturation`, `c:color`, `lu:luminosity` |
|
|
710
|
+
| `bgcl` | `background-clip` | `bb:border-box`, `pb:padding-box`, `cb:content-box`, `t:text` |
|
|
711
|
+
| `bgo` | `background-origin` | `bb:border-box`, `pb:padding-box`, `cb:content-box` |
|
|
712
|
+
|
|
713
|
+
---
|
|
714
|
+
|
|
715
|
+
## 4. Border
|
|
716
|
+
|
|
717
|
+
### Border General
|
|
718
|
+
|
|
719
|
+
| Abbrev | Property | Values |
|
|
720
|
+
| ------ | -------------- | ------ |
|
|
721
|
+
| `bd` | `border` | `d:dotted`, `ds:dashed`, `db:double`, `g:groove`, `r:ridge`, `i:inset`, `o:outset` |
|
|
722
|
+
| `bds` | `border-style` | `dt:dotted`, `ds:dashed`, `s:solid`, `db:double`, `g:groove`, `r:ridge`, `in:inset`, `out:outset` |
|
|
723
|
+
| `bdc` | `border-color` | - |
|
|
724
|
+
| `bdw` | `border-width` | `t:thin`, `m:medium`, `th:thick` |
|
|
725
|
+
|
|
726
|
+
### Border Sides
|
|
727
|
+
|
|
728
|
+
| Abbrev | Property | Notes |
|
|
729
|
+
| ------ | ---------------- | ----- |
|
|
730
|
+
| `bdt` | `border-top` | - |
|
|
731
|
+
| `bdr` | `border-right` | - |
|
|
732
|
+
| `bdb` | `border-bottom` | - |
|
|
733
|
+
| `bdl` | `border-left` | - |
|
|
734
|
+
|
|
735
|
+
### Border Radius
|
|
736
|
+
|
|
737
|
+
| Abbrev | Property | Notes |
|
|
738
|
+
| ------ | ---------------------------- | ----- |
|
|
739
|
+
| `bda` | `border-radius` | - |
|
|
740
|
+
| `bdra` | `border-radius` | - |
|
|
741
|
+
| `bdtlr`| `border-top-left-radius` | - |
|
|
742
|
+
| `bdtrr`| `border-top-right-radius` | - |
|
|
743
|
+
| `bdblr`| `border-bottom-left-radius` | - |
|
|
744
|
+
| `bdbrr`| `border-bottom-right-radius` | - |
|
|
745
|
+
| `bdeer`| `border-end-end-radius` | - |
|
|
746
|
+
| `bdesr`| `border-end-start-radius` | - |
|
|
747
|
+
| `bdser`| `border-start-end-radius` | - |
|
|
748
|
+
| `bdssr`| `border-start-start-radius` | - |
|
|
749
|
+
|
|
750
|
+
### Border Block/Inline
|
|
751
|
+
|
|
752
|
+
| Abbrev | Property | Values |
|
|
753
|
+
| ------ | ------------------------ | ------ |
|
|
754
|
+
| `bdblk`| `border-block` | - |
|
|
755
|
+
| `bdblc`| `border-block-color` | - |
|
|
756
|
+
| `bdble`| `border-block-end` | - |
|
|
757
|
+
| `bdbls`| `border-block-start` | - |
|
|
758
|
+
| `bdblst`| `border-block-style` | `d:dotted`, `ds:dashed`, `db:double`, `g:groove`, `r:ridge`, `i:inset`, `o:outset` |
|
|
759
|
+
| `bdblwi`| `border-block-width` | - |
|
|
760
|
+
| `bdi` | `border-inline` | - |
|
|
761
|
+
| `bdic` | `border-inline-color` | - |
|
|
762
|
+
| `bdie` | `border-inline-end` | - |
|
|
763
|
+
| `bdista`| `border-inline-start` | - |
|
|
764
|
+
| `bdistl`| `border-inline-style` | - |
|
|
765
|
+
| `bdinw`| `border-inline-width` | - |
|
|
766
|
+
|
|
767
|
+
---
|
|
768
|
+
|
|
769
|
+
## 5. Typography
|
|
770
|
+
|
|
771
|
+
### Font
|
|
772
|
+
|
|
773
|
+
(Abbreviations for font- related properties — many are supported; see mapping tables in the original file for the complete list.)
|
|
774
|
+
|
|
775
|
+
| Abbrev | Property | Notes/values |
|
|
776
|
+
| ------ | --------------------------- | ------------ |
|
|
777
|
+
| `fn` | `font` | - |
|
|
778
|
+
| `ff` | `font-family` | `a:ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'`, `s:ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif`, `m:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace` |
|
|
779
|
+
| `fns` | `font-size` | - |
|
|
780
|
+
| `fw` | `font-weight` | - |
|
|
781
|
+
| `fnsty`| `font-style` | - |
|
|
782
|
+
| ... | (other font-variant & feature properties are included) | - |
|
|
783
|
+
|
|
784
|
+
### Text
|
|
785
|
+
|
|
786
|
+
| Abbrev | Property | Values/notes |
|
|
787
|
+
| ------ | --------------------- | ------------ |
|
|
788
|
+
| `ta` | `text-align` | `s:start`, `e:end`, `l:left`, `r:right`, `c:center`, `j:justify`, `mp:match-parent`, `mc:-moz-center`, `wc:-webkit-center` |
|
|
789
|
+
| `tal` | `text-align-last` | `s:start`, `e:end`, `l:left`, `r:right`, `c:center`, `j:justify` |
|
|
790
|
+
| `td` | `text-decoration` | `u:underline` |
|
|
791
|
+
| `tdc` | `text-decoration-color` | - |
|
|
792
|
+
| `tdl` | `text-decoration-line`| `u:underline`, `o:overline`, `lt:line-through`, `b:blink` |
|
|
793
|
+
| `tds` | `text-decoration-style` | `db:double`, `dt:dotted`, `ds:dashed`, `w:wavy` |
|
|
794
|
+
| `tdt` | `text-decoration-thickness` | `ff:from-font` |
|
|
795
|
+
| `tep` | `text-emphasis-position` | `or:over right`, `ol:over left`, `ur:under right`, `ul:under left`, `lo:left over`, `ru:right under`, `lu:left under` |
|
|
796
|
+
| `ttr` | `text-transform` | `c:capitalize`, `u:uppercase`, `l:lowercase`, `fw:full-width`, `fsk:full-size-kana` |
|
|
797
|
+
| `tw` | `text-wrap` | `w:wrap`, `n:nowrap`, `b:balance`, `p:pretty` |
|
|
798
|
+
| ... | (other text properties included) | - |
|
|
799
|
+
|
|
800
|
+
### Line & Spacing
|
|
801
|
+
|
|
802
|
+
| Abbrev | Property | Notes |
|
|
803
|
+
| ------ | --------------------- | ----- |
|
|
804
|
+
| `lh` | `line-height` | - |
|
|
805
|
+
| `lts` | `letter-spacing` | `n:normal` |
|
|
806
|
+
| `wrs` | `word-spacing` | - |
|
|
807
|
+
| `lbrk` | `line-break` | - |
|
|
808
|
+
| `wrb` | `word-break` | - |
|
|
809
|
+
| `wrtm` | `writing-mode` | - |
|
|
810
|
+
|
|
811
|
+
---
|
|
812
|
+
|
|
813
|
+
## 6. Flexbox
|
|
814
|
+
|
|
815
|
+
| Abbrev | Property | Values/notes |
|
|
816
|
+
| ------ | ------------------- | ------------ |
|
|
817
|
+
| `fx` | `flex` | `i:0 1 auto`, `a:1 1 auto` |
|
|
818
|
+
| `fxb` | `flex-basis` | - |
|
|
819
|
+
| `fxd` | `flex-direction` | `r:row`, `rr:row-reverse`, `c:column`, `cr:column-reverse` |
|
|
820
|
+
| `fxw` | `flex-wrap` | `w:wrap`, `wr:wrap-reverse`, `n:nowrap` |
|
|
821
|
+
| `jc` | `justify-content` | `c:center`, `s:start`, `e:end`, `fs:flex-start`, `fe:flex-end`, `sp:space-between`, `sa:space-around`, `se:space-evenly`, `st:stretch`, `sc:safe center`, `uc:unsafe center` |
|
|
822
|
+
| `ai` | `align-items` | `n:normal`, `c:center`, `s:start`, `e:end`, `fs:flex-start`, `fe:flex-end`, `ss:self-start`, `se:self-end`, `b:baseline`, `fb:first baseline`, `lb:last baseline` |
|
|
823
|
+
| `as` | `align-self` | similar values as `ai` |
|
|
824
|
+
| `ac` | `align-content` | `s:start`, `e:end`, `sp:space-between`, `sa:space-around`, `se:space-evenly`, `st:stretch`, etc. |
|
|
825
|
+
|
|
826
|
+
---
|
|
827
|
+
|
|
828
|
+
## 7. Grid
|
|
829
|
+
|
|
830
|
+
(Full grid abbreviations and value mappings are supported — see original mapping for exhaustive list.)
|
|
831
|
+
|
|
832
|
+
| Abbrev | Property | Notes |
|
|
833
|
+
| ------ | ------------------------ | ----- |
|
|
834
|
+
| `g` | `grid` | - |
|
|
835
|
+
| `ga` | `grid-area` | - |
|
|
836
|
+
| `gc` | `grid-column` | `f:1 / -1` |
|
|
837
|
+
| `gtc` | `grid-template-columns` | `s:subgrid` |
|
|
838
|
+
| `gap` | `gap` | - |
|
|
839
|
+
| `ji` | `justify-items` | many mapping values (center, stretch, start, end, etc.) |
|
|
840
|
+
| ... | (other grid properties) | - |
|
|
841
|
+
|
|
842
|
+
---
|
|
843
|
+
|
|
844
|
+
## 8. Effects & Filters
|
|
845
|
+
|
|
846
|
+
### Opacity & Visibility
|
|
847
|
+
|
|
848
|
+
| Abbrev | Property | Notes |
|
|
849
|
+
| ------ | ---------- | ----- |
|
|
850
|
+
| `opc` | `opacity` | - |
|
|
851
|
+
| `v` | `visibility` | `c:collapse` |
|
|
852
|
+
|
|
853
|
+
### Filter & Backdrop
|
|
854
|
+
|
|
855
|
+
| Abbrev | Property | Notes |
|
|
856
|
+
| ------ | ---------------- | ----- |
|
|
857
|
+
| `flt` | `filter` | - |
|
|
858
|
+
| `bkdf` | `backdrop-filter`| - |
|
|
859
|
+
|
|
860
|
+
### Blend Modes
|
|
861
|
+
|
|
862
|
+
| Abbrev | Property | Values |
|
|
863
|
+
| ------ | ----------------- | ------ |
|
|
864
|
+
| `mbd` | `mix-blend-mode` | `n:normal`, `m:multiply`, `s:screen`, `o:overlay`, `d:darken`, `l:lighten`, `cd:color-dodge`, `i:color-burn`, `hl:hard-light`, `sl:soft-light`, `di:difference`, `e:exclusion`, `h:hue`, `sa:saturation`, `c:color`, `lu:luminosity` |
|
|
865
|
+
|
|
866
|
+
### Box Shadow
|
|
867
|
+
|
|
868
|
+
| Abbrev | Property | Notes |
|
|
869
|
+
| ------ | ------------ | ----- |
|
|
870
|
+
| `bxsh` | `box-shadow` | - |
|
|
871
|
+
| `bxshd`| `box-shadow` | - |
|
|
872
|
+
|
|
873
|
+
---
|
|
874
|
+
|
|
875
|
+
## 9. Transforms & Animations
|
|
876
|
+
|
|
877
|
+
### Transform
|
|
878
|
+
|
|
879
|
+
| Abbrev | Property | Notes |
|
|
880
|
+
| ------ | ------------------ | ----- |
|
|
881
|
+
| `tra` | `transform` | - |
|
|
882
|
+
| `tras` | `transform-style` | - |
|
|
883
|
+
| `rot` | `rotate` | - |
|
|
884
|
+
| `s` | `scale` | - |
|
|
885
|
+
| `trl` | `translate` | - |
|
|
886
|
+
|
|
887
|
+
### Transition
|
|
888
|
+
|
|
889
|
+
| Abbrev | Property | Notes |
|
|
890
|
+
| ------- | -------------------------- | ----- |
|
|
891
|
+
| `tran` | `transition` | - |
|
|
892
|
+
| `trand` | `transition-delay` | - |
|
|
893
|
+
| `trandur`| `transition-duration` | - |
|
|
894
|
+
| `trantf`| `transition-timing-function`| - |
|
|
895
|
+
|
|
896
|
+
### Animation
|
|
897
|
+
|
|
898
|
+
| Abbrev | Property | Notes |
|
|
899
|
+
| ------ | -------------------------- | ----- |
|
|
900
|
+
| `ani` | `animation` | - |
|
|
901
|
+
| `anide`| `animation-delay` | - |
|
|
902
|
+
| `anidu`| `animation-duration` | - |
|
|
903
|
+
| `anips`| `animation-play-state` | `p:paused`, `r:running` |
|
|
904
|
+
| `anitf`| `animation-timing-function`| `ei:ease-in`, `eo:ease-out`, `eio:ease-in-out`, `l:linear`, `ss:step-start`, `se:step-end` |
|
|
905
|
+
|
|
906
|
+
---
|
|
907
|
+
|
|
908
|
+
## 10. Overflow & Scrolling
|
|
909
|
+
|
|
910
|
+
### Overflow
|
|
911
|
+
|
|
912
|
+
| Abbrev | Property | Values |
|
|
913
|
+
| ------ | ---------------- | ------ |
|
|
914
|
+
| `ofl` | `overflow` | - |
|
|
915
|
+
| `oflx` | `overflow-x` | `c:clip`, `s:scroll` |
|
|
916
|
+
| `ofly` | `overflow-y` | `c:clip`, `s:scroll` |
|
|
917
|
+
|
|
918
|
+
### Scroll
|
|
919
|
+
|
|
920
|
+
| Abbrev | Property | Notes |
|
|
921
|
+
| ------ | --------------------- | ----- |
|
|
922
|
+
| `scrb` | `scroll-behavior` | - |
|
|
923
|
+
| `scrm` | `scroll-margin` | - |
|
|
924
|
+
| `scrsa`| `scroll-snap-align` | - |
|
|
925
|
+
| `sbc` | `scrollbar-color` | - |
|
|
926
|
+
| `sbg` | `scrollbar-gutter` | - |
|
|
927
|
+
|
|
928
|
+
### Overscroll
|
|
929
|
+
|
|
930
|
+
| Abbrev | Property | Values |
|
|
931
|
+
| ------ | ----------------------------- | ------ |
|
|
932
|
+
| `osrbh`| `overscroll-behavior` | `c:contain` |
|
|
933
|
+
| `osrbb`| `overscroll-behavior-block` | `c:contain` |
|
|
934
|
+
| `osrbi`| `overscroll-behavior-inline` | `c:contain` |
|
|
935
|
+
|
|
936
|
+
---
|
|
937
|
+
|
|
938
|
+
## 11. Lists & Tables
|
|
939
|
+
|
|
940
|
+
### Lists
|
|
941
|
+
|
|
942
|
+
| Abbrev | Property | Values |
|
|
943
|
+
| ------ | ------------------ | ------ |
|
|
944
|
+
| `ls` | `list-style` | `i:inside`, `di:disc`, `c:circle`, `s:square`, `de:decimal`, ... |
|
|
945
|
+
|
|
946
|
+
### Tables
|
|
947
|
+
|
|
948
|
+
| Abbrev | Property | Values |
|
|
949
|
+
| ------ | ------------------ | ------ |
|
|
950
|
+
| `tbl` | `table-layout` | - |
|
|
951
|
+
| `bdcl` | `border-collapse` | `s:separate`, `c:collapse` |
|
|
952
|
+
| `bdsp` | `border-spacing` | - |
|
|
953
|
+
|
|
954
|
+
### Columns
|
|
955
|
+
|
|
956
|
+
| Abbrev | Property | Notes |
|
|
957
|
+
| ------ | ------------------ | ----- |
|
|
958
|
+
| `col` | `columns` | - |
|
|
959
|
+
| `colc` | `column-count` | - |
|
|
960
|
+
| `colg` | `column-gap` | - |
|
|
961
|
+
|
|
962
|
+
---
|
|
963
|
+
|
|
964
|
+
## 12. Advanced Properties
|
|
965
|
+
|
|
966
|
+
### Containment
|
|
967
|
+
|
|
968
|
+
| Abbrev | Property | Notes |
|
|
969
|
+
| ------ | -------------------------------- | ----- |
|
|
970
|
+
| `cnt` | `contain` | - |
|
|
971
|
+
| `cntibs`| `contain-intrinsic-block-size` | - |
|
|
972
|
+
| `cntih`| `contain-intrinsic-height` | - |
|
|
973
|
+
|
|
974
|
+
### Container Queries
|
|
975
|
+
|
|
976
|
+
| Abbrev | Property | Notes |
|
|
977
|
+
| ------ | --------------- | ----- |
|
|
978
|
+
| `ctr` | `container` | - |
|
|
979
|
+
| `ctrn` | `container-name`| - |
|
|
980
|
+
| `ctrt` | `container-type`| - |
|
|
981
|
+
|
|
982
|
+
### Content & Counters
|
|
983
|
+
|
|
984
|
+
| Abbrev | Property | Notes |
|
|
985
|
+
| ------ | --------------------- | ----- |
|
|
986
|
+
| `ctt` | `content` | - |
|
|
987
|
+
| `cntri`| `counter-increment` | - |
|
|
988
|
+
| `cntrr`| `counter-reset` | - |
|
|
989
|
+
|
|
990
|
+
### Page Breaks
|
|
991
|
+
|
|
992
|
+
| Abbrev | Property | Notes |
|
|
993
|
+
| ------ | ------------------------- | ----- |
|
|
994
|
+
| `pg` | `page` | - |
|
|
995
|
+
| `pgba` | `page-break-after` | - |
|
|
996
|
+
| `pgbb` | `page-break-before` | - |
|
|
997
|
+
| `brka` | `break-after` | - |
|
|
998
|
+
|
|
999
|
+
### Other Advanced
|
|
1000
|
+
|
|
1001
|
+
| Abbrev | Property | Values/notes |
|
|
1002
|
+
| ------ | ------------------ | ------------ |
|
|
1003
|
+
| `a` | `all` | - |
|
|
1004
|
+
| `is` | `isolation` | `i:isolate` |
|
|
1005
|
+
| `z` | `z-index` | - |
|
|
1006
|
+
| `ord` | `order` | - |
|
|
1007
|
+
| `fl` | `float` | `is:inline-start`, `ie:inline-end`, `r:right`, `l:left` |
|
|
1008
|
+
| `rsz` | `resize` | `b:both`, `h:horizontal`, `v:vertical` |
|
|
1009
|
+
| `us` | `user-select` | `t:text`, `all:all`, `c:contain` |
|
|
1010
|
+
| `cr` | `cursor` | many cursor value mappings (pointer, default, move, not-allowed, grab, etc.) |
|
|
1011
|
+
| `toa` | `touch-action` | `p:pan-x`, `py:pan-y`, `pm:pan-x pan-y`, `pi:pinch-zoom` |
|
|
1012
|
+
| `zo` | `zoom` | - |
|
|
1013
|
+
|
|
1014
|
+
---
|
|
1015
|
+
|
|
1016
|
+
## 13. WebKit Specific
|
|
1017
|
+
|
|
1018
|
+
| Abbrev | Property | Notes |
|
|
1019
|
+
| ------ | --------------------------- | ----- |
|
|
1020
|
+
| `wlc` | `-webkit-line-clamp` | - |
|
|
1021
|
+
| `wtfc` | `-webkit-text-fill-color` | - |
|
|
1022
|
+
| `wts` | `-webkit-text-stroke` | - |
|
|
1023
|
+
| `wtsw` | `-webkit-text-stroke-width` | `m:medium`, `t:thick` |
|
|
1024
|
+
|
|
1025
|
+
---
|
|
1026
|
+
|
|
1027
|
+
## 14. Special Values
|
|
1028
|
+
|
|
1029
|
+
### Common Values
|
|
1030
|
+
|
|
1031
|
+
- `n` = `none`
|
|
1032
|
+
- `nm` = `normal`
|
|
1033
|
+
- `a` = `auto`
|
|
1034
|
+
- `i` = `inherit`
|
|
1035
|
+
- `in` = `initial`
|
|
1036
|
+
- `is` = `inline-start`
|
|
1037
|
+
- `ie` = `inline-end`
|
|
1038
|
+
- `tr` = `transparent`
|
|
1039
|
+
- `c` = `center`
|
|
1040
|
+
- `cl` = `collapse`
|
|
1041
|
+
- `l` = `left`
|
|
1042
|
+
- `r` = `right`
|
|
1043
|
+
- `h` = `hidden`
|
|
1044
|
+
- `v` = `visible`
|
|
1045
|
+
- `s` = `start`
|
|
1046
|
+
- `e` = `end`
|
|
1047
|
+
- `t` = `top`
|
|
1048
|
+
- `b` = `bottom`
|
|
1049
|
+
- `bs` = `block-start`
|
|
1050
|
+
- `be` = `block-end`
|
|
1051
|
+
|
|
1052
|
+
### Size Values
|
|
1053
|
+
|
|
1054
|
+
- `t` = `thin`
|
|
1055
|
+
- `m` = `medium`
|
|
1056
|
+
- `th` = `thick`
|
|
1057
|
+
|
|
1058
|
+
### Style Values
|
|
1059
|
+
|
|
1060
|
+
- `s` = `solid`
|
|
1061
|
+
- `d` = `dotted`
|
|
1062
|
+
- `ds` = `dashed`
|
|
1063
|
+
- `db` = `double`
|
|
1064
|
+
- `g` = `groove`
|
|
1065
|
+
- `r` = `ridge`
|
|
1066
|
+
- `i` = `inset`
|
|
1067
|
+
- `o` = `outset`
|
|
1068
|
+
|
|
1069
|
+
---
|
|
1070
|
+
|
|
1071
|
+
This reference covers the 409 CSS properties and their supported abbreviations in xCSS. To use them, combine property abbreviations with value abbreviations using the syntax:
|
|
1072
|
+
|
|
1073
|
+
```
|
|
1074
|
+
[MQ:][layer]<property><value>[@selector]
|
|
1075
|
+
```
|
|
1076
|
+
|
|
1077
|
+
(remember: `<property><value>` is required)
|
|
1078
|
+
|
|
1079
|
+
### Full example (HTML + usage)
|
|
1080
|
+
|
|
1081
|
+
```packages/fkui/css-dist/README-EN.md#L511-999
|
|
1082
|
+
<!DOCTYPE html>
|
|
1083
|
+
<html lang="en">
|
|
1084
|
+
<head>
|
|
1085
|
+
<meta charset="utf-8">
|
|
1086
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
1087
|
+
<title>Login</title>
|
|
1088
|
+
<meta name="description" content="Basic HTML5 sample">
|
|
1089
|
+
<style>
|
|
1090
|
+
:root {
|
|
1091
|
+
--primary-color: #007bff;
|
|
1092
|
+
--secondary-color: #6c757d;
|
|
1093
|
+
--success-color: #28a745;
|
|
1094
|
+
--info-color: #17a2b8;
|
|
1095
|
+
--warning-color: #ffc107;
|
|
1096
|
+
--danger-color: #dc3545;
|
|
1097
|
+
--light-text: #6c757d;
|
|
1098
|
+
--dark-text: #343a40;
|
|
1099
|
+
--body-bg: #f8f9fa;
|
|
1100
|
+
--div-color: #dee2e6;
|
|
1101
|
+
--bd3:1px 1px 1px 1px #dee2e6;
|
|
1102
|
+
--w:#fff;
|
|
1103
|
+
}
|
|
1104
|
+
</style>
|
|
1105
|
+
</head>
|
|
1106
|
+
<body>
|
|
1107
|
+
<div class="dF jcC aiC h100vh bgc--body-bg px10px">
|
|
1108
|
+
<div class="bgc--w p40px bda8px bxshd--bd3 w400px">
|
|
1109
|
+
<h1 class="taC c--dark-text mb30px">Login</h1>
|
|
1110
|
+
<div class="dF fxdC my8px">
|
|
1111
|
+
<input class="p8px" type="text" placeholder="Username">
|
|
1112
|
+
</div>
|
|
1113
|
+
<div class="dF fxdC my8px">
|
|
1114
|
+
<input class="p8px" type="password" placeholder="Password">
|
|
1115
|
+
<a href="#" class="c--primary-color taR mt8px">
|
|
1116
|
+
Forgot password?
|
|
1117
|
+
</a>
|
|
1118
|
+
</div>
|
|
1119
|
+
<div class="taC mt30px">
|
|
1120
|
+
<button class="bdN bgc--primary-color cWhite p12px w100% bdra4px">
|
|
1121
|
+
Login
|
|
1122
|
+
</button>
|
|
1123
|
+
</div>
|
|
1124
|
+
<div class="dF aiC my20px">
|
|
1125
|
+
<div class="fx1 h1px bgc--div"></div>
|
|
1126
|
+
<span class="px10px c--light-text">Or continue with</span>
|
|
1127
|
+
<div class="fx1 h1px bgc--div"></div>
|
|
1128
|
+
</div>
|
|
1129
|
+
<div class="dF jcC">
|
|
1130
|
+
<button class="bdN bgc--info-color c--w p12px mx8px dF aiC bdra4px">
|
|
1131
|
+
<span class="ml8px">Facebook</span>
|
|
1132
|
+
</button>
|
|
1133
|
+
<button class="bdN bgc--success-color c--w p12px mx8px dF aiC bdra4px">
|
|
1134
|
+
|
|
1135
|
+
<span class="ml8px">X-Twitter</span>
|
|
1136
|
+
</button>
|
|
1137
|
+
</div>
|
|
1138
|
+
<div class="dF aiC my20px">
|
|
1139
|
+
<div class="fx1 h1px bgc--div"></div>
|
|
1140
|
+
</div>
|
|
1141
|
+
<div class="taC">
|
|
1142
|
+
<a href="#" class="p12px">
|
|
1143
|
+
Create new account
|
|
1144
|
+
</a>
|
|
1145
|
+
</div>
|
|
1146
|
+
</div>
|
|
1147
|
+
</div>
|
|
1148
|
+
|
|
1149
|
+
<script type="module">
|
|
1150
|
+
import $ from "https://unpkg.com/@fwkui/x-css@1.0.2/index.js";
|
|
1151
|
+
$.cssObserve(document);
|
|
1152
|
+
</script>
|
|
1153
|
+
</body>
|
|
1154
|
+
</html>
|
|
1155
|
+
```
|
|
1156
|
+
|
|
1157
|
+
```packages/fkui/css-dist/README-EN.md#L1000-1005
|
|
1158
|
+
(End of translated README)
|
|
1159
|
+
```
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
```html
|
|
10
10
|
<script type="module">
|
|
11
|
-
import $ from "https://unpkg.com/@fwkui/x-css@1.0.
|
|
11
|
+
import $ from "https://unpkg.com/@fwkui/x-css@1.0.2/index.js";
|
|
12
12
|
$.cssObserve(document);
|
|
13
13
|
</script>
|
|
14
14
|
```
|
|
@@ -20,7 +20,48 @@ xCSS là một hệ thống CSS-in-JS cho phép bạn viết CSS ngắn gọn v
|
|
|
20
20
|
- Đọc/viết class theo công thức và hiểu nó biến thành CSS như thế nào
|
|
21
21
|
- Kiểm soát **media query**, **@layer**, **!important**, **selector** giả (pseudo) và tổ hợp nhiều thuộc tính trong **một class**
|
|
22
22
|
|
|
23
|
-
> **Lưu ý**: Danh sách viết tắt thuộc tính và giá trị sẽ có ở **
|
|
23
|
+
> **Lưu ý**: Danh sách viết tắt thuộc tính và giá trị sẽ có ở **phía dưới**.
|
|
24
|
+
## Thiết kế mới: Design Tokens (CSS Variables)
|
|
25
|
+
|
|
26
|
+
- Mục đích: Giảm độ dài và phức tạp của giá trị CSS trong các class, đảm bảo nhất quán branding và dễ bảo trì khi màu sắc, spacing, shadow, gradient… thay đổi.
|
|
27
|
+
- Cách khai báo:
|
|
28
|
+
- Đặt các biến trong thẻ style ở đầu tài liệu hoặc trong một file CSS được import trước khi dùng xCSS.
|
|
29
|
+
- Dùng cú pháp CSS biến bắt đầu bằng --, ví dụ: --bg-gradient-login, --panel, --shadow-card, --color-primary, --spacing-md, …
|
|
30
|
+
- Cách dùng trong xCSS:
|
|
31
|
+
- Dùng trực tiếp qua braces: bg{var(--bg-gradient-login)} hoặc bxsh{var(--shadow-card)} hoặc p{var(--spacing-md)}.
|
|
32
|
+
- Dùng alias có sẵn để biến đổi nhanh: bgc--panel hoặc c--primary (nếu có alias tương ứng với token).
|
|
33
|
+
- Có thể có fallback bằng var(--name, fallbackValue) để tương thích với trình duyệt cũ.
|
|
34
|
+
- Lưu ý: CSS biến phải được load trước khi render các class dùng biến đó.
|
|
35
|
+
|
|
36
|
+
- Ví dụ khai báo tokens (thêm vào đầu tài liệu hoặc một file style được import sớm):
|
|
37
|
+
```html
|
|
38
|
+
<style>
|
|
39
|
+
:root {
|
|
40
|
+
--bg-gradient-login: linear-gradient(#6a11cb, #2575fc);
|
|
41
|
+
--panel: #ffffff;
|
|
42
|
+
--shadow-card: 0 10px 20px rgba(0,0,0,.15);
|
|
43
|
+
--radius-card: 12px;
|
|
44
|
+
--color-primary: #0070f3;
|
|
45
|
+
--space-md: 16px;
|
|
46
|
+
}
|
|
47
|
+
</style>
|
|
48
|
+
```
|
|
49
|
+
- Ví dụ dùng token trong trang login:
|
|
50
|
+
```html
|
|
51
|
+
<body class="bg{var(--bg-gradient-login)} h100vh w100% dF jcC aiC">
|
|
52
|
+
<main class="w360px md:w420px lg:w480px bgcWhite p28px bxsh{var(--shadow-card)} bdra12px">
|
|
53
|
+
...
|
|
54
|
+
<button class="w100% p12px cWhite bdN bdra8px bxsh{var(--shadow-card)}" style="--color-primary: #0070f3;">
|
|
55
|
+
Đăng nhập
|
|
56
|
+
</button>
|
|
57
|
+
</main>
|
|
58
|
+
</body>
|
|
59
|
+
```
|
|
60
|
+
- Gợi ý migrates và alias:
|
|
61
|
+
- Nếu có alias như bgc--panel hoặc c--primary, bạn có thể định nghĩa token tương ứng và sử dụng đồng thời.
|
|
62
|
+
- Ví dụ: :root { --panel: #fff; } và dùng bgc--panel hoặc bgc{var(--panel)} tùy cách build.
|
|
63
|
+
|
|
64
|
+
- Xem thêm trong phần ví dụ và trang Design Tokens dưới đây để tham khảo cách tích hợp.
|
|
24
65
|
|
|
25
66
|
## Cú pháp tổng quát
|
|
26
67
|
|
|
@@ -2245,7 +2286,7 @@ _Bảng tra cứu này bao gồm tất cả 409 thuộc tính CSS và giá trị
|
|
|
2245
2286
|
|
|
2246
2287
|
<!DOCTYPE html>
|
|
2247
2288
|
<html lang="vi">
|
|
2248
|
-
<head
|
|
2289
|
+
<head>
|
|
2249
2290
|
<meta charset="utf-8">
|
|
2250
2291
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
2251
2292
|
<title>Login</title>
|
|
@@ -2311,7 +2352,7 @@ _Bảng tra cứu này bao gồm tất cả 409 thuộc tính CSS và giá trị
|
|
|
2311
2352
|
</div>
|
|
2312
2353
|
|
|
2313
2354
|
<script type="module">
|
|
2314
|
-
import $ from "https://unpkg.com/@fwkui/x-css@1.0.
|
|
2355
|
+
import $ from "https://unpkg.com/@fwkui/x-css@1.0.2/index.js";
|
|
2315
2356
|
$.cssObserve(document);
|
|
2316
2357
|
</script>
|
|
2317
2358
|
</body>
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var v="AFsAIgB3AGwAYwBcAHQALQB3AGUAYgBrAGkBBgBsAGkAbgBlAC0AYwBsAGEAbQBwACIALAEBAHQAZgEEAQYBCAEKAQwALQB0AGUAeAEGAGYAaQBsAGwBEgBvAGwAbwByARgBGgBzAQUBBwEJAQsBBgEjASUALQBzAHQAcgBvAGsAZQEwAHcAdABzAR0BNAEgATcBJAEGATsBPQE/ASsBLQEvARkBQgBzAHcBMwEfATYBIgFJAToBPAE+AREAdwBpAGQAdABoAQUAbQA6AG0AZQBkAGkAdQBtAHwAdAA6AWEAaQBjAGsBMABhAGMBHQF0AGMAZQBuAQYAYwEsAS4BBQB1ADoAdQBuAHMAZQB0AXMBdgEOAGcAbgErAXoBeQB0AQUAcwA6ATsAYQByAHQAfABlADoBeQBkAHwAZgGRAGYAbAEkAVoBlAGWAGYBmAGfAaEBmgB8AG4AOgBuAS4AbQBhAGwAfABiADoAYgBhAYQBDgEQAZwBswEnAHIBOwAgAbUBtwEPAGUAfABsAbMBFAG+AcAAZQG4AcMAcwBwAZIAcAF0AREAYgGFAQgBeQB8AHMAYQHPAdEALQGUAG8BggGbAYQB2gF4AC0AZQB2AXkAbAB5AdcBbQFLAYUAYwBoAdcAYwGSAGEBpQAgAXgBjQByAHwAdQHxAYIB2AH0AfYBIwFQACIAYQBpAQUBsABpAYoALQEMAGUAbQEyAHQBqwGtAHIBrwGxAfEB/wBlAfgBkQGTAZUBlwGZAG4BmwGdADoBpwB4AaICGgGlAiABoAIiAakAcwIYAcoAZgIjAZYB4QG3Ai0BqQGzAckBywG6AiAAaQG9AHQBvwG2AcoBwgHEAcYBtgI7AjUCPwFEAfIB/gGOAhYB+QH7AYMB8wBlAfUCSQIBAbYCBQGJAYsCMQEFAg8BrgGwAHwCFAJRAdcBkgB0AaMCGwIpAisAbAItAhkCLwGYAjEB5AIdAZwBngInAi4BnAGmAnACMwG0Aj0CNgBmAbsCOQHIAncCPwHFADoBxwJDAn0BuQE7AmAAcgHtAe8CRgH9Ak8CFQH4AfoBgQJNAkgB9wFzAlQAbAFzAG4CBAJhApgBrwB0AGkAbwBuApcBcAIFApsAYQKdAp8BKwEWAG8AcwEMAp4AbgEFAHIAOgKHAHABFAF4AHwB2QBhAGQBmwF0ADoBdwFqAHUBFAEjAHwAcgHZArICtABlACwAIAK4AroCuwLKAsgCvQBtAr8CpQHDAsMCuwLFAdECzgK5As4BdQK+AsABQAEZAGECmABkAGUCowBpApwCrQAtAuIBFAB5AqEBaALkAuYCpwFoAocAYwKmAq4BPAKxAeUCFgGEArYCvABsAgAAbgLSArYCsAGwAv4C0gAtAocB5gG9AcMAbgKwAhACEgLIAwcC+QHDAZQBqwMDAhYC/wEjAw8C+AMJAsgDDQGwAuwAdQLuAqUC5wBkAHUCwwL0AqEAZgBtAyEC9AAtAScBKQAtAG0AbwLiAQUAZgIgAS4AdwGUAGQAcwGyAnYBcQM4AHIDOgGqAbMBrQEQAsgBtQM+AzkDOwJ5AasAYgBvAWECyABmAzcDSQMcAp8C3gICApgCogKaAuUDIgKnAgoDJgLnAXwBggGGAt8CmAL1AuADWwMsAv8BZgGQAZIBDgLiAqEAcAINA2cC7wGLArMAYQB5AaIBIwEFAc4B0AB1AYQBmwKwAHIBggNlAGcCoQEbAysC5wKdAG0BDwBnAy0BggLzAq0BBQBlAGkBmQI9AgkAbgGXAG8DlQGEAC0B3gGWA5MDmgBlA5YBDwOdAHUBlgBsAoABwgGUAdcCGAEjAHACcQIwA64CbABkAXMAcAIFAHAAcAOiAsMAbgF4AWMBswFmAG4CvwBpATsALQBiA6YAdAKfAWwDNQE4ARsAaQHKAZsCNAPHA8kCFABoAGUBcQNNAHgBcwByAgUBzQPWAQYDXwBvA2wAMQAgAC8AIAAxAHwAdgA6ADEANgPkACAAOQEwAQoAZABmAQUDRwBrAGQBPQOvAy4CAAPwAGsAZgB2A/QBdAP9AdsAdgPDAGkAYgEoAQwC6wEZAGIAZwQAAXEAZwE9Ad8D8ABnAGEEDgBrBBAB3gIdAdwAdAJhAe4DwAGPAUMBkgBjAT0BKQGcAjgAeAFnAcQCgABvAGMDHgQLAGcAYgMqAHQD9QQYAd8DxQGgBBoDMQMzAg4BrAJaAbEBZALQAv0AaQKzAekCGAQjAGUB1gOaAG8DCALqAHwAZAA6AGQBlAE/A5gDqAGJAGgBIwOYAGMETwF8AU8C6AMyAGcBwwOUBFwBLgPFAyUDmABoA6gAaAM5AC0EVgIvA6gAcwBvAGYBDQIHBFcETgOUAWgAZgGlAocDvAHDAZgBJAETA34CrQB8AGgAOgBoAHUBzAHZAdgAdAMlA1wEWQA6BGMB+ABsAYAEkgOLAa0CqwB0BAoAIgQMARMEFgQ1BBoBEwRDA/QCNAEuAuIAcgPFAG8AeAB8AHABswHQArkDjASnBKkAYwGzAXwBjQF6BLABbAFuAUkEEwEdBDQEEQSfAX0D2wQcAW4DuwHNAZQBjgJcBI8DJQR7AHQEkAQTApkEvQQZAGQCCQGvBGAEEwPhBDMEAQSeBNIBLgIHAQ8EogG0BKQCFgS3BKsAOgStAWgAbgONA9gCXASzAp8EWAEGA9gEEwO2BNgEDwS+BNIAcAKqAqwCnwEFAW0DyABwAzwDTQQcAG8BawRVAGUEcgLCArEEdAGWAl0B9wHEAW0BoARyACAE/QJcAW0CjQURAG8E/gGVBQgAZwRXBRYE/gEDAoAFBQI7Ao0CXAULAgACUAUMAHIB8QByBQkFJwIAAkAFIAUQBQADyAFrBLIEjwJRAb8DTgUzAsIBswUrBRsCQwU5BQIE8QB4BJ0E9QAtBPcElwLnBUMAdAUEBQYDgQUJBMgCjQTxAHkFRATRBUYE+AMsBVMEwgUSBKMFAQU0BTYCkwQvBMEE0AQ2ArIDogQgA4EAZQO5AqUAfAB4AvcFagEGBKkAeQVuBWYALQRFAeIC0wGrBPUBqgQ9AwYFaQVmAsIBkQAgBWUCpQAgBMUCtQByBWgFbwWCBX4FawMLBXwFgwI7BPUEEwINBWMEGgKrAHoC4wTMBI8E7QIDAqAECwBsAGsFlAEtAXEBOgBpBZgD8ABkA/QE4QTBBE8AZAU5BCkDOgRQAbYD1QGbAGQBswWuAHUAYgGgAHwAZwA6BBgESwLTBQgAZARgAHwDlAEPAYQBlgRKA6YFyAWoBboAawWqA0AE4gW6BCwBcgQLBbYBAwXQBKUENwXUAU4BLgXNAaAF2QXSBaMAawOzBd8D1gXhBKYF0wWkAZoF3QIBAGIF1wBlBZQFqwXbBesFlgSYBeAAdAWtBa8FtQGRBFEAcwW0BE4FtwHeBboBwwW9Bb8B5gUHBSsFwwRhADoFxwGFAHwFygFDAYUF5gFUBDMF8wXqBeQF7AFeAWAAaAXfBfIF0QXpBeMCLgYeBLwGFwYiAmgF7QYeBh8F2gYYAi4BWgB5BfgF+gQcBbAF/QWzBbAGAgW5BbsGBgE9BcAGCQFfBcQFxgGDBg8GEQXMBdYFugFTBegF9AXkBigGGwFhBh4EIANNBiAGSgYvBjEEUAX7BE4GNQX/BjcGVgY5BgUFvgY8BggFTgYLBcUGDQZCBckAOgOeBkUEmgXXAV4GSQYtBk0GHQZGBm4FQABtBc0GJQZSBTIFAgYpBkYAbAViBhcGdARsBSEDBgK4AWkAcwXNBYgGcwVdAwYFCQaDAWgDfgXNATsGiQUzBlQFmQYyASMF/AWyBloFtQY4BgQFvAZfAG8GPQZiBkAGZQXIBhAGaAXLBhMGRgYVBlEGLAaABnAE+wFuAGgBDwB8BEABZwFpAWsBYQaxAXAF1QZrBJwGFgZSBFwBFANxBZkCKwHQAyYBwwIUASwGwgGEBagGdwXaBM0F1gRIBn4GUgXsBewCwwaOBoYG0QBzBtMF2gXsBigG1waFBagC5QQNBr8F2gNbBNUF1gKeBkkG5wERBmkGqQZrAjkG6wTUAREFkAGQAesBPAKIBgkFjAGWAHIFeQTRAl8FhgNWBe8DwwbyAGEEYAE6AQ4BeAbiBtsGzgTiBuwBOgHeBSkHAgFoBqsF8wcPBnAG4gbrAG4BywbiBw0EpgEPAcsGewbwBZkGrAcOBxsBwgXlBukF5wblByYHIQXsBtAHIwYrBy0HKAbeBfcHEwPOBxUGUgcgBzQEGgcYBukBkwcaByECaAcLBx4DlwdCAmEBlQciBwMCKgdBBygGKAE7BjAHNwZIBywHHwcnARAGLgc+BvABOwBsB00HVwdQAaAG4gBuBzkG5gdWAV0BXwZOBdYHXAdUBoEEcgWoBdgHawUPAXsEwAduBzIEpgdxBpQHbgdjBOIHdwavBVoGsgOYBrUGjga4BIQBbwFxBagEFQdrBuAGjwXWAsMGSQeKBtkGawbcBOIFPQRXBagFKQeOBowHMAXvAb0HmAU+BpQBBQFgBlYGMwaYBf4GAAIYASwBXwYBBlwGnQY7BqAGYQXCBkABqwYOBckDpganBhIDYweRB3oEpgeUAR4HZwFiB34GsweBBrcBbAeEBrIHhgXWAc0GSQWGA4wFqAGEB5IEpgYoBtYGhAeLBmsCKgfPBi4G3wfTB5AF7wd1B58F+QFtBa4HowZYBpkHpgGSB6gGmwerBjoGnwahB7AEYQeyBmYGEAe1Bu4HuAXvBlAF8wT9BagEzAZJBP0HSgFgBn0H+wUXB2wD3wfaB/kGiAdrB/wHvAaNBuEF1gFDCAADrwdfBpUH4AZXBbEHpQQpB6cDbgeqBbgHrAfrB68GCgexBqQGQwfyBqgH9AFgB7oBIggBB30E/Ad/BrQBZQa2AWoHxAa6B8cGawgmCCkGugeACC0HgggwB4UGvABiBaoFXQaHBaoCIgLiAXwD4AGLAGIChwBhBc8FmgETA1UHAAcJBwIAeAX/BakGFgIiBf8CuABvAHcD8AhRB78D2AE6BGoFrghZBAsIUQB6CEEFpQB6B8wECwByAGsHiAhHA6IF5AHzA/sIaQBrCD0EMwhIBeQB0wNRAocD8AhqBM8IdgOXAqsDbwEZBC0DcQEFCIMDLAiAA1YEIwf6BMwExgdyAU8BMAETBMEBEwO6CJAAbAO4CIUBDgOvAdAHaAAiAR0EkAEFBkED1QUrAZYE/ATEBsYBjgiQBKEEzATAA5cCAAT3AsACrQiQAUQHvwSQAToB7gILCIkBLAieASwBagGLA2EBegiQASwD8wirBJQBiwMuApYIggEsBuQEXAi9AC0EFAEXCMkH/wjECM0DggdgCNEHlwjTAG0BiwjVAREHMARcB5wI2QjbAr8BEQgQCMEGfQYVCMwI2gMGCOMBBwe+COYCDQjpAlYB0AWeCJ0BLAjoCLwI6gdZBFwIhQj4AYMIkAF6CPwBegWdCP8CnQBiCPAFnAOkAQ8BPAXHAXAGUwWXCIkBegBpCLQJCAGLCQoFKwGDCQ0D1QUJCQQAaQcECKsJAgkJAXoJFwKrAGMHRgdOBaYJEAKdCQcJIAkVCSIJDAklCQ8IqQj3CSwIrQkjCQ0I+gE8CQECYQHCAgEC8wb9CToFnQTiA2oIiQE8BCAEtAk7ARAEpgSYA7kIkAQcCToIqAiCCS4I/ANiByYERwQfCQQIBgi/AgAFfQZqAGMJIgkHCVQH0AbvBCMIhQMlBHAEwQN8AG8JCgJKBa0FBQBhAr8FCgFkCUcBWQPAAHUEgwSFAcoE/gBwBb0AcAE9BBAF8QM7AHcAOgM4AQwFUAHKAbEE/AFJA+gBbQMIAp0ELQEqA8wCtgOoAgYBtgJcAc4BfABwAekDMQFlBj0CHQV8A/cFFwGqAdkBrQEGAbABLQEIAZsEEAZfAGEAYgW8AbMEEAmsBAcE6AK2AZEJpgi2BCQCEwEsArAEXAlcCSgCwgOBCFgJvQWYAaoDDAnCBH0CsAb0BfEJvgbbAZIJxgB8AHcCsAB3Cc4JSQGsCckJDwHXAhYBkgnWCcsJ0AGSCdIChwnXAGUJ3QniCdMJzAGDCdMF8QmCARABUwnTAHcB4QdiA5wJ4Am+CGcAOgB6BqAAbQOXAHwJ9gn1CfcDpQe4AvEHoAI5A94IsQEZCFMBaAHNAuoD9AG0BeMFxQGzBzsHVwYYBmQKDwHDAzUCIQXFAzUKEwMtAicEuAJhBp0BDAZlByEKHQW7BMwBzgoiCN0AYQBwAvQBbAF4ASkBbgmsAaABEgmHCisBLAouBgQBTgi9CjMAbAW9CiYKNwjqBDUE/gEbCjsKLwERA1EDTgTiCj8HxApCCjYD1QK4CkcEEQpAAHIKSgowAT0J0gpIAvYKPApUAZwCsAGfCcEGPAGWBjsHqQIHCiAHKAQQB6kGyQS1AUMBxAOUAQ4DxAIKBnUBGQILAHABHQpxBJgKMQEpB5ABnwQgA/oCFgEwAGYFSgIhCKAAOgAwA+YCyQOmAG8C+wPjA+MJbwPICn0AeAh0AiEDxQG2A8MKjQhTCpAC8QoDBPoC9gpZBYgCsQpdAxoC+gbJCMUCXAm7CP0FfQMIBswBGQp+CMMKkApcCGEAIgp+BuQKkAQYCq4KfgINCpAF/wkXBrwKfgYVCpAJ0AooAQUJggq+BP4J3QrCCqYDEQV7Aa0Kwgp9B2oKXAKlCKABkQoZAmgFxQGYChkBqQVOBT4EKgdxCn0C9QNRCMAKqQqrBO0DLQEVASgFWQHZAHUAaQE6AuAAcwE6AhYAaQBmAsgAcwB5ATsCCwAtCucK8ArqCuwFKwrvACAAJwBBA7gBoAAgAEMEwAAgAEUDMQBqAGkAJwLIACcAUwBlAGcAbwJPAFUASQsECwYLCAsKCwwLDgsQCxIAUwB5AG0DTQBsCwkK/ABOA04AbwsBCwMLBQBvCwcAJwJfCucK+QruAsgARwBlAS4AZwBpAGECyABDARUIRws0CwoAVALlBfEAIABOCeIAIABSBQIC4AsgCzwBZgBzCvAK7QBmCCwLLAMxBJYB0AF4AsgAUwBGAE0CnwBvAC0AUgsNAtEAcgLIAE0B5wBvC14CnwF0C2ELJQGDASwBtgsKAEwEBgIWBI0AIAtWAa0LIAAnCwIDJQPOAHILPwniCyALTwKqC1EDVgBmAG4K4AS2AGYK4wHoCtsBnQM0CuEBpQKlAyUI5AGFAp0E6Ap4AG4ISgrdAQYBPwb9CGgKrwcbBNcLlARsAuAAZwB1BwYG7QMIBgoLfgSWC4gEtgUXCY4BsAhmC5gLfwTyC5wB0AGgBjMK2wq2CuEJMQqpAk0LpwFKCSgB3ABkAGoDfge4C38BSwu6AVoChwTMBnELmQdQC8QI5Qu4CvEK3Au2AHkBegPVAqsLkQfJARsL0AvSCcoK6wVHBPkI9AvCAUQLywvRAWEL2gE6AhIBKgiDC9ULtQS2C84L4wvUB3gLzQq8C9gL7QPDATQJGwu4A/8L1wS2AHYBlAs0Ct4LmQv7C8QL+wUrAuAJpQL9AxYC0guRAHYBHQucDAIL/QF7CigMCQOiDAEL/AwEAeQCQgHcAqsC4ArbAeYMEwwDBLYCCwsoAGkMGwrMCuEMDQwVAYkLiwngDBsLzwv6DBQEtgPBAWYFKwBjDBsLrwwlDC4BBgvcAycL9wvqAQYMJgiHC44DjAp4C/EEtgEIC/YLmQxDAR4DkwU+Cn0ELQuIBxIE0gi1ArgLvwE7ATAIzwEFCM8MVQxXBgoMVQeICmUE0gTGAGEMXAEdDF4B3AqGCj0BgwFjAXABZQOkCXMBega0ArsBrwIiDG0BlgBtBEABDwxxACgAMALIADEAZgByACkMXAjDDGQKiwtYCq0CrwqdAHcFUAj9BE4EUAF5AvoDQAyHACAC4gZCAlwEWwj9DJEMjQNWBBQEwQyCDGYKVAINA4sB8QSVAYwE7gxvDKEAYQxyBO0Exwx1DGsAbgx4DHoD5gx9DH8BGQBnDGMGCgxnAzQD6gPtAC0AMQxVA70AdAxkCPEHKQAiDLQCDQzACqUHQwyzDJsMtgpUDLgD4wPlDLsMVQKHDFoBXwMGCcEBmgzRDMUMywnBDMgMwwQgDGQBIwEWAt0MVQJhDNME0gzgA3YBIwHcCEgHkABnCIsM3wpxAt0MZwINAhgFuQxeDOMMygzUDOcM8QyeA2wAcwz1DFsBGQBoBPIEagToBK8AcAOPBIsEjQEwB78JGgU+DGkMoQxsDKkMbgGvDKYMqApoAZwB8QEnB3IKaA0LAR0AaAB5AHAD1QMXCN0EagLDAvMKfA0BB28NHw0hAXkDBQEOA4sBew0lB5ANKwEFDSsNIgyfAWUC4AugCMgAIgbjBNcHDwTcAY4NCgEZBuMEwQcPBHsEpQuYBccIoAdlCGYDVgKZB7MBMAQGBaANTAXIBkoNUgHTDVUBhQZTDNcNRAkGDOQLjw1WBi0M3AkdDVoBBgoTDVIDzg1mCSYHVw1dDT0JHgezDWwI5AdIB7gNcARwCLAKmQXGDXcC0gEwAGoBHQxTAp0AZgN4DHMIhQVfBS4DrQJiBH4CbQIfCrcNdAJyAiYBqAJtBUwG/AUaBHUCWQIRAlsBzQV3A8UB1ARIA5gB2A2bAd0B3wnYDZsC+AcbBEUG9wvGAe4B8AJHAowCXgKPAfwCTgUtDSgAIgsHAQUNgAruA3gKbgINDZcCEgHqAoYG+QUlAkoNiAIaDYoCHgJvAaEK0gIlCpACZAnaAmYDsAJqAiwDswrZBSEGPgrYAjQCgwoUAnoCOgI8AcEBuQJ/AoEN3QI+Dd8CsAGgBBQAYwB5BYIFTwotDeYBdA3pB3EBxAHxDe0N6A2zAhcB8QKLDfUCSwKQDfgFUQEZAGoCDQ24DYIK7AJmAlgEPQ2YAbEChQHsC8cJhgUMDcQDnwIcDccNkAhVDY4NywJ0Am0CKg3OAmcNjgIwDdIBqQ2TDdYEdQ3YDd4BzA33DbIFIw2wApENrgVgACIHagraARkC/QINC7IJWwfLBOgOBQMdDTwBxQhqAQUHIQhtCEkBMABsB78HIQ0NB5UOLw4xA8MBSgc2CoEJDALiBHYEUAPDAGMFUAI5CJMHAABxC6AChwROAZgIQwNbAbEGBgsxClEL/QorA5QBPAK4ARIHfwXxAREBDwh5Db4AawA6CGsAbgL/BFEOPwKrDjsORwaUBNMLoQ4/A8ME8gpsDkgHUQVWBUgNeQakAV8BwwZEDoMOcgQgDnwOdglLBpUEdw5PDlEFKQW7AhgOVQTGDlgMjABjDlsGngRgCzIOYATMDmIG1w5lAcIDnA5pBD4AfA5sDm4OcAxhARkEMgGvDl8I9AsdDVQAdA6sCzMIRgXjATALHQWZDrIDpAYtDW4LHQdADrEBlA6zCQ4NdA62CHQOuQhGBnQOtgTeDr8OrQ1yDskOuA7ACSEHLgIdDskOvg7GDXIGIw6qB2oO1g4uACIAbQTBDtYHvA62BCAO1gf4DqoAcwhKAa8O5w62DucOxQG2CHcFqw7rCHMOqw7uBKcGUgQ6A1YCDAhzBNcO6Q7vBlIH8w7xCEcBYw70ByUHuwb7DwAMnw8DBfMAcwhPDwcI2A78DvUF2gRwAyUHCg7mCHMGFQ8PDwQI7QYcDvEBHQ8PBKAI0A7dDucAYwTyDx4FAgw5DvgO5wKZDw8G7A7xDvMO5wMwAzIPKABrDvsO9ATcDrMO8Q8kDvQMOQoEDyEAaw7fDvQFkA7xDwgPLwu3Dz0O4w70DosO4ghTApwAaALoBWkInABtCA0OvwFhC+8O3QkGDwICIg1jCSgOtge/DHEALQ5DB7gDiw8IAiIK0Q9bDqoPFwynDxoPUAB4D2gCIgdZA4sPVw6xDroGJw9mDt0JEgxpAYsPYAzNADAAMAAlBrQMagyiDHMMpQ05DRYMpAEcAjgNGwTuDtQIZA9yCS0HQg91A4sPFwOkB30DNQAxD3wPfgygDKwMowyqDHAPaQ+CD4cNGg+bC/4LHQ9LAGkPWQQ4BNIO9w42DqQEQAlwBEMB6AcABEcESQZoBEwDdwyLBFEIagHWBFUFCQHWBFoFmwRdBa4GYwRiCKwDxgb9BIMEaQRrBG0B1wRvBHEEcwrYAWgOTgR5AhYBeQK1BH4AeASAAqsDyQSEBIYEiAHyBIsIRQyJAU8BxASTAWoBDwVXBJkEcQEFAG8AYgBqA94DLQEMDYUJRwWdAlwD6QF8AwgEJgjHAdcETwFEAbABEQhgCPQFFw/qD+wP7g87CpkFXAU6DcIEkQUwDZQHvAocCaEN4AUhBTgFXQUNEAsFHQU7DZUFPxATBRkHvAUdATAEcQINBHEBnQbvBHEHiBAhDVYC4AHuBd4BGQRxCFMQJg1bCgcCmg8UACIEcQTyEC4MOAKlC8gQNATXEDYOfwvdEB4MfQ/qBHkNVgE9AmEBIxAeCnIP6gtRBAkQHgNAD+oGIBBMEDUAcg0hCuoQHgEOD+oDpgccECsHbwOeByEInwKdBmUIogmFAhQEygGOCwIP4gilCuoIpwv+AX0QVwVLBygQNhBVECAQWAdODkkH3weiBpcH4wgVAeAH5ggYBbYH6QZeBgcFwQgeB+4IIAe0AW0O/xBaBhUQXAcoCDUBbwg3AWYIOQa5CDsQPwdqBcAAcgqtEJQQJQMICq0B3AO8AGgQKhAzAZ8IdBCWEJwGGBCUAGMEMhCkCacBEgiZAzAO0BAAAZ8CmRCqCcENaBArAZ8QihCbEKsKwg/xCJkPsQm4EJQFShCzCdIFSgIUEL0ERhC/ELYB6A/qELkJwQVZEMUEQxC+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",N=A=>({all:A=A||new Map,on(B,g){let Q=A.get(B);Q?Q.push(g):A.set(B,[g])},once(B,g){let Q=(...Q)=>(A.get(B)&&A.delete(B),g(...Q)),w=A.get(B);w?w.splice(0,w.length,Q):A.set(B,[Q])},off(B,g){let Q=A.get(B);Q&&(g?Q.splice(Q.indexOf(g)>>>0,1):A.set(B,[]))},emit(B,g){let Q=A.get(B);Q&&Q.slice().forEach(A=>{A(g)}),Q=A.get("*"),Q&&Q.slice().forEach(A=>{A(B,g)})}});function $(A){try{let B=atob(A);return Uint8Array.from(B,A=>A.charCodeAt(0))}catch(A){throw new Error(`Failed to convert base64 to buffer: ${A.message}`)}}function T(A){try{let B=_(A);return new TextDecoder("utf-8").decode(B)}catch(A){throw new Error(`Failed to decompress to string: ${A.message}`)}}function _(A){try{let B=$(A),g=[];for(let A=0;A<B.length;A+=2)g.push(B[A]<<8|B[A+1]);let Q=new Map,w=256;for(let A=0;A<256;A++)Q.set(A,String.fromCharCode(A));let E=Q.get(g[0])||"",e=E;for(let A=1;A<g.length;A++){let B=g[A],C=Q.get(B);C||(C=E+E[0]),e+=C,Q.set(w++,E+C[0]),E=C}return(new TextEncoder).encode(e)}catch(A){throw new Error(`Failed to decode and decompress to buffer: ${A.message}`)}}var AA=(A,B)=>{B=B||"fwkui";let g=Array.from({length:24},(A,B)=>"l"+B);if(!A.querySelector('style[id="'+B+'"]')){let B=document.createElement("style");B.id="fwkui",A instanceof ShadowRoot?A.prepend(B):document.head.append(B);let Q=`@layer ${g.join(", ")};`,w=setInterval(()=>{B.sheet&&(clearInterval(w),B.sheet.insertRule(Q,B.sheet.cssRules.length))})}},m=(A={css:"",gValue:{},exNames:[],mQuery:[],valueExt:{}})=>{let B=JSON.parse(T(v)),g={};var Q={};let{css:w=null,mQuery:E=[],gValue:e={},valueExt:C={},exNames:t=[]}=A||{};Array.isArray(E)||(E=[]),Array.isArray(t)||(t=[]),Object.getPrototypeOf(e)!==Object.getPrototypeOf({})&&(e={}),Object.getPrototypeOf(C)!==Object.getPrototypeOf({})&&(C={});var s={n:"none",nm:"normal",a:"auto",i:"inherit",in:"initial",is:"inline-start",ie:"inline-end",tr:"transparent",c:"center",cl:"collapse",l:"left",r:"right",h:"hidden",v:"visible",s:"start",e:"end",t:"top",b:"bottom",bs:"block-start",be:"block-end",...C};let r=()=>{let A={},g={};for(let Q of B){let[B,w,E]=Q.split("\t");if(A[B]=w,E){let A=Object.fromEntries(E.split("|").map(A=>{let[B,g]=A.split(":");return[B,g]}));g[B]=A}}return{p:A,v:g}},D=A=>{if(t.length>0&&t.every(B=>B.includes("*")?new RegExp("^"+B.replace(/\*/g,".+")+"$").test(A):B==A))return null;let B=new RegExp(["^((?<m>xs|sm|md|lg|xl|2xl|sma|mda|lga|xla):)?","(?<l>[0-9]*)?","(?<p>",["(",["(\\[([a-zA-Z]+)\\])"],"|",["(","((-w|[a-z])((-)?[a-z])*)","(([A-Z#!])|((-)?[.0-9])|(--|{|'))","([^&@]+)?",")"],")"],["(&","((-w|[a-z])((-)?[a-z])*)","(([A-Z#!])|((-)?[.0-9])|(--|{|'))","([^@]+)?",")?"],["(&","\\[([a-zA-Z]+)\\]",")?"],")","(@(?<s>.*))?$"].flat(1/0).join("")),{m:g="default",l:Q=0,p:w,s:E=""}=B.exec(A)?.groups??{};if(!w)return null;let e=w.split("&").map(A=>G(A)).filter(A=>A);if(0==e.length)return null;let C=E.replace(/(';|;)/g,A=>"';"==A?";":" "),s=CSS.escape(A),r=`selector(${s}${C})`;return C&&!CSS.supports(r)?null:{media:g,layer:Q,className:s,property:e.join(";"),selector:C}},G=A=>{let B=(A=>{let B=new RegExp("^(\\[(?<p>[a-zA-Z]+)\\])$"),{p:g=""}=B.exec(A)?.groups??{};if(g&&e[g]&&Array.isArray(e[g])){let A=e[g];if(A.every(A=>CSS.supports(A)))return A.join(";")}return null})(A);if(B)return B;let w=new RegExp(["^(?<p>(-w|[a-z])((-)?[a-z]+)*)","(?<v>(([A-Z#!.{'])|((-)?[0-9])|--)(.+)?)$"].join("")),{p:E,v:C=""}=w.exec(A)?.groups??{};if(!E||!C)return null;let t=g[E]||E,r=C[0],D=C.substring(1),G="!"!==r?C:D,c="!"==r;G=G[0].toLowerCase()+G.substring(1),G=G.startsWith("--")?"var("+G+")":G.startsWith("{")&&G.endsWith("}")?G.substring(1,G.length-1):Q[E]?.[G]||s[G]||G,G=G.replace(/(';|;)/g,A=>"';"==A?";":" ");let o=G+(c?" !important":""),I=[t+":"+o];switch(t){case"mx":I=[`margin-left:${o}`,`margin-right:${o}`];break;case"my":I=[`margin-top:${o}`,`margin-bottom:${o}`];break;case"px":I=[`padding-left:${o}`,`padding-right:${o}`];break;case"py":I=[`padding-top:${o}`,`padding-bottom:${o}`];break;case"bdx":I=[`border-left:${o}`,`border-right:${o}`];break;case"bdy":I=[`border-top:${o}`,`border-bottom:${o}`]}return I.every(A=>CSS.supports(A))?I.join(";"):null},c=A=>{var B=[...A?.classList||[]].filter(A=>{if(A){let B=45==A.charCodeAt(0)?A.charCodeAt(1):A.charCodeAt(0);return B>=97&&B<=122||B>=48&&B<=57}return!1});return A?.children?.length>0&&Array.from(A?.children).forEach(A=>{B.push(...c(A))}),B.flat(1/0)},o=(A,B)=>{if("function"!=typeof B)throw new Error("Callback is not a function");if(!A)return;let g=null;A instanceof Document?g=A.documentElement:(A instanceof ShadowRoot||A instanceof HTMLElement)&&(g=A),g&&(B(c(g)),new MutationObserver(A=>{for(let g of A)if("attributes"==g.type&&"class"==g.attributeName){if(1==g.target.nodeType){let A=String(g.target?.className??""),Q=String(g?.oldValue??"");if(A||Q){let g=A.split(" ").map(A=>A.trim()).filter(A=>A),w=Q.split(" ").map(A=>A.trim()).filter(A=>A);g=g.filter(A=>!w.includes(A)),"function"==typeof B&&B([...new Set(g)])}}}else if("childList"==g.type&&g.addedNodes.length>0){let A=[...g.addedNodes].filter(A=>1==A.nodeType).map(A=>c(A)).flat(1/0);"function"==typeof B&&B([...new Set(A)])}}).observe(g,{attributes:!0,attributeOldValue:!0,attributeFilter:["class"],childList:!0,subtree:!0}))};return{buildCss:(A=document)=>{let B=A?.getRootNode();if(!B)return;let e=new Map;var C=r();g=C.p,Q=C.v,AA(B);let t=N(),s=[{default:""},{xs:"screen and (max-width: 575px)"},{sm:"screen and (min-width: 576px)"},{md:"screen and (min-width: 768px)"},{lg:"screen and (min-width: 992px)"},{xl:"screen and (min-width: 1200px)"},{"2xl":"screen and (min-width: 1400px)"},{sma:"screen and (max-width: 768px)"},{mda:"screen and (max-width: 992px)"},{lga:"screen and (max-width: 1200px)"},{xla:"screen and (max-width: 1400px)"},...E],G=s.filter((A,B)=>s.findLastIndex(B=>Object.keys(B)[0]==Object.keys(A)[0])==B),c=G.map(A=>Object.keys(A)[0]),I={},a={root:new CSSStyleSheet},l={root:""},n={root:[]},H={root:!1};c.forEach(A=>{I[A]=new Set,a[A]=new CSSStyleSheet({media:G.find(B=>Object.keys(B)[0]==A)?.[A]||""}),l[A]="",n[A]=[],H[A]=!1}),w&&Array.isArray(w)?(l.root=w.join("\n"),a.root.replaceSync(l.root)):(l.root=w||"",a.root.replaceSync(l.root)),["root",...c].forEach(A=>{B.adoptedStyleSheets.includes(a[A])||(B.adoptedStyleSheets=[...B.adoptedStyleSheets,a[A]])});let M=(A,B)=>{let{media:g,property:Q,selector:w,layer:E,className:C}=B,t=a[g],s=I[g],r=l,D=n,G=H;E=Number(E)||0;let c=C,o=e.get(A);var M=`@layer l${E}{${o?`.${o}${w}`:`.${c}${w}`}{${Q}}}`;s.has(M)||(s.add(M),D[g].push(M),G[g]||(G[g]=!0,queueMicrotask(()=>{let A=D[g];A.length>0&&(r[g]+=(r[g]?"\n":"")+A.join("\n"),t.replaceSync(r[g]),D[g]=[]),G[g]=!1})))};return t.on("observeDom",A=>{A.length>0&&A.forEach(A=>{let B=D(A);B&&M(A,B)})}),{clsx:(...A)=>{let B=A.map(A=>Array.isArray(A)?A:[A]).flat(1/0).map(A=>A.split(/(\s|\t)+/g).filter(A=>A.trim())).flat(1/0);B=[...new Set(B)];let g=B.map(A=>{if(e.has(A))return e.get(A);{let B="D"+e.size.toString(32).toUpperCase();return e.set(A,B),B}});return queueMicrotask(()=>t.emit("observeDom",B)),g.join(" ")},observe:()=>{o(B,A=>{A.length>0&&A.forEach(A=>{let B=D(A);B&&M(A,B)})})}}}}},BA=(A,B)=>{m(B).buildCss(A).observe()},gA=(A,B)=>m(B).buildCss(A).clsx,oA={css:m,cssObserve:BA,clsx:gA};export{gA as cssClsx,BA as cssObserve,oA as default,m as xcss};
|
|
1
|
+
var v="AFsAIgB3AGwAYwBcAHQALQB3AGUAYgBrAGkBBgBsAGkAbgBlAC0AYwBsAGEAbQBwACIALAEBAHQAZgEEAQYBCAEKAQwALQB0AGUAeAEGAGYAaQBsAGwBEgBvAGwAbwByARgBGgBzAQUBBwEJAQsBBgEjASUALQBzAHQAcgBvAGsAZQEwAHcAdABzAR0BNAEgATcBJAEGATsBPQE/ASsBLQEvARkBQgBzAHcBMwEfATYBIgFJAToBPAE+AREAdwBpAGQAdABoAQUAbQA6AG0AZQBkAGkAdQBtAHwAdAA6AWEAaQBjAGsBMABhAGMBHQF0AGMAZQBuAQYAYwEsAS4BBQB1ADoAdQBuAHMAZQB0AXMBdgEOAGcAbgErAXoBeQB0AQUAcwA6ATsAYQByAHQAfABlADoBeQBkAHwAZgGRAGYAbAEkAVoBlAGWAGYBmAGfAaEBmgB8AG4AOgBuAS4AbQBhAGwAfABiADoAYgBhAYQBDgEQAZwBswEnAHIBOwAgAbUBtwEPAGUAfABsAbMBFAG+AcAAZQG4AcMAcwBwAZIAcAF0AREAYgGFAQgBeQB8AHMAYQHPAdEALQGUAG8BggGbAYQB2gF4AC0AZQB2AXkAbAB5AdcBbQFLAYUAYwBoAdcAYwGSAGEBpQAgAXgBjQByAHwAdQHxAYIB2AH0AfYBIwFQACIAYQBpAQUBsABpAYoALQEMAGUAbQEyAHQBqwGtAHIBrwGxAfEB/wBlAfgBkQGTAZUBlwGZAG4BmwGdADoBpwB4AaICGgGlAiABoAIiAakAcwIYAcoAZgIjAZYB4QG3Ai0BqQGzAckBywG6AiAAaQG9AHQBvwG2AcoBwgHEAcYBtgI7AjUCPwFEAfIB/gGOAhYB+QH7AYMB8wBlAfUCSQIBAbYCBQGJAYsCMQEFAg8BrgGwAHwCFAJRAdcBkgB0AaMCGwIpAisAbAItAhkCLwGYAjEB5AIdAZwBngInAi4BnAGmAnACMwG0Aj0CNgBmAbsCOQHIAncCPwHFADoBxwJDAn0BuQE7AmAAcgHtAe8CRgH9Ak8CFQH4AfoBgQJNAkgB9wFzAlQAbAFzAG4CBAJhApgBrwB0AGkAbwBuApcBcAIFApsAYQKdAp8BKwEWAG8AcwEMAp4AbgEFAHIAOgKHAHABFAF4AHwB2QBhAGQBmwF0ADoBdwFqAHUBFAEjAHwAcgHZArICtABlACwAIAK4AroCuwLKAsgCvQBtAr8CpQHDAsMCuwLFAdECzgK5As4BdQK+AsABQAEZAGECmABkAGUCowBpApwCrQAtAuIBFAB5AqEBaALkAuYCpwFoAocAYwKmAq4BPAKxAeUCFgGEArYCvABsAgAAbgLSArYCsAGwAv4C0gAtAocB5gG9AcMAbgKwAhACEgLIAwcC+QHDAZQBqwMDAhYC/wEjAw8C+AMJAsgDDQGwAuwAdQLuAqUC5wBkAHUCwwL0AqEAZgBtAyEC9AAtAScBKQAtAG0AbwLiAQUAZgIgAS4AdwGUAGQAcwGyAnYBcQM4AHIDOgGqAbMBrQEQAsgBtQM+AzkDOwJ5AasAYgBvAWECyABmAzcDSQMcAp8C3gICApgCogKaAuUDIgKnAgoDJgLnAXwBggGGAt8CmAL1AuADWwMsAv8BZgGQAZIBDgLiAqEAcAINA2cC7wGLArMAYQB5AaIBIwEFAc4B0AB1AYQBmwKwAHIBggNlAGcCoQEbAysC5wKdAG0BDwBnAy0BggLzAq0BBQBlAGkBmQI9AgkAbgGXAG8DlQGEAC0B3gGWA5MDmgBlA5YBDwOdAHUBlgBsAoABwgGUAdcCGAEjAHACcQIwA64CbABkAXMAcAIFAHAAcAOiAsMAbgF4AWMBswFmAG4CvwBpATsALQBiA6YAdAKfAWwDNQE4ARsAaQHKAZsCNAPHA8kCFABoAGUBcQNNAHgBcwByAgUBzQPWAQYDXwBvA2wAMQAgAC8AIAAxAHwAdgA6ADEANgPkACAAOQEwAQoAZABmAQUDRwBrAGQBPQOvAy4CAAPwAGsAZgB2A/QBdAP9AdsAdgPDAGkAYgEoAQwC6wEZAGIAZwQAAXEAZwE9Ad8D8ABnAGEEDgBrBBAB3gIdAdwAdAJhAe4DwAGPAUMBkgBjAT0BKQGcAjgAeAFnAcQCgABvAGMDHgQLAGcAYgMqAHQD9QQYAd8DxQGgBBoDMQMzAg4BrAJaAbEBZALQAv0AaQKzAekCGAQjAGUB1gOaAG8DCALqAHwAZAA6AGQBlAE/A5gDqAGJAGgBIwOYAGMETwF8AU8C6AMyAGcBwwOUBFwBLgPFAyUDmABoA6gAaAM5AC0EVgIvA6gAcwBvAGYBDQIHBFcETgOUAWgAZgGlAocDvAHDAZgBJAETA34CrQB8AGgAOgBoAHUBzAHZAdgAdAMlA1wEWQA6BGMB+ABsAYAEkgOLAa0CqwB0BAoAIgQMARMEFgQ1BBoBEwRDA/QCNAEuAuIAcgPFAG8AeAB8AHABswHQArkDjASnBKkAYwGzAXwBjQF6BLABbAFuAUkEEwEdBDQEEQSfAX0D2wQcAW4DuwHNAZQBjgJcBI8DJQR7AHQEkAQTApkEvQQZAGQCCQGvBGAEEwPhBDMEAQSeBNIBLgIHAQ8EogG0BKQCFgS3BKsAOgStAWgAbgONA9gCXASzAp8EWAEGA9gEEwO2BNgEDwS+BNIAcAKqAqwCnwEFAW0DyABwAzwDTQQcAG8BawRVAGUEcgLCArEEdAGWAl0B9wHEAW0BoARyACAE/QJcAW0CjQURAG8E/gGVBQgAZwRXBRYE/gEDAoAFBQI7Ao0CXAULAgACUAUMAHIB8QByBQkFJwIAAkAFIAUQBQADyAFrBLIEjwJRAb8DTgUzAsIBswUrBRsCQwU5BQIE8QB4BJ0E9QAtBPcElwLnBUMAdAUEBQYDgQUJBMgCjQTxAHkFRATRBUYE+AMsBVMEwgUSBKMFAQU0BTYCkwQvBMEE0AQ2ArIDogQgA4EAZQO5AqUAfAB4AvcFagEGBKkAeQVuBWYALQRFAeIC0wGrBPUBqgQ9AwYFaQVmAsIBkQAgBWUCpQAgBMUCtQByBWgFbwWCBX4FawMLBXwFgwI7BPUEEwINBWMEGgKrAHoC4wTMBI8E7QIDAqAECwBsAGsFlAEtAXEBOgBpBZgD8ABkA/QE4QTBBE8AZAU5BCkDOgRQAbYD1QGbAGQBswWuAHUAYgGgAHwAZwA6BBgESwLTBQgAZARgAHwDlAEPAYQBlgRKA6YFyAWoBboAawWqA0AE4gW6BCwBcgQLBbYBAwXQBKUENwXUAU4BLgXNAaAF2QXSBaMAawOzBd8D1gXhBKYF0wWkAZoF3QIBAGIF1wBlBZQFqwXbBesFlgSYBeAAdAWtBa8FtQGRBFEAcwW0BE4FtwHeBboBwwW9Bb8B5gUHBSsFwwRhADoFxwGFAHwFygFDAYUF5gFUBDMF8wXqBeQF7AFeAWAAaAXfBfIF0QXpBeMCLgYeBLwGFwYiAmgF7QYeBh8F2gYYAi4BWgB5BfgF+gQcBbAF/QWzBbAGAgW5BbsGBgE9BcAGCQFfBcQFxgGDBg8GEQXMBdYFugFTBegF9AXkBigGGwFhBh4EIANNBiAGSgYvBjEEUAX7BE4GNQX/BjcGVgY5BgUFvgY8BggFTgYLBcUGDQZCBckAOgOeBkUEmgXXAV4GSQYtBk0GHQZGBm4FQABtBc0GJQZSBTIFAgYpBkYAbAViBhcGdARsBSEDBgK4AWkAcwXNBYgGcwVdAwYFCQaDAWgDfgXNATsGiQUzBlQFmQYyASMF/AWyBloFtQY4BgQFvAZfAG8GPQZiBkAGZQXIBhAGaAXLBhMGRgYVBlEGLAaABnAE+wFuAGgBDwB8BEABZwFpAWsBYQaxAXAF1QZrBJwGFgZSBFwBFANxBZkCKwHQAyYBwwIUASwGwgGEBagGdwXaBM0F1gRIBn4GUgXsBewCwwaOBoYG0QBzBtMF2gXsBigG1waFBagC5QQNBr8F2gNbBNUF1gKeBkkG5wERBmkGqQZrAjkG6wTUAREFkAGQAesBPAKIBgkFjAGWAHIFeQTRAl8FhgNWBe8DwwbyAGEEYAE6AQ4BeAbiBtsGzgTiBuwBOgHeBSkHAgFoBqsF8wcPBnAG4gbrAG4BywbiBw0EpgEPAcsGewbwBZkGrAcOBxsBwgXlBukF5wblByYHIQXsBtAHIwYrBy0HKAbeBfcHEwPOBxUGUgcgBzQEGgcYBukBkwcaByECaAcLBx4DlwdCAmEBlQciBwMCKgdBBygGKAE7BjAHNwZIBywHHwcnARAGLgc+BvABOwBsB00HVwdQAaAG4gBuBzkG5gdWAV0BXwZOBdYHXAdUBoEEcgWoBdgHawUPAXsEwAduBzIEpgdxBpQHbgdjBOIHdwavBVoGsgOYBrUGjga4BIQBbwFxBagEFQdrBuAGjwXWAsMGSQeKBtkGawbcBOIFPQRXBagFKQeOBowHMAXvAb0HmAU+BpQBBQFgBlYGMwaYBf4GAAIYASwBXwYBBlwGnQY7BqAGYQXCBkABqwYOBckDpganBhIDYweRB3oEpgeUAR4HZwFiB34GsweBBrcBbAeEBrIHhgXWAc0GSQWGA4wFqAGEB5IEpgYoBtYGhAeLBmsCKgfPBi4G3wfTB5AF7wd1B58F+QFtBa4HowZYBpkHpgGSB6gGmwerBjoGnwahB7AEYQeyBmYGEAe1Bu4HuAXvBlAF8wT9BagEzAZJBP0HSgFgBn0H+wUXB2wD3wfaB/kGiAdrB/wHvAaNBuEF1gFDCAADrwdfBpUH4AZXBbEHpQQpB6cDbgeqBbgHrAfrB68GCgexBqQGQwfyBqgH9AFgB7oBIggBB30E/Ad/BrQBZQa2AWoHxAa6B8cGawgmCCkGugeACC0HgggwB4UGvABiBaoFXQaHBaoCIgLiAXwD4AGLAGIChwBhBc8FmgETA1UHAAcJBwIAeAX/BakGFgIiBf8CuABvAHcD8AhRB78D2AE6BGoFrghZBAsIUQB6CEEFpQB6B8wECwByAGsHiAhHA6IF5AHzA/sIaQBrCD0EMwhIBeQB0wNRAocD8AhqBM8IdgOXAqsDbwEZBC0DcQEFCIMDLAiAA1YEIwf6BMwExgdyAU8BMAETBMEBEwO6CJAAbAO4CIUBDgOvAdAHaAAiAR0EkAEFBkED1QUrAZYE/ATEBsYBjgiQBKEEzATAA5cCAAT3AsACrQiQAUQHvwSQAToB7gILCIkBLAieASwBagGLA2EBegiQASwD8wirBJQBiwMuApYIggEsBuQEXAi9AC0EFAEXCMkH/wjECM0DggdgCNEHlwjTAG0BiwjVAREHMARcB5wI2QjbAr8BEQgQCMEGfQYVCMwI2gMGCOMBBwe+COYCDQjpAlYB0AWeCJ0BLAjoCLwI6gdZBFwIhQj4AYMIkAF6CPwBegWdCP8CnQBiCPAFnAOkAQ8BPAXHAXAGUwWXCIkBegBpCLQJCAGLCQoFKwGDCQ0D1QUJCQQAaQcECKsJAgkJAXoJFwKrAGMHRgdOBaYJEAKdCQcJIAkVCSIJDAklCQ8IqQj3CSwIrQkjCQ0I+gE8CQECYQHCAgEC8wb9CToFnQTiA2oIiQE8BCAEtAk7ARAEpgSYA7kIkAQcCToIqAiCCS4I/ANiByYERwQfCQQIBgi/AgAFfQZqAGMJIgkHCVQH0AbvBCMIhQMlBHAEwQN8AG8JCgJKBa0FBQBhAr8FCgFkCUcBWQPAAHUEgwSFAcoE/gBwBb0AcAE9BBAF8QM7AHcAOgM4AQwFUAHKAbEE/AFJA+gBbQMIAp0ELQEqA8wCtgOoAgYBtgJcAc4BfABwAekDMQFlBj0CHQV8A/cFFwGqAdkBrQEGAbABLQEIAZsEEAZfAGEAYgW8AbMEEAmsBAcE6AK2AZEJpgi2BCQCEwEsArAEXAlcCSgCwgOBCFgJvQWYAaoDDAnCBH0CsAb0BfEJvgbbAZIJxgB8AHcCsAB3Cc4JSQGsCckJDwHXAhYBkgnWCcsJ0AGSCdIChwnXAGUJ3QniCdMJzAGDCdMF8QmCARABUwnTAHcB4QdiA5wJ4Am+CGcAOgB6BqAAbQOXAHwJ9gn1CfcDpQe4AvEHoAI5A94IsQEZCFMBaAHNAuoD9AG0BeMFxQGzBzsHVwYYBmQKDwHDAzUCIQXFAzUKEwMtAicEuAJhBp0BDAZlByEKHQW7BMwBzgoiCN0AYQBwAvQBbAF4ASkBbgmsAaABEgmHCisBLAouBgQBTgi9CjMAbAW9CiYKNwjqBDUE/gEbCjsKLwERA1EDTgTiCj8HxApCCjYD1QK4CkcEEQpAAHIKSgowAT0J0gpIAvYKPApUAZwCsAGfCcEGPAGWBjsHqQIHCiAHKAQQB6kGyQS1AUMBxAOUAQ4DxAIKBnUBGQILAHABHQpxBJgKMQEpB5ABnwQgA/oCFgEwAGYFSgIhCKAAOgAwA+YCyQOmAG8C+wPjA+MJbwPICn0AeAh0AiEDxQG2A8MKjQhTCpAC8QoDBPoC9gpZBYgCsQpdAxoC+gbJCMUCXAm7CP0FfQMIBswBGQp+CMMKkApcCGEAIgp+BuQKkAQYCq4KfgINCpAF/wkXBrwKfgYVCpAJ0AooAQUJggq+BP4J3QrCCqYDEQV7Aa0Kwgp9B2oKXAKlCKABkQoZAmgFxQGYChkBqQVOBT4EKgdxCn0C9QNRCMAKqQqrBO0DLQEVASgFWQHZAHUAaQE6AuAAcwE6AhYAaQBmAsgAcwB5ATsCCwAtCucK8ArqCuwFKwrvACAAJwBBA7gBoAAgAEMEwAAgAEUDMQBqAGkAJwLIACcAUwBlAGcAbwJPAFUASQsECwYLCAsKCwwLDgsQCxIAUwB5AG0DTQBsCwkK/ABOA04AbwsBCwMLBQBvCwcAJwJfCucK+QruAsgARwBlAS4AZwBpAGECyABDARUIRws0CwoAVALlBfEAIABOCeIAIABSBQIC4AsgCzwBZgBzCvAK7QBmCCwLLAMxBJYB0AF4AsgAUwBGAE0CnwBvAC0AUgsNAtEAcgLIAE0B5wBvC14CnwF0C2ELJQGDASwBtgsKAEwEBgIWBI0AIAtWAa0LIAAnCwIDJQPOAHILPwniCyALTwKqC1EDVgBmAG4K4AS2AGYK4wHoCtsBnQM0CuEBpQKlAyUI5AGFAp0E6Ap4AG4ISgrdAQYBPwb9CGgKrwcbBNcLlARsAuAAZwB1BwYG7QMIBgoLfgSWC4gEtgUXCY4BsAhmC5gLfwTyC5wB0AGgBjMK2wq2CuEJMQqpAk0LpwFKCSgB3ABkAGoDfge4C38BSwu6AVoChwTMBnELmQdQC8QI5Qu4CvEK3Au2AHkBegPVAqsLkQfJARsL0AvSCcoK6wVHBPkI9AvCAUQLywvRAWEL2gE6AhIBKgiDC9ULtQS2C84L4wvUB3gLzQq8C9gL7QPDATQJGwu4A/8L1wS2AHYBlAs0Ct4LmQv7C8QL+wUrAuAJpQL9AxYC0guRAHYBHQucDAIL/QF7CigMCQOiDAEL/AwEAeQCQgHcAqsC4ArbAeYMEwwDBLYCCwsoAGkMGwrMCuEMDQwVAYkLiwngDBsLzwv6DBQEtgPBAWYFKwBjDBsLrwwlDC4BBgvcAycL9wvqAQYMJgiHC44DjAp4C/EEtgEIC/YLmQxDAR4DkwU+Cn0ELQuIBxIE0gi1ArgLvwE7ATAIzwEFCM8MVQxXBgoMVQeICmUE0gTGAGEMXAEdDF4B3AqGCj0BgwFjAXABZQOkCXMBega0ArsBrwIiDG0BlgBtBEABDwxxACgAMALIADEAZgByACkMXAjDDGQKiwtYCq0CrwqdAHcFUAj9BE4EUAF5AvoDQAyHACAC4gZCAlwEWwj9DJEMjQNWBBQEwQyCDGYKVAINA4sB8QSVAYwE7gxvDKEAYQxyBO0Exwx1DGsAbgx4DHoD5gx9DH8BGQBnDGMGCgxnAzQD6gPtAC0AMQxVA70AdAxkCPEHKQAiDLQCDQzACqUHQwyzDJsMtgpUDLgD4wPlDLsMVQKHDFoBXwMGCcEBmgzRDMUMywnBDMgMwwQgDGQBIwEWAt0MVQJhDNME0gzgA3YBIwHcCEgHkABnCIsM3wpxAt0MZwINAhgFuQxeDOMMygzUDOcM8QyeA2wAcwz1DFsBGQBoBPIEagToBK8AcAOPBIsEjQEwB78JGgU+DGkMoQxsDKkMbgGvDKYMqApoAZwB8QEnB3IKaA0LAR0AaAB5AHAD1QMXCN0EagLDAvMKfA0BB28NHw0hAXkDBQEOA4sBew0lB5ANKwEFDSsNIgyfAWUC4AugCMgAIgbjBNcHDwTcAY4NCgEZBuMEwQcPBHsEpQuYBccIoAdlCGYDVgKZB7MBMAQGBaANTAXIBkoNUgHTDVUBhQZTDNcNRAkGDOQLjw1WBi0M3AkdDVoBBgoTDVIDzg1mCSYHVw1dDT0JHgezDWwI5AdIB7gNcARwCLAKmQXGDXcC0gEwAGoBHQxTAp0AZgN4DHMIhQVfBS4DrQJiBH4CbQIfCrcNdAJyAiYBqAJtBUwG/AUaBHUCWQIRAlsBzQV3A8UB1ARIA5gB2A2bAd0B3wnYDZsC+AcbBEUG9wvGAe4B8AJHAowCXgKPAfwCTgUtDSgAIgsHAQUNgAruA3gKbgINDZcCEgHqAoYG+QUlAkoNiAIaDYoCHgJvAaEK0gIlCpACZAnaAmYDsAJqAiwDswrZBSEGPgrYAjQCgwoUAnoCOgI8AcEBuQJ/AoEN3QI+Dd8CsAGgBBQAYwB5BYIFTwotDeYBdA3pB3EBxAHxDe0N6A2zAhcB8QKLDfUCSwKQDfgFUQEZAGoCDQ24DYIK7AJmAlgEPQ2YAbEChQHsC8cJhgUMDcQDnwIcDccNkAhVDY4NywJ0Am0CKg3OAmcNjgIwDdIBqQ2TDdYEdQ3YDd4BzA33DbIFIw2wApENrgVgACIHagraARkC/QINC7IJWwfLBOgOBQMdDTwBxQhqAQUHIQhtCEkBMABsB78HIQ0NB5UOLw4xA8MBSgc2CoEJDALiBHYEUAPDAGMFUAI5CJMHAABxC6AChwROAZgIQwNbAbEGBgsxClEL/QorA5QBPAK4ARIHfwXxAREBDwh5Db4AawA6CGsAbgL/BFEOPwKrDjsORwaUBNMLoQ4/A8ME8gpsDkgHUQVWBUgNeQakAV8BwwZEDoMOcgQgDnwOdglLBpUEdw5PDlEFKQW7AhgOVQTGDlgMjABjDlsGngRgCzIOYATMDmIG1w5lAcIDnA5pBD4AfA5sDm4OcAxhARkEMgGvDl8I9AsdDVQAdA6sCzMIRgXjATALHQWZDrIDpAYtDW4LHQdADrEBlA6zCQ4NdA62CHQOuQhGBnQOtgTeDr8OrQ1yDskOuA7ACSEHLgIdDskOvg7GDXIGIw6qB2oO1g4uACIAbQTBDtYHvA62BCAO1gf4DqoAcwhKAa8O5w62DucOxQG2CHcFqw7rCHMOqw7uBKcGUgQ6A1YCDAhzBNcO6Q7vBlIH8w7xCEcBYw70ByUHuwb7DwAMnw8DBfMAcwhPDwcI2A78DvUF2gRwAyUHCg7mCHMGFQ8PDwQI7QYcDvEBHQ8PBKAI0A7dDucAYwTyDx4FAgw5DvgO5wKZDw8G7A7xDvMO5wMwAzIPKABrDvsO9ATcDrMO8Q8kDvQMOQoEDyEAaw7fDvQFkA7xDwgPLwu3Dz0O4w70DosO4ghTApwAaALoBWkInABtCA0OvwFhC+8O3QkGDwICIg1jCSgOtge/DHEALQ5DB7gDiw8IAiIK0Q9bDqoPFwynDxoPUAB4D2gCIgdZA4sPVw6xDroGJw9mDt0JEgxpAYsPYAzNADAAMAAlBrQMagyiDHMMpQ05DRYMpAEcAjgNGwTuDtQIZA9yCS0HQg91A4sPFwOkB30DNQAxD3wPfgygDKwMowyqDHAPaQ+CD4cNGg+bC/4LHQ9LAGkPWQQ4BNIO9w42DqQEQAlwBEMB6AcABEcESQZoBEwDdwyLBFEIagHWBFUFCQHWBFoFmwRdBa4GYwRiCKwDxgb9BIMEaQRrBG0B1wRvBHEEcwrYAWgOTgR5AhYBeQK1BH4AeASAAqsDyQSEBIYEiAHyBIsIRQyJAU8BxASTAWoBDwVXBJkEcQEFAG8AYgBqA94DLQEMDYUJRwWdAlwD6QF8AwgEJgjHAdcETwFEAbABEQhgCPQFFw/qD+wP7g87CpkFXAU6DcIEkQUwDZQHvAocCaEN4AUhBTgFXQUNEAsFHQU7DZUFPxATBRkHvAUdATAEcQINBHEBnQbvBHEHiBAhDVYC4AHuBd4BGQRxCFMQJg1bCgcCmg8UACIEcQTyEC4MOAKlC8gQNATXEDYOfwvdEB4MfQ/qBHkNVgE9AmEBIxAeCnIP6gtRBAkQHgNAD+oGIBBMEDUAcg0hCuoQHgEOD+oDpgccECsHbwOeByEInwKdBmUIogmFAhQEygGOCwIP4gilCuoIpwv+AX0QVwVLBygQNhBVECAQWAdODkkH3weiBpcH4wgVAeAH5ggYBbYH6QZeBgcFwQgeB+4IIAe0AW0O/xBaBhUQXAcoCDUBbwg3AWYIOQa5CDsQPwdqBcAAcgqtEJQQJQMICq0B3AO8AGgQKhAzAZ8IdBCWEJwGGBCUAGMEMhCkCacBEgiZAzAO0BAAAZ8CmRCqCcENaBArAZ8QihCbEKsKwg/xCJkPsQm4EJQFShCzCdIFSgIUEL0ERhC/ELYB6A/qELkJwQVZEMUEQxC+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",N=A=>({all:A=A||new Map,on(B,g){let Q=A.get(B);Q?Q.push(g):A.set(B,[g])},once(B,g){let Q=(...Q)=>(A.get(B)&&A.delete(B),g(...Q)),w=A.get(B);w?w.splice(0,w.length,Q):A.set(B,[Q])},off(B,g){let Q=A.get(B);Q&&(g?Q.splice(Q.indexOf(g)>>>0,1):A.set(B,[]))},emit(B,g){let Q=A.get(B);Q&&Q.slice().forEach(A=>{A(g)}),Q=A.get("*"),Q&&Q.slice().forEach(A=>{A(B,g)})}});function _(A){try{let B=atob(A);return Uint8Array.from(B,A=>A.charCodeAt(0))}catch(A){throw new Error(`Failed to convert base64 to buffer: ${A.message}`)}}function T(A){try{let B=AA(A);return new TextDecoder("utf-8").decode(B)}catch(A){throw new Error(`Failed to decompress to string: ${A.message}`)}}function AA(A){try{let B=_(A),g=[];for(let A=0;A<B.length;A+=2)g.push(B[A]<<8|B[A+1]);let Q=new Map,w=256;for(let A=0;A<256;A++)Q.set(A,String.fromCharCode(A));let E=Q.get(g[0])||"",e=E;for(let A=1;A<g.length;A++){let B=g[A],C=Q.get(B);C||(C=E+E[0]),e+=C,Q.set(w++,E+C[0]),E=C}return(new TextEncoder).encode(e)}catch(A){throw new Error(`Failed to decode and decompress to buffer: ${A.message}`)}}var J=new RegExp(["^((?<m>xs|sm|md|lg|xl|2xl|sma|mda|lga|xla):)?","(?<l>[0-9]*)?","(?<p>",["(",["(\\[([a-zA-Z]+)\\])"],"|",["(","((-w|[a-z])((-)?[a-z])*)","(([A-Z#!])|((-)?[.0-9])|(--|{|'))","([^&@]+)?",")"],")"],["(&","((-w|[a-z])((-)?[a-z])*)","(([A-Z#!])|((-)?[.0-9])|(--|{|'))","([^@]+)?",")?"],["(&","\\[([a-zA-Z]+)\\]",")?"],")","(@(?<s>.*))?$"].flat(1/0).join("")),BA=(A,B)=>{B=B||"fwkui";let g=Array.from({length:24},(A,B)=>"l"+B);if(!A.querySelector('style[id="'+B+'"]')){let B=document.createElement("style");B.id="fwkui",A instanceof ShadowRoot?A.prepend(B):document.head.append(B);let Q=`@layer ${g.join(", ")};`,w=setInterval(()=>{B.sheet&&(clearInterval(w),B.sheet.insertRule(Q,B.sheet.cssRules.length))})}},O=(A={css:"",gValue:{},exNames:[],mQuery:[],valueExt:{}})=>{let B=JSON.parse(T(v)),g={};var Q={};let{css:w=null,mQuery:E=[],gValue:e={},valueExt:C={},exNames:t=[]}=A||{};Array.isArray(E)||(E=[]),Array.isArray(t)||(t=[]),Object.getPrototypeOf(e)!==Object.getPrototypeOf({})&&(e={}),Object.getPrototypeOf(C)!==Object.getPrototypeOf({})&&(C={});var s={n:"none",nm:"normal",a:"auto",i:"inherit",in:"initial",is:"inline-start",ie:"inline-end",tr:"transparent",c:"center",cl:"collapse",l:"left",r:"right",h:"hidden",v:"visible",s:"start",e:"end",t:"top",b:"bottom",bs:"block-start",be:"block-end",...C};let D=()=>{let A={},g={};for(let Q of B){let[B,w,E]=Q.split("\t");if(A[B]=w,E){let A=Object.fromEntries(E.split("|").map(A=>{let[B,g]=A.split(":");return[B,g]}));g[B]=A}}return{p:A,v:g}},r=A=>{if(t.length>0&&t.every(B=>B.includes("*")?new RegExp("^"+B.replace(/\*/g,".+")+"$").test(A):B==A))return null;let B=J,{m:g="default",l:Q=0,p:w,s:E=""}=B.exec(A)?.groups??{};if(!w)return null;let e=w.split("&").map(A=>G(A)).filter(A=>A);if(0==e.length)return null;let C=E.replace(/(';|;)/g,A=>"';"==A?";":" "),s=CSS.escape(A),D=`selector(${s}${C})`;return C&&!CSS.supports(D)?null:{media:g,layer:Q,className:s,property:e.join(";"),selector:C}},G=A=>{let B=(A=>{let B=new RegExp("^(\\[(?<p>[a-zA-Z]+)\\])$"),{p:g=""}=B.exec(A)?.groups??{};if(g&&e[g]&&Array.isArray(e[g])){let A=e[g];if(A.every(A=>CSS.supports(A)))return A.join(";")}return null})(A);if(B)return B;let w=new RegExp(["^(?<p>(-w|[a-z])((-)?[a-z]+)*)","(?<v>(([A-Z#!.{'])|((-)?[0-9])|--)(.+)?)$"].join("")),{p:E,v:C=""}=w.exec(A)?.groups??{};if(!E||!C)return null;let t=g[E]||E,D=C[0],r=C.substring(1),G="!"!==D?C:r,c="!"==D;G=G[0].toLowerCase()+G.substring(1),G=G.startsWith("--")?"var("+G+")":G.startsWith("{")&&G.endsWith("}")?G.substring(1,G.length-1):Q[E]?.[G]||s[G]||G,G=G.replace(/(';|;)/g,A=>"';"==A?";":" ");let o=G+(c?" !important":""),I=[t+":"+o];switch(t){case"mx":I=[`margin-left:${o}`,`margin-right:${o}`];break;case"my":I=[`margin-top:${o}`,`margin-bottom:${o}`];break;case"px":I=[`padding-left:${o}`,`padding-right:${o}`];break;case"py":I=[`padding-top:${o}`,`padding-bottom:${o}`];break;case"bdx":I=[`border-left:${o}`,`border-right:${o}`];break;case"bdy":I=[`border-top:${o}`,`border-bottom:${o}`]}return I.every(A=>CSS.supports(A))?I.join(";"):null},c=A=>{var B=[...A?.classList||[]].filter(A=>{if(A){let B=45==A.charCodeAt(0)?A.charCodeAt(1):A.charCodeAt(0);return B>=97&&B<=122||B>=48&&B<=57}return!1});return A?.children?.length>0&&Array.from(A?.children).forEach(A=>{B.push(...c(A))}),B.flat(1/0)},o=(A,B)=>{if("function"!=typeof B)throw new Error("Callback is not a function");if(!A)return;let g=null;A instanceof Document?g=A.documentElement:(A instanceof ShadowRoot||A instanceof HTMLElement)&&(g=A),g&&(B(c(g)),new MutationObserver(A=>{for(let g of A)if("attributes"==g.type&&"class"==g.attributeName){if(1==g.target.nodeType){let A=String(g.target?.className??""),Q=String(g?.oldValue??"");if(A||Q){let g=A.split(" ").map(A=>A.trim()).filter(A=>A),w=Q.split(" ").map(A=>A.trim()).filter(A=>A);g=g.filter(A=>!w.includes(A)),"function"==typeof B&&B([...new Set(g)])}}}else if("childList"==g.type&&g.addedNodes.length>0){let A=[...g.addedNodes].filter(A=>1==A.nodeType).map(A=>c(A)).flat(1/0);"function"==typeof B&&B([...new Set(A)])}}).observe(g,{attributes:!0,attributeOldValue:!0,attributeFilter:["class"],childList:!0,subtree:!0}))};return{buildCss:(A=document)=>{let B=A?.getRootNode();if(!B)return;let e=new Map;var C=D();g=C.p,Q=C.v,BA(B);let t=N(),s=[{default:""},{xs:"screen and (max-width: 575px)"},{sm:"screen and (min-width: 576px)"},{md:"screen and (min-width: 768px)"},{lg:"screen and (min-width: 992px)"},{xl:"screen and (min-width: 1200px)"},{"2xl":"screen and (min-width: 1400px)"},{sma:"screen and (max-width: 768px)"},{mda:"screen and (max-width: 992px)"},{lga:"screen and (max-width: 1200px)"},{xla:"screen and (max-width: 1400px)"},...E],G=s.filter((A,B)=>s.findLastIndex(B=>Object.keys(B)[0]==Object.keys(A)[0])==B),c=G.map(A=>Object.keys(A)[0]),I={},a={root:new CSSStyleSheet},l={root:""},n={root:[]},H={root:!1};c.forEach(A=>{I[A]=new Set,a[A]=new CSSStyleSheet({media:G.find(B=>Object.keys(B)[0]==A)?.[A]||""}),l[A]="",n[A]=[],H[A]=!1}),w&&Array.isArray(w)?(l.root=w.join("\n"),a.root.replaceSync(l.root)):(l.root=w||"",a.root.replaceSync(l.root)),["root",...c].forEach(A=>{B.adoptedStyleSheets.includes(a[A])||(B.adoptedStyleSheets=[...B.adoptedStyleSheets,a[A]])});let M=(A,B)=>{let{media:g,property:Q,selector:w,layer:E,className:C}=B,t=a[g],s=I[g],D=l,r=n,G=H;E=Number(E)||0;let c=C,o=e.get(A);var M=`@layer l${E}{${o?`.${o}${w}`:`.${c}${w}`}{${Q}}}`;s.has(M)||(s.add(M),r[g].push(M),G[g]||(G[g]=!0,queueMicrotask(()=>{let A=r[g];A.length>0&&(D[g]+=(D[g]?"\n":"")+A.join("\n"),t.replaceSync(D[g]),r[g]=[]),G[g]=!1})))};return t.on("observeDom",A=>{A.length>0&&A.forEach(A=>{let B=r(A);B&&M(A,B)})}),{clsx:(...A)=>{let B=A.map(A=>Array.isArray(A)?A:[A]).flat(1/0).map(A=>A.split(/(\s|\t)+/g).filter(A=>A.trim())).flat(1/0);B=[...new Set(B)];let g=B.map(A=>{let B=A;if(e.has(A))B=e.get(A);else if(J.test(A)){let g="D"+e.size.toString(32).toUpperCase();e.set(A,g),B=g}return B});return queueMicrotask(()=>t.emit("observeDom",B)),g.join(" ")},observe:()=>{o(B,A=>{A.length>0&&A.forEach(A=>{let B=r(A);B&&M(A,B)})})}}}}},gA=(A,B)=>{O(B).buildCss(A).observe()},eA=(A,B)=>O(B).buildCss(A).clsx,cA={css:O,cssObserve:gA,clsx:eA};export{eA as cssClsx,gA as cssObserve,cA as default,O as xcss};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fwkui/x-css",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"css",
|
|
10
10
|
"auto generate css"
|
|
11
11
|
],
|
|
12
|
-
|
|
13
12
|
"author": "Do Vui",
|
|
14
13
|
"license": "ISC",
|
|
15
14
|
"description": "Auto generate css",
|