@mooncellwiki/prts-design-css 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/dist/prts-design.css +6762 -0
  4. package/dist/prts-design.min.css +2 -0
  5. package/package.json +55 -0
  6. package/src/arknights/archive.css +21 -0
  7. package/src/arknights/attrs.css +11 -0
  8. package/src/arknights/camp.css +8 -0
  9. package/src/arknights/dialogue.css +7 -0
  10. package/src/arknights/dossier.css +13 -0
  11. package/src/arknights/elite.css +5 -0
  12. package/src/arknights/enemy.css +12 -0
  13. package/src/arknights/event.css +14 -0
  14. package/src/arknights/hero.css +11 -0
  15. package/src/arknights/index.css +41 -0
  16. package/src/arknights/item.css +32 -0
  17. package/src/arknights/kv.css +15 -0
  18. package/src/arknights/level.css +9 -0
  19. package/src/arknights/materials.css +6 -0
  20. package/src/arknights/module.css +49 -0
  21. package/src/arknights/news.css +6 -0
  22. package/src/arknights/op-card.css +26 -0
  23. package/src/arknights/op-row.css +6 -0
  24. package/src/arknights/phase-tabs.css +8 -0
  25. package/src/arknights/pot-list.css +7 -0
  26. package/src/arknights/potential.css +4 -0
  27. package/src/arknights/profession.css +16 -0
  28. package/src/arknights/range.css +10 -0
  29. package/src/arknights/rarity.css +21 -0
  30. package/src/arknights/rich-text.css +18 -0
  31. package/src/arknights/skill-levels.css +13 -0
  32. package/src/arknights/skill-matrix.css +25 -0
  33. package/src/arknights/skill-sheet.css +30 -0
  34. package/src/arknights/skill.css +28 -0
  35. package/src/arknights/sp.css +15 -0
  36. package/src/arknights/stage.css +22 -0
  37. package/src/arknights/table-numerals.css +7 -0
  38. package/src/arknights/talent-table.css +30 -0
  39. package/src/arknights/talent.css +7 -0
  40. package/src/arknights/trust.css +4 -0
  41. package/src/arknights/voice.css +21 -0
  42. package/src/base/catlinks.css +64 -0
  43. package/src/base/collapsible.css +10 -0
  44. package/src/base/forms.css +121 -0
  45. package/src/base/index.css +20 -0
  46. package/src/base/media.css +26 -0
  47. package/src/base/notices.css +17 -0
  48. package/src/base/print.css +11 -0
  49. package/src/base/references.css +9 -0
  50. package/src/base/root.css +16 -0
  51. package/src/base/special-pages.css +43 -0
  52. package/src/base/tabber.css +31 -0
  53. package/src/base/tables.css +45 -0
  54. package/src/base/toc.css +19 -0
  55. package/src/base/typography.css +133 -0
  56. package/src/bridge-codex.css +98 -0
  57. package/src/chrome/body.css +13 -0
  58. package/src/chrome/footer.css +34 -0
  59. package/src/chrome/header.css +104 -0
  60. package/src/chrome/index.css +29 -0
  61. package/src/chrome/keyart.css +15 -0
  62. package/src/chrome/layout.css +15 -0
  63. package/src/chrome/local-nav.css +17 -0
  64. package/src/chrome/page-header.css +68 -0
  65. package/src/chrome/responsive.css +127 -0
  66. package/src/chrome/search-palette.css +121 -0
  67. package/src/chrome/shell.css +4 -0
  68. package/src/chrome/sidebar-tree.css +36 -0
  69. package/src/chrome/sidebar.css +39 -0
  70. package/src/chrome/special-pages.css +4 -0
  71. package/src/chrome/theme-toggle.css +10 -0
  72. package/src/chrome/toc.css +38 -0
  73. package/src/components/accordion.css +10 -0
  74. package/src/components/avatar.css +8 -0
  75. package/src/components/badge.css +16 -0
  76. package/src/components/breadcrumb.css +7 -0
  77. package/src/components/button.css +45 -0
  78. package/src/components/card.css +28 -0
  79. package/src/components/cbox.css +18 -0
  80. package/src/components/chip.css +9 -0
  81. package/src/components/dialog.css +14 -0
  82. package/src/components/divider.css +8 -0
  83. package/src/components/dropdown.css +30 -0
  84. package/src/components/empty.css +5 -0
  85. package/src/components/fab.css +9 -0
  86. package/src/components/form.css +66 -0
  87. package/src/components/heading.css +11 -0
  88. package/src/components/index.css +38 -0
  89. package/src/components/keyframes.css +14 -0
  90. package/src/components/message.css +21 -0
  91. package/src/components/pagination.css +11 -0
  92. package/src/components/panel.css +15 -0
  93. package/src/components/progress.css +19 -0
  94. package/src/components/skeleton.css +5 -0
  95. package/src/components/spinner.css +23 -0
  96. package/src/components/stat.css +12 -0
  97. package/src/components/stepper.css +14 -0
  98. package/src/components/table.css +17 -0
  99. package/src/components/tabs.css +29 -0
  100. package/src/components/tag.css +26 -0
  101. package/src/components/timeline.css +13 -0
  102. package/src/components/title-reset.css +8 -0
  103. package/src/components/toast.css +14 -0
  104. package/src/components/tooltip.css +31 -0
  105. package/src/decor/bilingual.css +6 -0
  106. package/src/decor/brackets.css +6 -0
  107. package/src/decor/chevrons.css +5 -0
  108. package/src/decor/corner.css +12 -0
  109. package/src/decor/glyph.css +7 -0
  110. package/src/decor/halftone.css +13 -0
  111. package/src/decor/index.css +18 -0
  112. package/src/decor/inverse.css +4 -0
  113. package/src/decor/patterns.css +7 -0
  114. package/src/decor/stripes.css +10 -0
  115. package/src/decor/type.css +10 -0
  116. package/src/forced-colors.css +54 -0
  117. package/src/index.css +18 -0
  118. package/src/scope.css +120 -0
  119. package/src/search-palette.js +549 -0
  120. package/src/sidebar-tree.js +220 -0
  121. package/src/standalone.css +12 -0
  122. package/src/tokens.css +665 -0
  123. package/src/utilities.css +43 -0
package/src/scope.css ADDED
@@ -0,0 +1,120 @@
1
+ /*! ═══════════════════════════════════════════════════════════════════════════
2
+ * PRTS Design · scope.css — 作用域根:组件所需的排版基线(字体 / 字号 / 行高 / 前景色)挂在 .ak-scope 或皮肤的 body 上,不依赖宿主的 body。
3
+ * Arknights 皮肤:body.skin-arknights 就是作用域;别的皮肤 / 站外:widget 根节点加 class="ak-scope"(Vue:<AkScope>)。
4
+ * 局部主题 .ak-scope[data-theme="dark|light"]:令牌在 tokens.css 里跟着挂到作用域上,这里补画布底色——否则终端模式的浅色字落在宿主的白底上。
5
+ * 组件层(components / decor / arknights / utilities)只依赖本文件与 tokens.css:需要的字体 / 行高自己写令牌,不靠宿主继承。
6
+ * 依赖:tokens.css
7
+ * ═══════════════════════════════════════════════════════════════════════════ */
8
+ .ak-scope, body.skin-arknights {
9
+ color: var(--ak-fg);
10
+ font-family: var(--ak-font-body);
11
+ font-size: var(--ak-fs-body);
12
+ line-height: var(--ak-lh-body);
13
+ -webkit-font-smoothing: antialiased;
14
+ text-rendering: optimizeLegibility;
15
+ }
16
+ .ak-scope[data-theme] { background-color: var(--ak-bg-canvas); }
17
+
18
+ /* ═══ 别的宿主上:把宿主的页面环境换成 Arknights 皮肤上组件看到的那一个 ═══
19
+ * 下面各条都只对「不在 Arknights 皮肤页面里」的作用域生效(:not(.skin-arknights *))——Arknights 皮肤上这些本来就由 base/ 全页提供,
20
+ * 那里 <AkScope> 只剩上面的排版基线(与 body 同值)。e2e/hosts.spec.ts 以 Arknights 皮肤为基准逐元素比对 Vector 2022 / 站外,差异应当为零。
21
+ * 特指度都压得很低:只求压过宿主的元素级规则(Vector 的 h3 / p / li / img / code …是 (0,0,1)),组件类(0,1,0)照样盖得过。 */
22
+
23
+ /* 1. 宿主继承下来的文字属性(Vector 的 .vector-body 等会往下传 overflow-wrap 之类):作用域根上回到 Arknights 皮肤正文里组件继承到的值——
24
+ * 都是初始值,只有 overflow-wrap 跟正文(chrome/body.css 的 .ak-body .mw-body-content)走 break-word,两边同步改 */
25
+ :where(.ak-scope:not(.skin-arknights *)) {
26
+ font-style: normal; font-weight: 400; font-variant: normal; letter-spacing: normal; word-spacing: normal;
27
+ text-transform: none; text-indent: 0; text-align: start; text-shadow: none; white-space: normal; overflow-wrap: break-word; word-break: normal; hyphens: manual;
28
+ }
29
+
30
+ /* 2. 皮肤全局基底(base/root.css:滚动条 / 选区 / 焦点环 / 减弱动效)在 Arknights 皮肤上是全页的,这里在作用域内补同一套 */
31
+ :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *) { scrollbar-color: var(--ak-scrollbar) transparent; scrollbar-width: thin; }
32
+ :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *)::-webkit-scrollbar { width: 8px; height: 8px; }
33
+ :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *)::-webkit-scrollbar-thumb { background: var(--ak-scrollbar); }
34
+ :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *)::selection { background: var(--ak-selection); }
35
+ :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *):where(:focus-visible) { outline: 2px solid var(--ak-focus); outline-offset: 2px; }
36
+ a:focus-visible:where(.ak-scope:not(.skin-arknights *) *) { outline: 2px solid var(--ak-focus); outline-offset: 2px; } /* 链接单独一条 (0,1,1):宿主的 a:focus-visible(Vector:outline: solid 2px #36c)是 (0,1,1),上面压成 0 的那条压不过;组件自己的 .ak-x:focus-visible (0,2,0) 照样盖得过 */
37
+ @media (prefers-reduced-motion: reduce) {
38
+ :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *), :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *)::before, :where(.ak-scope:not(.skin-arknights *), .ak-scope:not(.skin-arknights *) *)::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
39
+ }
40
+
41
+ /* 3. 宿主的元素级规则(Vector:h1–h6 的字号 / 外边距 / display: flow-root、li 的下外边距、img 的 vertical-align、code 的底色边框 …)
42
+ * 在「组件自己的元素」(类名以 ak- 开头的——按词匹配,不是子串:break-* / track-* 这类正文类名不算;以及组件元素直接包着的 <img>)和 not-prose 子树里退回浏览器默认(revert)——PRTS Design 的正文排版不进 not-prose,
43
+ * 组件元素上的正文规则也该被组件类盖掉:组件要的外边距 / 行高 / 字号自己写(hosts 比对里曾靠正文规则拿到的几处——技能名行高、键值表外边距——已补在组件里)。
44
+ * 特指度 (0,0,1),与宿主的元素规则相同、靠后加载;组件类照样盖得过它。
45
+ * 表单控件不在这里(下一段给 PRTS Design 的裸控件外观);not-prose 之外、不带 ak- 类的正文内容(段落 / 列表 / 链接)归宿主的正文排版,不动。 */
46
+ :where(.ak-scope:not(.skin-arknights *) *):where([class^="ak-"], [class*=" ak-"], .ak-not-prose *, :is([class^="ak-"], [class*=" ak-"]) > img):is(h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, pre, code, kbd, samp, img, table, caption, th, td, blockquote, figure, figcaption, hr) {
47
+ margin: revert; padding: revert; border: revert; border-radius: revert; background-color: revert; color: revert;
48
+ font-family: revert; font-size: revert; font-weight: revert; line-height: revert;
49
+ display: revert; list-style: revert; vertical-align: revert; white-space: revert; word-break: revert; overflow-wrap: revert;
50
+ }
51
+ /* 宿主正文里带类名上下文的几条(Vector 2022:.mw-body p 的段距 (0,1,1)、.mw-parser-output a 的 word-wrap (0,1,1)):同特指度压回——
52
+ * 只在 not-prose 子树里的段落 / 组件与 not-prose 里的链接上,组件在这些元素上写外边距 / 断词都用不低于 (0,1,1) 的选择器 */
53
+ :where(.ak-scope:not(.skin-arknights *) *):is(.ak-not-prose p) { margin: revert; }
54
+ :where(.ak-scope:not(.skin-arknights *) *):is(.ak-not-prose a, a.ak-not-prose, a:is([class^="ak-"], [class*=" ak-"])) { overflow-wrap: revert; word-break: revert; }
55
+
56
+ /* 4. 裸控件:组件里的 <button> / <input> / <select> / <textarea>(.ak-btn、.ak-tab、分页、勾选 / 单选、开关 …)的底子是 base/forms.css 的裸控件规则
57
+ * (去掉原生外观、字体跟正文、勾选框 / 单选的自绘脸),这里给作用域补同一套——与 base/forms.css 逐条对应、同步改。
58
+ * 特指度与 base/forms.css 完全相同(只在前面加一个 :where() 前缀):两边都在组件之前加载,和组件规则谁压谁的结果才一样
59
+ * (如 :disabled:checked 那条 (0,2,0) 压过 .ak-switch > input 的 border: 0)。表格里的紧凑档(MW 正文专用,选择器带 .mw-body-content)不搬。
60
+ * scripts/css-order.ts 会把本段去掉 :where(.ak-scope:not(.skin-arknights *) *) 前缀后逐条与 base/forms.css 对照:两边少一条、改一边都报错。 */
61
+ :where(.ak-scope:not(.skin-arknights *) *):where(input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"], [type="color"], [type="button"], [type="submit"], [type="reset"], [type="image"], [type="hidden"]), select, textarea) {
62
+ box-sizing: border-box; max-width: 100%;
63
+ font: inherit; font-size: var(--ak-fs-sm); font-weight: 400; line-height: 1.5;
64
+ color: var(--ak-fg); background: var(--ak-bg-surface);
65
+ border: 1px solid var(--ak-border-strong); border-radius: var(--ak-radius-sm);
66
+ padding: 0 10px; min-height: 36px;
67
+ transition: border-color var(--ak-dur-fast), box-shadow var(--ak-dur-fast);
68
+ }
69
+ :where(.ak-scope:not(.skin-arknights *) *):where(textarea) { padding: 8px 10px; min-height: 72px; resize: vertical; }
70
+ :where(.ak-scope:not(.skin-arknights *) *):where(select[multiple]) { padding: 4px 0; }
71
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="search"]) { -webkit-appearance: none; appearance: none; }
72
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="number"]) { font-variant-numeric: tabular-nums; }
73
+ :where(.ak-scope:not(.skin-arknights *) *):where(input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"], [type="color"], [type="button"], [type="submit"], [type="reset"], [type="image"]), select, textarea):focus { outline: 0; border-color: var(--ak-accent); box-shadow: var(--ak-shadow-accent); }
74
+ :where(.ak-scope:not(.skin-arknights *) *):where(input, textarea)::placeholder { color: var(--ak-fg-subtle); opacity: 1; }
75
+ :where(.ak-scope:not(.skin-arknights *) *):where(input, textarea)[readonly] { background: var(--ak-bg-inset); }
76
+ :where(.ak-scope:not(.skin-arknights *) *):where(input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"], [type="color"]), select, textarea):disabled { background: var(--ak-bg-surface-3); color: var(--ak-fg-disabled); -webkit-text-fill-color: var(--ak-fg-disabled); opacity: 1; border-color: var(--ak-border); cursor: not-allowed; }
77
+ :where(.ak-scope:not(.skin-arknights *) *):where(input, textarea, select):where(:user-invalid, [aria-invalid="true"]) { border-color: var(--ak-danger); }
78
+ :where(.ak-scope:not(.skin-arknights *) *):where(input, textarea, select):where(:user-invalid, [aria-invalid="true"]):focus { box-shadow: 0 0 0 3px var(--ak-danger-bg); }
79
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"], input[type="radio"]) { appearance: none; -webkit-appearance: none; accent-color: var(--ak-accent); box-sizing: border-box; width: 18px; height: 18px; margin: 0; flex: none; display: inline-grid; place-items: center; vertical-align: middle;
80
+ border: 2px solid var(--ak-border-strong); background: var(--ak-bg-surface); cursor: pointer; transition: background var(--ak-dur-fast), border-color var(--ak-dur-fast); }
81
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="radio"]) { border-radius: 50%; }
82
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"], input[type="radio"]):checked { background: var(--ak-accent); border-color: var(--ak-accent); }
83
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"]):checked::before { content: ""; width: 56%; height: 32%; border: 0 solid var(--ak-accent-fg); border-width: 0 0 2px 2px; transform: translateY(-15%) rotate(-45deg); }
84
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"]):indeterminate { background: var(--ak-accent); border-color: var(--ak-accent); }
85
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"]):indeterminate::before { content: ""; width: 56%; height: 2px; background: var(--ak-accent-fg); }
86
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="radio"]):checked::before { content: ""; width: 44%; height: 44%; border-radius: 50%; background: var(--ak-accent-fg); }
87
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"], input[type="radio"]):focus-visible { outline: 0; border-color: var(--ak-accent); box-shadow: var(--ak-shadow-accent); }
88
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"], input[type="radio"]):disabled { background: var(--ak-bg-surface-3); border-color: var(--ak-border); cursor: not-allowed; }
89
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="checkbox"], input[type="radio"]):disabled:checked { background: var(--ak-fg-disabled); border-color: var(--ak-fg-disabled); }
90
+ :where(.ak-scope:not(.skin-arknights *) *):where(select:not([multiple])) { appearance: none; -webkit-appearance: none; padding-right: 30px; background-image: var(--ak-select-arrow); background-position: calc(100% - 15px) 50%, calc(100% - 10px) 50%; background-size: 5px 5px; background-repeat: no-repeat; }
91
+ :where(.ak-scope:not(.skin-arknights *) *):where(input[type="range"]) { accent-color: var(--ak-accent); vertical-align: middle; }
92
+ label:where(.ak-scope:not(.skin-arknights *) *) { cursor: pointer; }
93
+ :where(.ak-scope:not(.skin-arknights *) *):where(button, input[type="button"], input[type="submit"], input[type="reset"]) {
94
+ box-sizing: border-box; appearance: none; -webkit-appearance: none;
95
+ font-family: var(--ak-font-body); font-size: var(--ak-fs-sm); font-weight: 600; line-height: 20px;
96
+ color: var(--ak-fg); background: var(--ak-bg-surface);
97
+ border: 1px solid var(--ak-border-strong); border-radius: var(--ak-radius);
98
+ padding: 7px 12px; cursor: pointer;
99
+ }
100
+ :where(.ak-scope:not(.skin-arknights *) *):where(button, input[type="button"], input[type="submit"], input[type="reset"]):hover { background: var(--ak-bg-hover); border-color: var(--ak-fg-muted); }
101
+ :where(.ak-scope:not(.skin-arknights *) *):where(button, input[type="button"], input[type="submit"], input[type="reset"]):disabled { color: var(--ak-fg-disabled); background: var(--ak-bg-surface-3); border-color: var(--ak-border); cursor: default; }
102
+ /* iPhone:iOS Safari 对字号 <16px 的文本类控件聚焦时会把整页放大且不缩回,手机断点下提到 16px(= base/forms.css 同一条) */
103
+ @supports (-webkit-touch-callout: none) {
104
+ @media (max-width: 639px) {
105
+ :where(.ak-scope:not(.skin-arknights *) *):where(input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"], [type="color"], [type="button"], [type="submit"], [type="reset"], [type="image"], [type="hidden"]), select, textarea) { font-size: 16px; }
106
+ }
107
+ }
108
+
109
+ /* 5. not-prose 隔离·链接:宿主皮肤的全局链接规则会把整块是链接的组件染成链接色——
110
+ * a(0,0,1)上链接色、a:visited / a:active(0,1,1)换色、a:hover / a:focus(0,1,1)画下划线。
111
+ * Arknights 皮肤上用不着这段(base/typography.css 的正文链接规则自带 :not(:where(.ak-not-prose …)),not-prose 子树里没有要压的)。
112
+ * 逐条与宿主同特指度、靠后加载压过宿主,不再高——组件自己的 a 规则都在本文件之后:
113
+ * a(0,0,1):链接色退回继承、去下划线,组件类(0,1,0)照样盖得过;
114
+ * a:visited / a:active / a:hover / a:focus(0,1,1):退颜色、去下划线(Vector 的 a:hover 除下划线外还换色)。
115
+ * 这几条 (0,1,1) 会盖过组件写在 <a> 根节点上的 (0,1,0) 颜色——但宿主的同特指度规则本来就盖过了,这里只是把链接色换回继承色;
116
+ * 根节点颜色不是继承色的链接型组件(.ak-btn / .ak-stage-code / .ak-op-card / .ak-item …)自己把颜色规则写到 :hover / :visited / :active 上(0,2,0+),
117
+ * 与 Arknights 皮肤上的表现一致(那里 base/typography.css 的链接规则排除了 not-prose)。getComputedStyle 看不到 :visited,工具测不出来,只能靠这条约定。 */
118
+ a:where(.ak-scope:not(.skin-arknights *) *):where(.ak-not-prose, .ak-not-prose *) { color: inherit; text-decoration: none; background: none; }
119
+ a:is(:visited, :active):where(.ak-scope:not(.skin-arknights *) *):where(.ak-not-prose, .ak-not-prose *) { color: inherit; }
120
+ a:is(:hover, :focus):where(.ak-scope:not(.skin-arknights *) *):where(.ak-not-prose, .ak-not-prose *) { color: inherit; text-decoration: none; }