@endfield-ui/react 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/NOTICE.md +32 -2
  2. package/README.md +37 -2
  3. package/dist/game/LICENSE.lucide +43 -0
  4. package/dist/game/assets/alert_banner_bg_left.png +0 -0
  5. package/dist/game/assets/alert_banner_bg_right.png +0 -0
  6. package/dist/game/assets/alert_bg.png +0 -0
  7. package/dist/game/assets/deco_common_logo_bg.png +0 -0
  8. package/dist/game/assets/detail.png +0 -0
  9. package/dist/game/assets/enemies_background.webp +0 -0
  10. package/dist/game/assets/enemies_background_dark.webp +0 -0
  11. package/dist/game/assets/header.webp +0 -0
  12. package/dist/game/assets/icon_card_rarity_1_bottom_edge.webp +0 -0
  13. package/dist/game/assets/icon_card_rarity_2_bottom_edge.webp +0 -0
  14. package/dist/game/assets/icon_card_rarity_3_bottom_edge.webp +0 -0
  15. package/dist/game/assets/icon_card_rarity_4_bottom_edge.webp +0 -0
  16. package/dist/game/assets/icon_card_rarity_5_bottom_edge.webp +0 -0
  17. package/dist/game/assets/icon_card_rarity_6_bottom_edge.webp +0 -0
  18. package/dist/game/assets/items_background.webp +0 -0
  19. package/dist/game/assets/items_background_dark.webp +0 -0
  20. package/dist/game/assets/link.webp +0 -0
  21. package/dist/game/assets/pag-button-texture.png +0 -0
  22. package/dist/game/assets/weapons_background.webp +0 -0
  23. package/dist/game/assets/weapons_background_dark.webp +0 -0
  24. package/dist/game/resource-provenance.json +384 -0
  25. package/dist/game/styles.css +2 -0
  26. package/dist/game.d.ts +372 -0
  27. package/dist/game.js +2042 -0
  28. package/dist/index.js +2 -2
  29. package/package.json +9 -2
  30. package/src/components/README.md +3 -1
  31. package/src/components/carousel/Carousel.tsx +2 -1
  32. package/src/components/dash-indicator/DashIndicator.tsx +5 -1
  33. package/src/styles/README.md +5 -1
  34. package/src/styles/index.css +5 -0
package/dist/index.js CHANGED
@@ -1487,7 +1487,7 @@ function DashIndicator({ count, index, className, ...props }) {
1487
1487
  role: "img",
1488
1488
  "aria-label": `第 ${current + 1} 项,共 ${total} 项`,
1489
1489
  ...props,
1490
- className: cn("inline-flex items-center gap-1", className),
1490
+ className: cn("inline-flex max-w-full min-w-0 items-center gap-1", className),
1491
1491
  children: Array.from({ length: total }, (_, position) => /* @__PURE__ */ jsx("span", {
1492
1492
  "data-current": position === current ? "" : void 0,
1493
1493
  className: cn("h-0.5 transition-[width,background-color] duration-(--duration-base) ease-standard", position === current ? "w-8 bg-accent-ink forced-colors:bg-[Highlight]" : "w-4 bg-line-strong forced-colors:bg-[CanvasText]")
@@ -1644,7 +1644,7 @@ function Carousel({ index: indexProp, defaultIndex = 0, onIndexChange, loop = fa
1644
1644
  "aria-hidden": "true",
1645
1645
  className: "flex items-center gap-3",
1646
1646
  children: [/* @__PURE__ */ jsx("span", {
1647
- className: "font-tech text-xs text-ink-secondary tabular-nums",
1647
+ className: "shrink-0 font-tech text-xs whitespace-nowrap text-ink-secondary tabular-nums",
1648
1648
  children: `${index + 1} / ${count}`
1649
1649
  }), indicator && /* @__PURE__ */ jsx(DashIndicator, {
1650
1650
  count,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@endfield-ui/react",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "终末地风格的 React 基础控件库(非官方)",
5
5
  "keywords": [
6
6
  "react",
@@ -32,6 +32,7 @@
32
32
  "src",
33
33
  "!src/**/*.test.*",
34
34
  "!src/test",
35
+ "!src/game",
35
36
  "NOTICE.md"
36
37
  ],
37
38
  "exports": {
@@ -43,6 +44,11 @@
43
44
  "./styles.css": "./dist/styles.css",
44
45
  "./theme.css": "./src/styles/theme.css",
45
46
  "./utilities.css": "./src/styles/utilities.css",
47
+ "./game": {
48
+ "types": "./dist/game.d.ts",
49
+ "default": "./dist/game.js"
50
+ },
51
+ "./game.css": "./dist/game/styles.css",
46
52
  "./package.json": "./package.json"
47
53
  },
48
54
  "peerDependencies": {
@@ -77,8 +83,9 @@
77
83
  "vitest": "^5.0.3"
78
84
  },
79
85
  "scripts": {
80
- "build": "tsdown && pnpm build:css",
86
+ "build": "tsdown && pnpm build:css && pnpm build:game",
81
87
  "build:css": "tailwindcss -i src/styles/index.css -o dist/styles.css --minify",
88
+ "build:game": "tailwindcss -i src/game/styles.css -o dist/game/styles.css --minify && node scripts/copy-game-assets.mjs",
82
89
  "test": "vitest run",
83
90
  "test:watch": "vitest",
84
91
  "typecheck": "tsc --noEmit"
@@ -1,5 +1,7 @@
1
1
  # components
2
2
 
3
+ 主入口(`@endfield-ui/react`)的控件。照游戏内界面复刻的那一组在 [`../game`](../game/README.md),独立入口,约定不同;这个目录里的东西不许引它。
4
+
3
5
  | 目录 | 导出 | 规范 |
4
6
  | --- | --- | --- |
5
7
  | `button/` | `Button`、`ButtonGroup` | [按钮](../../../../docs/design/components/button.md) |
@@ -138,7 +140,7 @@ components/
138
140
  - 每个交互组件都要有 `:focus-visible` 样式,用 [`focusRing`](../lib/focus-ring.ts);会被滚动容器裁切的地方用 `focusRingInset`;外框自己不能聚焦、里面的控件能(输入框)时用 `focusRingWithin`。焦点环不能被 `clip-path` 裁掉(做法见 [切角与斜楔](../../../../docs/design/elements/corner-and-wedge.md))。
139
141
  - 悬停用 Tailwind 的 `hover:`,它只在有指针的设备上生效。
140
142
  - 组件内部的响应式看**自身宽度**,用容器查询(`@container` + `@md:` 这类变体),不用视口断点(`md:`):组件不知道自己会被放进多窄的栏里。视口断点只留给"必须和页面布局同步切换"的地方,目前只有 `SectionTitle` 的 `side` 形态。
141
- - 会出现英文长单词的大号文字加 `wrap-anywhere` 兜底,并确保它所在的弹性子项能收缩(`min-w-0` 或 `max-w-full`)。有意不换行的控件(按钮、标签、页签)除外。
143
+ - 会出现英文长单词的大号文字加 `wrap-anywhere` 兜底,并确保它所在的弹性子项能收缩(`min-w-0` 或 `max-w-full`)。有意不换行的控件(按钮、标签、页签)除外。中间带空格的短读数(轮播的 `1 / 5`)不折行也不收缩(`shrink-0 whitespace-nowrap`):同一行里让别的东西去收,不然它被挤成一竖条。
142
144
  - 装饰元素(竖条、箭头、分隔线)加 `aria-hidden`。
143
145
  - 动效遵守 `prefers-reduced-motion`:降级后内容必须停在终态。循环动画停下来的样子不能被看成一个具体的值:不确定进度的色块停在正中,进度环换成一圈虚线。
144
146
  - 用 `group` / `peer` 时给 `group` 起名字(`group/card` + `group-hover/card:`):不起名的 `group-hover:` 会被外层任何一个 `group` 的悬停带着走,控件一旦被放进别的可悬停容器就会出错。
@@ -186,7 +186,8 @@ export function Carousel({
186
186
  <div className="flex flex-col gap-1">
187
187
  {/* 看得见的计数和短横只给眼睛:同样的话下面的说明区会播报 */}
188
188
  <div aria-hidden="true" className="flex items-center gap-3">
189
- <span className="font-tech text-xs text-ink-secondary tabular-nums">
189
+ {/* 这一行放不下时让短横去收窄:计数中间有空格,被挤了会折成一竖条 */}
190
+ <span className="shrink-0 font-tech text-xs whitespace-nowrap text-ink-secondary tabular-nums">
190
191
  {`${index + 1} / ${count}`}
191
192
  </span>
192
193
  {indicator && <DashIndicator count={count} index={index} />}
@@ -26,7 +26,11 @@ export function DashIndicator({
26
26
  role="img"
27
27
  aria-label={`第 ${current + 1} 项,共 ${total} 项`}
28
28
  {...props}
29
- className={cn("inline-flex items-center gap-1", className)}
29
+ className={cn(
30
+ // 放不下时各根等比收窄,不顶出容器:短横本来就能收,卡住的是这一层自己的最小宽度
31
+ "inline-flex max-w-full min-w-0 items-center gap-1",
32
+ className,
33
+ )}
30
34
  >
31
35
  {Array.from({ length: total }, (_, position) => (
32
36
  <span
@@ -6,13 +6,17 @@
6
6
  | [utilities.css](utilities.css) | `@utility`:母题工具类(斜纹、切角、斜楔、角括号、镂空字、警示条纹、竖条变箭头),以及菱形表单符号的开关 |
7
7
  | [index.css](index.css) | 入口:`tailwindcss` → `theme.css` → `utilities.css` → 基础样式 → `@source` |
8
8
 
9
- 对外的三个入口(见包的 `exports`):
9
+ 对外的入口(见包的 `exports`):
10
10
 
11
11
  | 引入路径 | 对应 | 给谁用 |
12
12
  | --- | --- | --- |
13
13
  | `@endfield-ui/react/tailwind.css` | `index.css` | 用 Tailwind v4 的项目,代替 `@import "tailwindcss"` |
14
14
  | `@endfield-ui/react/styles.css` | `dist/styles.css` | 不用 Tailwind 的项目,预编译产物 |
15
15
  | `@endfield-ui/react/theme.css` | `theme.css` | 只要令牌、不要组件 |
16
+ | `@endfield-ui/react/utilities.css` | `utilities.css` | 只要母题工具类 |
17
+ | `@endfield-ui/react/game.css` | `dist/game/styles.css` | 用了 [Game 实机风格](../game/README.md)那一类控件的项目;纯 CSS,和上面的主样式一起引 |
18
+
19
+ Game 实机风格的样式不在这个目录里,也不在主样式里:源码是 [`../game/styles.css`](../game/styles.css) 汇总的每个控件一份纯 CSS,`index.css` 用 `@source not` 把那个目录排除在扫描之外。
16
20
 
17
21
  ## theme.css 的结构
18
22
 
@@ -16,6 +16,11 @@
16
16
  * 焦点环这类共用的类名写在 lib 里。
17
17
  */
18
18
  @source "../";
19
+ /*
20
+ * game 目录不扫:那一类是独立入口(`@endfield-ui/react/game`),样式自己一份纯 CSS,
21
+ * 不用工具类。扫了它,源码里碰巧和工具类同名的词会混进这份产物。
22
+ */
23
+ @source not "../game";
19
24
 
20
25
  @layer base {
21
26
  body {