@xihan-ui/styles 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/CHANGELOG.md +5146 -6
  2. package/README.md +22 -2
  3. package/component-tokens.d.ts +4212 -0
  4. package/component-tokens.js +2 -0
  5. package/components.tokens.json +80116 -0
  6. package/css/accordion.css +131 -75
  7. package/css/affix.css +16 -1
  8. package/css/alert.css +114 -67
  9. package/css/anchor.css +99 -27
  10. package/css/approval.css +461 -0
  11. package/css/avatar-group.css +14 -6
  12. package/css/avatar.css +33 -9
  13. package/css/back-top.css +103 -48
  14. package/css/badge.css +42 -14
  15. package/css/bar-code.css +62 -0
  16. package/css/breadcrumb.css +40 -21
  17. package/css/button-group.css +146 -24
  18. package/css/button.css +116 -99
  19. package/css/calendar-picker.css +448 -0
  20. package/css/calendar-range-picker.css +517 -0
  21. package/css/card.css +54 -77
  22. package/css/carousel.css +412 -68
  23. package/css/cascader.css +429 -246
  24. package/css/checkbox-group.css +225 -77
  25. package/css/checkbox.css +174 -37
  26. package/css/clipboard.css +266 -47
  27. package/css/code-view.css +279 -0
  28. package/css/collapsible.css +108 -63
  29. package/css/color-field.css +158 -0
  30. package/css/color-picker.css +172 -184
  31. package/css/color-slider.css +274 -0
  32. package/css/color-swatch-picker.css +243 -0
  33. package/css/color-swatch.css +35 -0
  34. package/css/combobox.css +267 -273
  35. package/css/command.css +399 -0
  36. package/css/context-menu.css +183 -108
  37. package/css/date-field.css +94 -121
  38. package/css/date-picker.css +486 -249
  39. package/css/date-range-picker.css +559 -0
  40. package/css/description.css +51 -0
  41. package/css/descriptions.css +133 -87
  42. package/css/dialog.css +247 -68
  43. package/css/diff-view.css +428 -0
  44. package/css/download-trigger.css +155 -46
  45. package/css/drawer.css +194 -111
  46. package/css/editable.css +172 -152
  47. package/css/empty-state.css +80 -11
  48. package/css/field-array.css +190 -0
  49. package/css/field.css +84 -31
  50. package/css/fieldset.css +51 -18
  51. package/css/file-upload.css +134 -36
  52. package/css/flex.css +20 -1
  53. package/css/float-button.css +238 -57
  54. package/css/floating-panel.css +173 -92
  55. package/css/focus.css +46 -0
  56. package/css/forced-colors.css +93 -0
  57. package/css/form.css +254 -77
  58. package/css/gradient-text.css +34 -10
  59. package/css/grid.css +516 -5
  60. package/css/heatmap.css +87 -29
  61. package/css/highlight.css +20 -5
  62. package/css/hover-card.css +97 -47
  63. package/css/icon-wrapper.css +15 -3
  64. package/css/icon.css +74 -8
  65. package/css/image-cropper.css +143 -29
  66. package/css/image-viewer.css +150 -89
  67. package/css/image.css +30 -1
  68. package/css/infinite-scroll.css +51 -1
  69. package/css/input-group.css +277 -0
  70. package/css/json-viewer.css +102 -45
  71. package/css/kbd.css +72 -0
  72. package/css/label.css +78 -0
  73. package/css/layers.css +5 -0
  74. package/css/layout.css +175 -31
  75. package/css/list.css +24 -3
  76. package/css/listbox.css +208 -67
  77. package/css/loading-bar.css +52 -3
  78. package/css/log.css +144 -9
  79. package/css/markdown-stream.css +149 -0
  80. package/css/marquee.css +27 -1
  81. package/css/masonry.css +7 -0
  82. package/css/matrix-code.css +67 -0
  83. package/css/mention.css +234 -152
  84. package/css/menu.css +180 -83
  85. package/css/menubar.css +204 -136
  86. package/css/message-feed.css +197 -0
  87. package/css/navigation-menu.css +144 -90
  88. package/css/notification.css +178 -100
  89. package/css/number-animation.css +7 -0
  90. package/css/number-field.css +120 -277
  91. package/css/overlay-arrow.css +12 -7
  92. package/css/page-header.css +99 -14
  93. package/css/pagination.css +175 -135
  94. package/css/password-input.css +222 -219
  95. package/css/pin-input.css +101 -67
  96. package/css/pointer.css +36 -0
  97. package/css/popconfirm.css +185 -94
  98. package/css/popover.css +121 -77
  99. package/css/progress.css +60 -12
  100. package/css/prompt-input.css +224 -0
  101. package/css/question-flow.css +513 -0
  102. package/css/radio-group.css +147 -30
  103. package/css/rating.css +193 -43
  104. package/css/reasoning.css +336 -0
  105. package/css/reset.css +84 -6
  106. package/css/resizable.css +237 -0
  107. package/css/scroll-area.css +68 -7
  108. package/css/scrollbar.css +47 -13
  109. package/css/segmented.css +94 -29
  110. package/css/select.css +288 -274
  111. package/css/separator.css +101 -1
  112. package/css/side-nav.css +133 -75
  113. package/css/signature-pad.css +74 -54
  114. package/css/skeleton.css +84 -11
  115. package/css/slider.css +132 -39
  116. package/css/sortable.css +198 -0
  117. package/css/spinner.css +126 -12
  118. package/css/splitter.css +29 -8
  119. package/css/statistic.css +55 -0
  120. package/css/steps.css +206 -72
  121. package/css/switch.css +268 -36
  122. package/css/table.css +695 -118
  123. package/css/tabs.css +604 -42
  124. package/css/tag-group.css +219 -0
  125. package/css/tag.css +118 -28
  126. package/css/tags-input.css +156 -274
  127. package/css/text-field.css +101 -249
  128. package/css/time-field.css +100 -128
  129. package/css/time-picker.css +323 -252
  130. package/css/time-range-picker.css +719 -0
  131. package/css/timeline.css +202 -68
  132. package/css/timer.css +56 -52
  133. package/css/timestamp.css +34 -0
  134. package/css/toast.css +373 -144
  135. package/css/toggle-group.css +309 -76
  136. package/css/toggle.css +116 -85
  137. package/css/tone.css +47 -0
  138. package/css/tool-call.css +421 -0
  139. package/css/toolbar.css +181 -33
  140. package/css/tooltip.css +107 -36
  141. package/css/tour.css +183 -152
  142. package/css/transfer.css +351 -138
  143. package/css/tree-select.css +323 -216
  144. package/css/tree.css +294 -62
  145. package/css/truncate.css +65 -0
  146. package/css/typography.css +228 -5
  147. package/css/undefined.css +10 -1
  148. package/css/virtualizer.css +9 -10
  149. package/css/visually-hidden.css +7 -0
  150. package/css/watermark.css +7 -0
  151. package/family/action-control.css +487 -0
  152. package/family/collection-item.css +721 -0
  153. package/family/field-chrome.css +298 -0
  154. package/family/motion.css +166 -0
  155. package/family/swatch.css +59 -0
  156. package/index.css +41705 -126
  157. package/index.unlayered.css +33692 -17339
  158. package/package.json +51 -17
  159. package/css/calendar.css +0 -367
  160. package/css/code-block.css +0 -91
  161. package/css/composer.css +0 -134
  162. package/css/countdown.css +0 -26
  163. package/css/dynamic-input.css +0 -220
  164. package/css/ellipsis.css +0 -52
  165. package/css/hotkeys.css +0 -90
  166. package/css/popselect.css +0 -391
  167. package/css/qr-code.css +0 -55
  168. package/css/result.css +0 -119
  169. package/css/space.css +0 -117
  170. package/css/thread.css +0 -120
  171. package/css/time.css +0 -25
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xihan-ui/styles",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "2.0.0",
5
5
  "description": "XiHan.UI styled layer — pure CSS skins driven by data-attributes and design tokens.",
6
6
  "author": {
7
7
  "name": "XiHanFun",
@@ -29,74 +29,99 @@
29
29
  ],
30
30
  "exports": {
31
31
  ".": "./index.css",
32
+ "./component-tokens": {
33
+ "types": "./component-tokens.d.ts",
34
+ "import": "./component-tokens.js"
35
+ },
36
+ "./action-control.css": "./family/action-control.css",
37
+ "./collection-item.css": "./family/collection-item.css",
38
+ "./field-chrome.css": "./family/field-chrome.css",
39
+ "./motion.css": "./family/motion.css",
40
+ "./swatch.css": "./family/swatch.css",
41
+ "./components.tokens.json": "./components.tokens.json",
32
42
  "./accordion.css": "./css/accordion.css",
33
43
  "./affix.css": "./css/affix.css",
34
44
  "./alert.css": "./css/alert.css",
35
45
  "./anchor.css": "./css/anchor.css",
36
46
  "./avatar-group.css": "./css/avatar-group.css",
47
+ "./approval.css": "./css/approval.css",
37
48
  "./avatar.css": "./css/avatar.css",
38
49
  "./back-top.css": "./css/back-top.css",
39
50
  "./badge.css": "./css/badge.css",
51
+ "./bar-code.css": "./css/bar-code.css",
40
52
  "./breadcrumb.css": "./css/breadcrumb.css",
41
53
  "./button-group.css": "./css/button-group.css",
42
54
  "./button.css": "./css/button.css",
43
- "./calendar.css": "./css/calendar.css",
55
+ "./calendar-picker.css": "./css/calendar-picker.css",
56
+ "./calendar-range-picker.css": "./css/calendar-range-picker.css",
44
57
  "./card.css": "./css/card.css",
45
58
  "./carousel.css": "./css/carousel.css",
46
59
  "./cascader.css": "./css/cascader.css",
47
60
  "./checkbox-group.css": "./css/checkbox-group.css",
48
61
  "./checkbox.css": "./css/checkbox.css",
49
62
  "./clipboard.css": "./css/clipboard.css",
50
- "./code-block.css": "./css/code-block.css",
63
+ "./code-view.css": "./css/code-view.css",
51
64
  "./collapsible.css": "./css/collapsible.css",
65
+ "./color-field.css": "./css/color-field.css",
52
66
  "./color-picker.css": "./css/color-picker.css",
67
+ "./color-slider.css": "./css/color-slider.css",
68
+ "./color-swatch.css": "./css/color-swatch.css",
69
+ "./color-swatch-picker.css": "./css/color-swatch-picker.css",
53
70
  "./combobox.css": "./css/combobox.css",
54
- "./composer.css": "./css/composer.css",
71
+ "./command.css": "./css/command.css",
55
72
  "./context-menu.css": "./css/context-menu.css",
56
- "./countdown.css": "./css/countdown.css",
57
73
  "./date-field.css": "./css/date-field.css",
58
74
  "./date-picker.css": "./css/date-picker.css",
75
+ "./date-range-picker.css": "./css/date-range-picker.css",
76
+ "./description.css": "./css/description.css",
59
77
  "./descriptions.css": "./css/descriptions.css",
60
78
  "./dialog.css": "./css/dialog.css",
79
+ "./diff-view.css": "./css/diff-view.css",
61
80
  "./download-trigger.css": "./css/download-trigger.css",
62
81
  "./drawer.css": "./css/drawer.css",
63
- "./dynamic-input.css": "./css/dynamic-input.css",
64
82
  "./editable.css": "./css/editable.css",
65
- "./ellipsis.css": "./css/ellipsis.css",
66
83
  "./empty-state.css": "./css/empty-state.css",
84
+ "./field-array.css": "./css/field-array.css",
67
85
  "./field.css": "./css/field.css",
68
86
  "./fieldset.css": "./css/fieldset.css",
69
87
  "./file-upload.css": "./css/file-upload.css",
70
88
  "./flex.css": "./css/flex.css",
71
89
  "./float-button.css": "./css/float-button.css",
90
+ "./focus.css": "./css/focus.css",
72
91
  "./floating-panel.css": "./css/floating-panel.css",
92
+ "./forced-colors.css": "./css/forced-colors.css",
73
93
  "./form.css": "./css/form.css",
74
94
  "./gradient-text.css": "./css/gradient-text.css",
75
95
  "./grid.css": "./css/grid.css",
76
96
  "./heatmap.css": "./css/heatmap.css",
77
97
  "./highlight.css": "./css/highlight.css",
78
- "./hotkeys.css": "./css/hotkeys.css",
79
98
  "./hover-card.css": "./css/hover-card.css",
80
99
  "./icon-wrapper.css": "./css/icon-wrapper.css",
81
100
  "./icon.css": "./css/icon.css",
101
+ "./kbd.css": "./css/kbd.css",
82
102
  "./image-cropper.css": "./css/image-cropper.css",
83
103
  "./image-viewer.css": "./css/image-viewer.css",
84
104
  "./image.css": "./css/image.css",
85
105
  "./index.css": "./index.css",
86
106
  "./index.unlayered.css": "./index.unlayered.css",
87
107
  "./infinite-scroll.css": "./css/infinite-scroll.css",
108
+ "./input-group.css": "./css/input-group.css",
88
109
  "./json-viewer.css": "./css/json-viewer.css",
110
+ "./label.css": "./css/label.css",
89
111
  "./layers.css": "./css/layers.css",
90
112
  "./layout.css": "./css/layout.css",
91
113
  "./list.css": "./css/list.css",
92
114
  "./listbox.css": "./css/listbox.css",
93
115
  "./loading-bar.css": "./css/loading-bar.css",
94
116
  "./log.css": "./css/log.css",
117
+ "./markdown-stream.css": "./css/markdown-stream.css",
95
118
  "./marquee.css": "./css/marquee.css",
96
119
  "./masonry.css": "./css/masonry.css",
120
+ "./matrix-code.css": "./css/matrix-code.css",
97
121
  "./mention.css": "./css/mention.css",
98
122
  "./menu.css": "./css/menu.css",
99
123
  "./menubar.css": "./css/menubar.css",
124
+ "./message-feed.css": "./css/message-feed.css",
100
125
  "./navigation-menu.css": "./css/navigation-menu.css",
101
126
  "./notification.css": "./css/notification.css",
102
127
  "./number-animation.css": "./css/number-animation.css",
@@ -106,15 +131,17 @@
106
131
  "./pagination.css": "./css/pagination.css",
107
132
  "./password-input.css": "./css/password-input.css",
108
133
  "./pin-input.css": "./css/pin-input.css",
134
+ "./pointer.css": "./css/pointer.css",
109
135
  "./popconfirm.css": "./css/popconfirm.css",
110
136
  "./popover.css": "./css/popover.css",
111
- "./popselect.css": "./css/popselect.css",
112
137
  "./progress.css": "./css/progress.css",
113
- "./qr-code.css": "./css/qr-code.css",
138
+ "./prompt-input.css": "./css/prompt-input.css",
139
+ "./question-flow.css": "./css/question-flow.css",
114
140
  "./radio-group.css": "./css/radio-group.css",
115
141
  "./rating.css": "./css/rating.css",
116
142
  "./reset.css": "./css/reset.css",
117
- "./result.css": "./css/result.css",
143
+ "./reasoning.css": "./css/reasoning.css",
144
+ "./resizable.css": "./css/resizable.css",
118
145
  "./scroll-area.css": "./css/scroll-area.css",
119
146
  "./scrollbar.css": "./css/scrollbar.css",
120
147
  "./segmented.css": "./css/segmented.css",
@@ -124,33 +151,36 @@
124
151
  "./signature-pad.css": "./css/signature-pad.css",
125
152
  "./skeleton.css": "./css/skeleton.css",
126
153
  "./slider.css": "./css/slider.css",
127
- "./space.css": "./css/space.css",
128
154
  "./spinner.css": "./css/spinner.css",
155
+ "./sortable.css": "./css/sortable.css",
129
156
  "./splitter.css": "./css/splitter.css",
130
157
  "./statistic.css": "./css/statistic.css",
131
158
  "./steps.css": "./css/steps.css",
132
159
  "./switch.css": "./css/switch.css",
133
160
  "./table.css": "./css/table.css",
134
161
  "./tabs.css": "./css/tabs.css",
162
+ "./tag-group.css": "./css/tag-group.css",
135
163
  "./tag.css": "./css/tag.css",
136
164
  "./tags-input.css": "./css/tags-input.css",
137
165
  "./text-field.css": "./css/text-field.css",
138
- "./thread.css": "./css/thread.css",
139
166
  "./time-field.css": "./css/time-field.css",
140
167
  "./time-picker.css": "./css/time-picker.css",
141
- "./time.css": "./css/time.css",
168
+ "./time-range-picker.css": "./css/time-range-picker.css",
142
169
  "./timeline.css": "./css/timeline.css",
143
170
  "./timer.css": "./css/timer.css",
171
+ "./timestamp.css": "./css/timestamp.css",
144
172
  "./toast.css": "./css/toast.css",
145
173
  "./toggle-group.css": "./css/toggle-group.css",
146
174
  "./toggle.css": "./css/toggle.css",
147
175
  "./tone.css": "./css/tone.css",
176
+ "./tool-call.css": "./css/tool-call.css",
148
177
  "./toolbar.css": "./css/toolbar.css",
149
178
  "./tooltip.css": "./css/tooltip.css",
150
179
  "./tour.css": "./css/tour.css",
151
180
  "./transfer.css": "./css/transfer.css",
152
181
  "./tree-select.css": "./css/tree-select.css",
153
182
  "./tree.css": "./css/tree.css",
183
+ "./truncate.css": "./css/truncate.css",
154
184
  "./typography.css": "./css/typography.css",
155
185
  "./undefined.css": "./css/undefined.css",
156
186
  "./virtualizer.css": "./css/virtualizer.css",
@@ -159,7 +189,11 @@
159
189
  },
160
190
  "files": [
161
191
  "CHANGELOG.md",
192
+ "component-tokens.d.ts",
193
+ "component-tokens.js",
194
+ "components.tokens.json",
162
195
  "css",
196
+ "family",
163
197
  "index.css",
164
198
  "index.unlayered.css"
165
199
  ],
@@ -171,10 +205,10 @@
171
205
  "registry": "https://registry.npmjs.org/"
172
206
  },
173
207
  "dependencies": {
174
- "@xihan-ui/tokens": "^1.0.0"
208
+ "@xihan-ui/tokens": "^2.0.0"
175
209
  },
176
210
  "scripts": {
177
- "gen": "node build/emit-unlayered.mjs",
178
- "build": "node build/emit-unlayered.mjs"
211
+ "gen": "node build/action-control-recipe.mjs && node build/field-chrome-recipe.mjs && node build/collection-item-recipe.mjs && node build/swatch-recipe.mjs && node build/emit-component-tokens.mjs && node build/emit-entries.mjs",
212
+ "build": "node build/action-control-recipe.mjs && node build/field-chrome-recipe.mjs && node build/collection-item-recipe.mjs && node build/swatch-recipe.mjs && node build/emit-component-tokens.mjs && node build/emit-entries.mjs"
179
213
  }
180
214
  }
package/css/calendar.css DELETED
@@ -1,367 +0,0 @@
1
- @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
- [data-scope='calendar'] {
4
- --xh-calendar-skin: 1;
5
- }
6
-
7
- [data-scope='calendar'][data-part='root'] {
8
- /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
9
- --xh-icon-size: var(--xh-calendar-icon-size, var(--xh-glyph-size-text));
10
-
11
- display: flex;
12
- flex-direction: column;
13
- gap: var(--xh-calendar-gap, var(--xh-space-3));
14
- /* 数字等宽:1 与 7 的字形宽度在比例字体里并不相同,不定住会让整张网格随月份抖动 */
15
- font-variant-numeric: tabular-nums;
16
- }
17
-
18
- [data-scope='calendar'][data-part='root'][hidden] {
19
- display: none;
20
- }
21
-
22
- [data-scope='calendar'][data-part='header'] {
23
- display: flex;
24
- align-items: center;
25
- justify-content: space-between;
26
- gap: var(--xh-calendar-header-gap, var(--xh-space-2));
27
- }
28
-
29
- [data-scope='calendar'][data-part='header'][hidden] {
30
- display: none;
31
- }
32
-
33
- [data-scope='calendar'][data-part='heading'] {
34
- flex: 1;
35
- text-align: center;
36
- color: var(--xh-calendar-heading-fg, var(--xh-fg-default));
37
- font-size: var(--xh-calendar-heading-font-size, var(--xh-text-label-size));
38
- font-weight: var(--xh-calendar-heading-font-weight, var(--xh-font-weight-semibold));
39
- line-height: var(--xh-leading-none);
40
- user-select: none;
41
- }
42
-
43
- /* 标题里的年与月:点它们逐级钻上去(年 → 十年格、月 → 月格)。
44
- 长得像标题而不像按钮——它本来就是标题,只是可点 */
45
- [data-scope='calendar'][data-part='heading-year-trigger']:not([hidden]),
46
- [data-scope='calendar'][data-part='heading-month-trigger']:not([hidden]) {
47
- display: inline-flex;
48
- align-items: center;
49
- padding-inline: var(--xh-calendar-heading-trigger-px, var(--xh-space-1));
50
- border: var(--xh-stroke-thin) solid transparent;
51
- border-radius: var(--xh-calendar-heading-trigger-radius, var(--xh-shape-control));
52
- background: transparent;
53
- color: var(--xh-calendar-heading-fg, var(--xh-fg-default));
54
- font-size: var(--xh-calendar-heading-font-size, var(--xh-text-label-size));
55
- font-weight: var(--xh-calendar-heading-font-weight, var(--xh-font-weight-semibold));
56
- line-height: var(--xh-leading-none);
57
- cursor: pointer;
58
- transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
59
- }
60
-
61
- [data-scope='calendar'][data-part='heading-year-trigger'][hidden],
62
- [data-scope='calendar'][data-part='heading-month-trigger'][hidden] {
63
- display: none;
64
- }
65
-
66
- [data-scope='calendar'][data-part='heading-year-trigger']:hover:not(:disabled),
67
- [data-scope='calendar'][data-part='heading-month-trigger']:hover:not(:disabled) {
68
- color: var(--xh-calendar-heading-trigger-fg-hover, var(--xh-fg-brand));
69
- }
70
-
71
- /* 到顶那一层(年视图的年那一截)只作标题显示:不再是可点的东西,光标也别装成能点 */
72
- [data-scope='calendar'][data-part='heading-year-trigger']:disabled,
73
- [data-scope='calendar'][data-part='heading-month-trigger']:disabled {
74
- cursor: default;
75
- }
76
-
77
- [data-scope='calendar'][data-part='heading-year-trigger']:focus-visible,
78
- [data-scope='calendar'][data-part='heading-month-trigger']:focus-visible {
79
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
80
- outline-offset: var(--xh-ring-offset);
81
- }
82
-
83
- [data-scope='calendar'][data-part='prev-year-trigger'],
84
- [data-scope='calendar'][data-part='prev-trigger'],
85
- [data-scope='calendar'][data-part='next-year-trigger'],
86
- [data-scope='calendar'][data-part='next-trigger'] {
87
- display: inline-flex;
88
- flex: none;
89
- align-items: center;
90
- justify-content: center;
91
- inline-size: var(--xh-calendar-nav-size, var(--xh-control-h-sm));
92
- block-size: var(--xh-calendar-nav-size, var(--xh-control-h-sm));
93
- border: var(--xh-stroke-thin) solid transparent;
94
- border-radius: var(--xh-calendar-nav-radius, var(--xh-shape-control));
95
- background: var(--xh-calendar-nav-bg, transparent);
96
- color: var(--xh-calendar-nav-fg, var(--xh-fg-muted));
97
- cursor: pointer;
98
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
99
- }
100
-
101
- [data-scope='calendar'][data-part='prev-year-trigger'][hidden],
102
- [data-scope='calendar'][data-part='prev-trigger'][hidden],
103
- [data-scope='calendar'][data-part='next-year-trigger'][hidden],
104
- [data-scope='calendar'][data-part='next-trigger'][hidden] {
105
- display: none;
106
- }
107
-
108
- [data-scope='calendar'][data-part='prev-year-trigger']:hover:not(:disabled),
109
- [data-scope='calendar'][data-part='prev-trigger']:hover:not(:disabled),
110
- [data-scope='calendar'][data-part='next-year-trigger']:hover:not(:disabled),
111
- [data-scope='calendar'][data-part='next-trigger']:hover:not(:disabled) {
112
- background: var(--xh-calendar-nav-bg-hover, var(--xh-bg-subtle-hover));
113
- color: var(--xh-fg-default);
114
- }
115
-
116
- /* 翻月是单体控件,禁用走原生 :disabled(连接层输出的正是原生 disabled) */
117
- [data-scope='calendar'][data-part='prev-year-trigger']:disabled,
118
- [data-scope='calendar'][data-part='prev-trigger']:disabled,
119
- [data-scope='calendar'][data-part='next-year-trigger']:disabled,
120
- [data-scope='calendar'][data-part='next-trigger']:disabled {
121
- color: var(--xh-fg-disabled);
122
- cursor: not-allowed;
123
- }
124
-
125
- [data-scope='calendar'][data-part='prev-year-trigger']:focus-visible,
126
- [data-scope='calendar'][data-part='prev-trigger']:focus-visible,
127
- [data-scope='calendar'][data-part='next-year-trigger']:focus-visible,
128
- [data-scope='calendar'][data-part='next-trigger']:focus-visible {
129
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
130
- outline-offset: var(--xh-ring-offset);
131
- }
132
-
133
- [data-scope='calendar'][data-part='grid'] {
134
- display: flex;
135
- flex-direction: column;
136
- gap: var(--xh-calendar-grid-gap, var(--xh-space-1));
137
- }
138
-
139
- /* 粗粒度视图:格子直接铺进网格,不再有周行那一层。
140
- 月 3 列 × 4 行、季度 4 列一行、年 3 列——与常见日期控件同一套排布 */
141
- [data-scope='calendar'][data-part='grid'][data-view='month'],
142
- [data-scope='calendar'][data-part='grid'][data-view='year'] {
143
- display: grid;
144
- grid-template-columns: repeat(3, minmax(0, 1fr));
145
- gap: var(--xh-calendar-period-gap, var(--xh-space-1));
146
- }
147
-
148
- [data-scope='calendar'][data-part='grid'][data-view='quarter'] {
149
- display: grid;
150
- grid-template-columns: repeat(4, minmax(0, 1fr));
151
- gap: var(--xh-calendar-period-gap, var(--xh-space-1));
152
- }
153
-
154
- /* 粗粒度的格子比日子宽,文字居中、留出上下气口 */
155
- [data-scope='calendar'][data-part='grid']:is([data-view='month'], [data-view='quarter'], [data-view='year']) [data-part='cell-trigger'] {
156
- padding-block: var(--xh-calendar-period-py, var(--xh-space-2));
157
- inline-size: 100%;
158
- }
159
-
160
- [data-scope='calendar'][data-part='grid'][hidden] {
161
- display: none;
162
- }
163
-
164
- /* 网格自己不落焦(焦点永远在某一格上),这里不画环 */
165
- [data-scope='calendar'][data-part='grid']:focus-visible {
166
- outline: none;
167
- }
168
-
169
- [data-scope='calendar'][data-part='grid-head'],
170
- [data-scope='calendar'][data-part='grid-body'] {
171
- display: flex;
172
- flex-direction: column;
173
- gap: var(--xh-calendar-row-gap, var(--xh-space-0));
174
- }
175
-
176
- [data-scope='calendar'][data-part='grid-head'][hidden],
177
- [data-scope='calendar'][data-part='grid-body'][hidden] {
178
- display: none;
179
- }
180
-
181
- /* 七等分:表头行与日期行共用同一条轨道定义,列才对得齐 */
182
- [data-scope='calendar'][data-part='week-row'] {
183
- display: grid;
184
- grid-template-columns: repeat(7, minmax(0, 1fr));
185
- }
186
-
187
- /* 摆了周序号格的行多让出行首一列。写 :not([hidden]) 而不是靠顺序压过下面那条兜底——
188
- 同特指度的规则谁在后面谁赢,收起态会被这条 display 掀开 */
189
- [data-scope='calendar'][data-part='week-row']:not([hidden]):has(> [data-part='week-number']) {
190
- display: grid;
191
- grid-template-columns: var(--xh-calendar-week-number-w, 2.25rem) repeat(7, minmax(0, 1fr));
192
- }
193
-
194
- /* 周序号只是行的标号:比日子小一号、颜色压下去,不跟着选中态走 */
195
- [data-scope='calendar'][data-part='week-number'] {
196
- display: grid;
197
- place-items: center;
198
- color: var(--xh-calendar-week-number-fg, var(--xh-fg-subtle));
199
- font-size: var(--xh-calendar-week-number-font-size, var(--xh-text-caption-size));
200
- font-variant-numeric: tabular-nums;
201
- user-select: none;
202
- }
203
-
204
- [data-scope='calendar'][data-part='week-number'][hidden] {
205
- display: none;
206
- }
207
- [data-scope='calendar'][data-part='week-row'][hidden] {
208
- display: none;
209
- }
210
-
211
- [data-scope='calendar'][data-part='week-day'] {
212
- display: flex;
213
- align-items: center;
214
- justify-content: center;
215
- block-size: var(--xh-calendar-week-day-h, var(--xh-control-h-sm));
216
- color: var(--xh-calendar-week-day-fg, var(--xh-fg-subtle));
217
- font-size: var(--xh-calendar-week-day-font-size, var(--xh-text-caption-size));
218
- font-weight: var(--xh-calendar-week-day-font-weight, var(--xh-font-weight-medium));
219
- line-height: var(--xh-leading-none);
220
- user-select: none;
221
- }
222
-
223
- [data-scope='calendar'][data-part='week-day'][hidden] {
224
- display: none;
225
- }
226
-
227
- /* 格子是区间底色的画布:底色由格子的 ::before 铺出来,圆角的选中片留给 trigger。
228
- 铺在 trigger 上会被格间空隙切断,区间看起来就是一串断开的圆点 */
229
- [data-scope='calendar'][data-part='cell'] {
230
- position: relative;
231
- display: flex;
232
- align-items: center;
233
- justify-content: center;
234
- padding: var(--xh-calendar-cell-gap, var(--xh-space-0_5));
235
- }
236
-
237
- [data-scope='calendar'][data-part='cell'][hidden] {
238
- display: none;
239
- }
240
-
241
- /* 区间底色:横向铺满格子,相邻两格接成一条;纵向收在格子内衬里,行与行之间留出空当 */
242
- [data-scope='calendar'][data-part='cell'][data-in-range]::before {
243
- content: '';
244
- position: absolute;
245
- inset-block: var(--xh-calendar-cell-gap, var(--xh-space-0_5));
246
- inset-inline: 0;
247
- background: var(--xh-calendar-range-bg, var(--xh-bg-brand-subtle));
248
- }
249
-
250
- /* 两端那一格只铺半格,另外半格由选中片占满:区间收在圆点上而不是收在格子边上。
251
- 起止落在同一格时两条一起生效,底色宽度归零,只剩那枚圆点 */
252
- [data-scope='calendar'][data-part='cell'][data-in-range][data-range-start]::before {
253
- inset-inline-start: 50%;
254
- }
255
-
256
- [data-scope='calendar'][data-part='cell'][data-in-range][data-range-end]::before {
257
- inset-inline-end: 50%;
258
- }
259
-
260
- /* 行首与行尾收圆:区间跨周时每一行各是一条两头圆的横杠。
261
- 摆了周序号格的行里,行首那一格排在它后面 */
262
- [data-scope='calendar'][data-part='week-row'] > [data-part='cell'][data-in-range]:first-child::before,
263
- [data-scope='calendar'][data-part='week-row'] > [data-part='week-number'] + [data-part='cell'][data-in-range]::before {
264
- border-start-start-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
265
- border-end-start-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
266
- }
267
-
268
- [data-scope='calendar'][data-part='week-row'] > [data-part='cell'][data-in-range]:last-child::before {
269
- border-start-end-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
270
- border-end-end-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
271
- }
272
-
273
- /* 粗粒度的格子之间有间隙,底色本就接不成一条,每一格各自收圆 */
274
- [data-scope='calendar'][data-part='grid']:is([data-view='month'], [data-view='quarter'], [data-view='year']) > [data-part='cell'][data-in-range]::before {
275
- border-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
276
- }
277
-
278
- [data-scope='calendar'][data-part='cell-trigger'] {
279
- /* 区间底色是格子上绝对定位的伪元素,选中片得定位才排在它之后 */
280
- position: relative;
281
- display: flex;
282
- flex: 1;
283
- align-items: center;
284
- justify-content: center;
285
- /* 正方格:宽度由 week-row 的等分轨道给,高度跟着走,日历才不会被长月份拉扁 */
286
- aspect-ratio: 1;
287
- min-inline-size: var(--xh-calendar-cell-size, var(--xh-control-h-sm));
288
- border: var(--xh-stroke-thin) solid transparent;
289
- border-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
290
- color: var(--xh-calendar-cell-fg, var(--xh-fg-default));
291
- font-size: var(--xh-calendar-cell-font-size, var(--xh-text-body-size));
292
- line-height: var(--xh-leading-none);
293
- cursor: pointer;
294
- user-select: none;
295
- transition:
296
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
297
- color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
298
- }
299
-
300
- [data-scope='calendar'][data-part='cell-trigger'][hidden] {
301
- display: none;
302
- }
303
-
304
- /* 邻月的日子照样可点,只是压暗——它们不是占位符 */
305
- [data-scope='calendar'][data-part='cell-trigger'][data-outside-month] {
306
- color: var(--xh-calendar-cell-fg-outside, var(--xh-fg-subtle));
307
- }
308
-
309
- [data-scope='calendar'][data-part='cell-trigger']:not([data-disabled]):not([data-selected]):hover {
310
- background: var(--xh-calendar-cell-bg-hover, var(--xh-bg-subtle-hover));
311
- }
312
-
313
- /* 今天:只描一圈边,不占用选中色——今天与被选中是两件事,得能同时看得出来 */
314
- [data-scope='calendar'][data-part='cell-trigger'][data-today] {
315
- border-color: var(--xh-calendar-today-border, var(--xh-border-control));
316
- }
317
-
318
- [data-scope='calendar'][data-part='cell-trigger'][data-selected] {
319
- border-color: transparent;
320
- background: var(--xh-calendar-cell-bg-selected, var(--xh-bg-brand));
321
- color: var(--xh-calendar-cell-fg-selected, var(--xh-fg-on-brand));
322
- font-weight: var(--xh-font-weight-medium);
323
- }
324
-
325
-
326
- /* 不可用走 aria-disabled 而非原生 disabled:格子仍要可聚焦(它还得当方向键的起点),
327
- 所以只能靠 data-disabled 表达,写 :disabled 永远不命中 */
328
- [data-scope='calendar'][data-part='cell-trigger'][data-disabled] {
329
- color: var(--xh-fg-disabled);
330
- cursor: not-allowed;
331
- }
332
-
333
- [data-scope='calendar'][data-part='cell-trigger'][data-disabled][data-selected] {
334
- background: var(--xh-bg-muted);
335
- color: var(--xh-fg-disabled);
336
- }
337
-
338
- /* 焦点环画在格子上:整张网格只有一格在 Tab 序列里,落焦点必须一眼看得见。
339
- 往内收一像素,免得被相邻格子的底色盖住 */
340
- [data-scope='calendar'][data-part='cell-trigger']:focus-visible {
341
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
342
- outline-offset: calc(-1 * var(--xh-ring-width));
343
- }
344
-
345
- /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
346
- [data-scope='calendar'][data-part='prev-trigger']:empty::before {
347
- content: '';
348
- display: inline-block;
349
- inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
350
- block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
351
- vertical-align: var(--xh-glyph-baseline-shift);
352
- background-color: currentColor;
353
- -webkit-mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
354
- mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
355
- }
356
-
357
- [data-scope='calendar'][data-part='next-trigger']:empty::before {
358
- content: '';
359
- display: inline-block;
360
- inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
361
- block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
362
- vertical-align: var(--xh-glyph-baseline-shift);
363
- background-color: currentColor;
364
- -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
365
- mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
366
- }
367
- }
@@ -1,91 +0,0 @@
1
- @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
- [data-scope='code-block'] {
4
- --xh-code-block-skin: 1;
5
- }
6
-
7
- /* overflow: hidden 让内部 <pre> 的滚动内容沿圆角收边;不设 display,排布由作者决定 */
8
- [data-scope='code-block'][data-part='root'] {
9
- overflow: hidden;
10
- border-radius: var(--xh-code-block-radius, var(--xh-shape-surface));
11
- background: var(--xh-code-block-bg, var(--xh-bg-subtle));
12
- }
13
-
14
- /* 显式 block 使作者用 <span> 时也能吃进 padding-block;user-select: none 让它不被框选带走 */
15
- [data-scope='code-block'][data-part='lang-label'] {
16
- display: block;
17
- padding-inline: var(--xh-code-block-label-px, var(--xh-space-3));
18
- padding-block: var(--xh-code-block-label-py, var(--xh-space-1));
19
- color: var(--xh-code-block-label-fg, var(--xh-fg-muted));
20
- font-size: var(--xh-code-block-label-font-size, var(--xh-text-label-size));
21
- line-height: var(--xh-leading-none);
22
- user-select: none;
23
- }
24
-
25
- /* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
26
- [data-scope='code-block'][data-part='lang-label'][hidden] {
27
- display: none;
28
- }
29
-
30
- /* margin: 0 去掉 UA 给 <pre> 的默认外边距。
31
- --xh-code-block-line-height 的兜底值须与连接层内联 min-block-size 用的一致,
32
- 且因参与 calc 乘法必须是长度而非无单位倍数。 */
33
- [data-scope='code-block'][data-part='pre'] {
34
- /* 逻辑属性 overflow-inline 尚无可用实现,写物理轴 */
35
- overflow-x: auto;
36
- padding: var(--xh-code-block-p, var(--xh-space-3));
37
- margin: 0;
38
- line-height: var(--xh-code-block-line-height, 1.5rem);
39
- }
40
-
41
- /* <pre> 带 tabindex=0,需要焦点环;偏移取负画在内侧,避免被 root 的 overflow: hidden 裁掉 */
42
- [data-scope='code-block'][data-part='pre']:focus-visible {
43
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
44
- outline-offset: calc(-1 * var(--xh-ring-width));
45
- }
46
-
47
- /* white-space: pre 保留缩进不自动换行,长行改为横向滚动 */
48
- [data-scope='code-block'][data-part='code'] {
49
- font-family: var(--xh-code-block-font, var(--xh-font-family-mono));
50
- white-space: pre;
51
- }
52
-
53
- /* 开了换行:pre-wrap 仍保留缩进与连续空白,只是允许行尾折下来;
54
- anywhere 让没有空格的长串(url、base64)也能断,否则照样撑出横向滚动 */
55
- [data-scope='code-block'][data-part='code'][data-wrap] {
56
- white-space: pre-wrap;
57
- overflow-wrap: anywhere;
58
- }
59
-
60
- /* 语法配色:注释与标点复用既有语义色,三种真需要色相的走 --xh-syntax-* 语法令牌(随主题明暗切换)。 */
61
- [data-scope='code-block'][data-part='root'] {
62
- --xh-code-block-comment-fg: var(--xh-fg-muted);
63
- --xh-code-block-punctuation-fg: var(--xh-fg-subtle);
64
- --xh-code-block-string-fg: var(--xh-syntax-string);
65
- --xh-code-block-number-fg: var(--xh-syntax-number);
66
- --xh-code-block-keyword-fg: var(--xh-syntax-keyword);
67
- }
68
-
69
- /* 记号本身不带任何布局,只上色:它是 <code> 里的行内片段,多一点盒模型都会破坏对齐 */
70
- [data-scope='code-block'][data-part='token'][data-kind='comment'] {
71
- color: var(--xh-code-block-comment-fg);
72
- font-style: italic;
73
- }
74
-
75
- [data-scope='code-block'][data-part='token'][data-kind='string'] {
76
- color: var(--xh-code-block-string-fg);
77
- }
78
-
79
- [data-scope='code-block'][data-part='token'][data-kind='number'] {
80
- color: var(--xh-code-block-number-fg);
81
- }
82
-
83
- [data-scope='code-block'][data-part='token'][data-kind='keyword'] {
84
- color: var(--xh-code-block-keyword-fg);
85
- font-weight: var(--xh-code-block-keyword-weight, var(--xh-font-weight-semibold));
86
- }
87
-
88
- [data-scope='code-block'][data-part='token'][data-kind='punctuation'] {
89
- color: var(--xh-code-block-punctuation-fg);
90
- }
91
- }