@linhey/rhine-design 0.2.0 → 0.4.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.
- package/CHANGELOG.md +39 -0
- package/CONTRIBUTING.md +6 -0
- package/README.md +70 -26
- package/components/Actions.tsx +6 -4
- package/components/COMMON_COMPONENTS.md +5 -1
- package/components/Data.tsx +8 -8
- package/components/FormWorkflow.tsx +25 -0
- package/components/Forms.tsx +11 -11
- package/components/Layout.tsx +4 -4
- package/components/Logo.tsx +7 -7
- package/components/MOTION.md +7 -3
- package/components/Navigation.tsx +42 -0
- package/components/Overlays.tsx +17 -11
- package/components/README.md +19 -11
- package/components/SPACING.md +82 -0
- package/components/Select.tsx +5 -5
- package/components/StatusTimeline.tsx +29 -0
- package/components/TYPOGRAPHY.md +35 -3
- package/components/Toast.tsx +2 -2
- package/components/Toolbar.tsx +3 -3
- package/components/Typography.tsx +1 -1
- package/components/common.css +78 -69
- package/components/components.tsx +28 -28
- package/components/index.ts +7 -1
- package/components/patterns.css +39 -0
- package/components/styles.css +105 -101
- package/components/theme-arknights.css +301 -0
- package/components/theme-neo-brutalism.css +84 -0
- package/components/theme.tsx +58 -0
- package/components/timeline.css +23 -0
- package/components/tokens.css +61 -56
- package/components/typography.css +31 -31
- package/docs/DESIGN_SYSTEM.md +24 -13
- package/docs/DESIGN_SYSTEM_AUDIT.md +4 -4
- package/docs/INTERACTION_PATTERNS.md +129 -0
- package/docs/REFERENCE_RESEARCH.md +36 -0
- package/docs/THEME_NEO_BRUTALISM.md +37 -0
- package/docs/THEMING.md +104 -0
- package/package.json +5 -1
- package/preview/CommonGallery.tsx +8 -8
- package/preview/GalleryShell.tsx +106 -0
- package/preview/LineHeightGallery.tsx +27 -0
- package/preview/MotionGallery.tsx +9 -5
- package/preview/PatternGallery.tsx +52 -0
- package/preview/SpacingGallery.tsx +32 -0
- package/preview/StartupGallery.tsx +1 -1
- package/preview/SubscriptionGallery.tsx +84 -0
- package/preview/brand-assembly.css +8 -8
- package/preview/line-height.css +2 -0
- package/preview/main.tsx +39 -25
- package/preview/motion.css +14 -14
- package/preview/patterns.css +7 -0
- package/preview/preview.css +15 -21
- package/preview/shell.css +35 -0
- package/preview/spacing.css +2 -0
- package/preview/startup.css +15 -15
- package/preview/subscriptions.css +27 -0
- package/preview/theme-arknights.css +234 -0
- package/preview/theme-neo-brutalism.css +11 -0
- package/scripts/check-build.mjs +1 -1
- package/skills/rhine-design/SKILL.md +6 -4
- package/skills/rhine-design/references/API_MAP.md +7 -3
- package/skills/rhine-design/references/TASK_MAP.md +4 -1
- package/skills/rhine-design/references/integration.md +6 -4
- package/tests/CommonComponents.test.tsx +1 -1
- package/tests/GalleryShell.test.tsx +98 -0
- package/tests/Patterns.test.tsx +75 -0
- package/tests/StartupGallery.test.tsx +3 -3
- package/tests/StatusTimeline.test.tsx +15 -0
- package/tests/Theme.test.tsx +112 -0
package/preview/motion.css
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
.ds-motion-toolbar { display:flex; align-items:center; justify-content:space-between; gap:24px; flex-wrap:wrap; padding:20px 0 28px; }
|
|
2
2
|
.ds-motion-toolbar>div:first-child { flex:1 1 320px; }
|
|
3
3
|
.ds-motion-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr)); gap:24px; align-items:start; }
|
|
4
|
-
.ds-motion-card { min-width:0; padding:24px; border:1px solid var(--
|
|
4
|
+
.ds-motion-card { min-width:0; padding:24px; border:1px solid var(--rhine-line); border-radius:var(--rhine-radius-card); background:var(--rhine-surface); }
|
|
5
5
|
.ds-motion-card>header { display:flex; justify-content:space-between; gap:12px; flex-wrap:wrap; align-items:center; }
|
|
6
|
-
.ds-motion-stage { display:flex; align-items:center; justify-content:center; min-height:240px; margin:20px 0; padding:24px; border:1px solid var(--
|
|
6
|
+
.ds-motion-stage { display:flex; align-items:center; justify-content:center; min-height:240px; margin:20px 0; padding:24px; border:1px solid var(--rhine-line); background:var(--rhine-bg); }
|
|
7
7
|
.ds-motion-description { min-height:88px; }.ds-motion-description h3 { font-size:16px; margin:0 0 8px; }
|
|
8
|
-
.ds-motion-buttons { display:flex; flex-wrap:wrap; gap:8px; margin-top:20px; }.ds-motion-card>.
|
|
8
|
+
.ds-motion-buttons { display:flex; flex-wrap:wrap; gap:8px; margin-top:20px; }.ds-motion-card>.rhine-check { margin-top:12px; }
|
|
9
9
|
.ds-motion-fill,.ds-motion-content { width:100%; min-width:0; }.ds-motion-content { min-height:112px; }
|
|
10
|
-
.ds-content-reveal { display:grid; gap:10px; justify-items:start; animation:
|
|
10
|
+
.ds-content-reveal { display:grid; gap:10px; justify-items:start; animation:rhine-overlay-fade var(--rhine-duration-panel) var(--rhine-ease-standard) both; }
|
|
11
11
|
.ds-result-demo { display:grid; justify-items:center; gap:20px; }.ds-result-slot { min-height:44px; display:flex; align-items:center; }
|
|
12
|
-
.ds-result-reveal { display:inline-flex; gap:8px; align-items:center; color:var(--
|
|
12
|
+
.ds-result-reveal { display:inline-flex; gap:8px; align-items:center; color:var(--rhine-green); animation:rhine-overlay-fade var(--rhine-duration-hover) var(--rhine-ease-standard) both; }
|
|
13
13
|
.ds-still * { animation:none!important; }
|
|
14
|
-
.ds-motion-card :is(.
|
|
15
|
-
.ds-motion-card :is(.
|
|
16
|
-
.ds-motion-card [data-side=bottom] { --ds-from-y:calc(-1 * var(--
|
|
17
|
-
.ds-motion-card [data-side=top] { --ds-from-y:var(--
|
|
18
|
-
.ds-motion-card [data-side=right] { --ds-from-x:calc(-1 * var(--
|
|
19
|
-
.ds-motion-card [data-side=left] { --ds-from-x:var(--
|
|
14
|
+
.ds-motion-card :is(.rhine-dialog,.rhine-overlay)[data-state=open] { animation-fill-mode:both; }
|
|
15
|
+
.ds-motion-card :is(.rhine-popover,.rhine-menu,.rhine-combobox__list)[data-state=open] { animation:ds-origin-enter var(--rhine-duration-overlay) var(--rhine-ease-standard) both; --ds-from-x:0px; --ds-from-y:0px; }
|
|
16
|
+
.ds-motion-card [data-side=bottom] { --ds-from-y:calc(-1 * var(--rhine-motion-distance))!important; }
|
|
17
|
+
.ds-motion-card [data-side=top] { --ds-from-y:var(--rhine-motion-distance)!important; }
|
|
18
|
+
.ds-motion-card [data-side=right] { --ds-from-x:calc(-1 * var(--rhine-motion-distance))!important; }
|
|
19
|
+
.ds-motion-card [data-side=left] { --ds-from-x:var(--rhine-motion-distance)!important; }
|
|
20
20
|
@keyframes ds-origin-enter { from { opacity:0; transform:translate(var(--ds-from-x),var(--ds-from-y)); } to { opacity:1; transform:translate(0,0); } }
|
|
21
|
-
.ds-motion-card[data-slow=true] { --
|
|
21
|
+
.ds-motion-card[data-slow=true] { --rhine-duration-hover:480ms; --rhine-duration-panel:720ms; --rhine-duration-notice:800ms; --rhine-duration-overlay:640ms; --rhine-duration-brand:960ms; }
|
|
22
22
|
.ds-motion-card[data-slow=true] { --ds-brand-speed:4; }
|
|
23
|
-
.
|
|
24
|
-
@media(prefers-reduced-motion:reduce) { .ds-motion-card { --
|
|
23
|
+
.rhine-theme[data-rhine-motion=reduced] .ds-motion-card,.ds-motion-card[data-rhine-motion=reduced] { --rhine-duration-notice:0ms; }
|
|
24
|
+
@media(prefers-reduced-motion:reduce) { .ds-motion-card { --rhine-duration-notice:0ms!important; } }
|
|
25
25
|
@media(max-width:520px) { .ds-motion-card { padding:16px; }.ds-motion-stage { padding:16px; }.ds-motion-description { min-height:0; } }
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
.ds-navigation-demo { display:grid; grid-template-columns:180px minmax(0,1fr); gap:24px; margin-top:20px; }
|
|
2
|
+
.ds-navigation-content { border-inline-start:1px solid var(--rhine-line); padding:24px; }
|
|
3
|
+
.ds-pattern-detail { margin-top:28px; padding-top:24px; border-top:1px solid var(--rhine-line); animation:rhine-pattern-enter var(--rhine-duration-panel) var(--rhine-ease-standard); }
|
|
4
|
+
.ds-pattern-detail h3 { font-size:22px; line-height:1.4; margin:8px 0 24px; overflow-wrap:anywhere; }
|
|
5
|
+
.ds-pattern-detail dl { display:grid; grid-template-columns:80px minmax(0,1fr); gap:20px; margin:0; }
|
|
6
|
+
.ds-pattern-detail dt { font-size:12px; color:var(--rhine-muted); }.ds-pattern-detail dd { margin:0; }
|
|
7
|
+
@media(max-width:600px) { .ds-navigation-demo { grid-template-columns:1fr; gap:16px; }.ds-navigation-content { border-inline-start:0; border-top:1px solid var(--rhine-line); padding:20px 0; }.ds-pattern-detail dl { grid-template-columns:1fr; gap:8px; }.ds-pattern-detail dd { margin-bottom:12px; } }
|
package/preview/preview.css
CHANGED
|
@@ -1,27 +1,21 @@
|
|
|
1
1
|
body { margin:0; }
|
|
2
|
-
.ds-type-row { display:grid; grid-template-columns:180px minmax(0,1fr); align-items:baseline; gap:12px 24px; padding:16px 0; border-bottom:1px solid var(--
|
|
2
|
+
.ds-type-row { display:grid; grid-template-columns:180px minmax(0,1fr); align-items:baseline; gap:12px 24px; padding:16px 0; border-bottom:1px solid var(--rhine-line); }
|
|
3
3
|
.ds-type-row:last-child { border:0; }
|
|
4
4
|
.ds-type-copy { display:grid; gap:12px; margin-top:16px; max-width:60ch; }
|
|
5
5
|
@media(max-width:600px) { .ds-type-row { grid-template-columns:1fr; } }
|
|
6
|
-
.ds-header { display:flex; justify-content:space-between; align-items:center; gap:16px; border-bottom:1px solid var(--tod-line); padding:20px max(24px,calc((100vw - 1080px)/2)); }
|
|
7
|
-
.ds-brand { display:inline-flex; align-items:center; color:var(--tod-ink); text-decoration:none; }
|
|
8
|
-
.ds-brand>span:not(.tod-logo) { font:12px var(--tod-mono); letter-spacing:1px; margin-left:16px; }
|
|
9
6
|
.ds-logo-pair { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:24px; }
|
|
10
|
-
.ds-logo-stage { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:24px; padding:32px 12px; background:var(--
|
|
11
|
-
.ds-logo-stage>span:last-child { font:12px var(--
|
|
12
|
-
.ds-logo-stage--dark { background:var(--
|
|
7
|
+
.ds-logo-stage { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:24px; padding:32px 12px; background:var(--rhine-surface); border:1px solid var(--rhine-line); }
|
|
8
|
+
.ds-logo-stage>span:last-child { font:12px var(--rhine-mono); letter-spacing:2px; }
|
|
9
|
+
.ds-logo-stage--dark { background:var(--rhine-ink); color:var(--rhine-bg); border-color:var(--rhine-ink); }
|
|
13
10
|
@media(max-width:600px) { .ds-logo-pair { grid-template-columns:1fr; } }
|
|
14
|
-
.ds-
|
|
15
|
-
.ds-
|
|
16
|
-
.ds-
|
|
17
|
-
.ds-hero
|
|
18
|
-
.ds-
|
|
19
|
-
.ds-
|
|
20
|
-
.ds-
|
|
21
|
-
.ds-
|
|
22
|
-
.ds-
|
|
23
|
-
.ds-
|
|
24
|
-
.ds-grid {
|
|
25
|
-
.ds-row { display:flex; flex-wrap:wrap; gap:12px; align-items:center; }.ds-caption { font-size:12px; line-height:1.8; color:var(--tod-muted); }.ds-gap-top { margin-top:20px; }.ds-badges { margin-bottom:24px; }.ds-loaded { min-height:72px; margin:0; }
|
|
26
|
-
.ds-footer { border-top:1px solid var(--tod-ink); display:flex; justify-content:space-between; gap:16px; flex-wrap:wrap; padding:24px 0; color:var(--tod-muted); font-size:12px; }
|
|
27
|
-
@media(max-width:760px) { .ds-hero,.ds-grid { grid-template-columns:1fr; gap:24px; }.ds-hero { padding-top:32px; }.ds-hero h1 { font-size:32px; letter-spacing:-1px; }.ds-brand>span:not(.tod-logo) { display:none; }.ds-palette { grid-template-columns:repeat(auto-fit,minmax(min(100%,90px),1fr)); }.ds-palette>div>div { height:64px; }.ds-gallery main { padding:0 20px; }.ds-header { padding:16px 20px; flex-wrap:wrap; }.ds-section-title h2 { font-size:19px; } }
|
|
11
|
+
.ds-hero { display:grid; grid-template-columns:1fr; gap:48px; padding:56px 0 40px; align-items:end; }
|
|
12
|
+
.ds-kicker { font:12px var(--rhine-mono); letter-spacing:1px; color:var(--rhine-muted); }
|
|
13
|
+
.ds-hero h1 { font-size:44px; line-height:1.35; letter-spacing:-2px; margin:24px 0; font-weight:600; }.ds-hero h1>span { color:var(--rhine-green); }
|
|
14
|
+
.ds-hero p { color:var(--rhine-muted); }
|
|
15
|
+
.ds-gallery section { padding:32px 0; scroll-margin-top:24px; }.ds-section-title { display:flex; align-items:baseline; gap:16px; margin-bottom:24px; }.ds-section-title>span { font:12px var(--rhine-mono); color:var(--rhine-warning); }.ds-section-title h2 { font-size:22px; font-weight:600; margin:0; }
|
|
16
|
+
.ds-palette { display:grid; grid-template-columns:repeat(5,1fr); gap:16px; }.ds-palette>div>div { height:82px; border:1px solid var(--rhine-line); }.ds-palette strong,.ds-palette code { display:block; font:12px/1.8 var(--rhine-mono); }.ds-palette strong { margin-top:10px; }.ds-palette code { color:var(--rhine-muted); }
|
|
17
|
+
.ds-notes { display:flex; flex-wrap:wrap; gap:12px 32px; margin-top:24px; padding-top:16px; border-top:1px solid var(--rhine-line); font-size:12px; color:var(--rhine-muted); }
|
|
18
|
+
.ds-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:24px; align-items:start; }.ds-grid>* { min-width:0; }.ds-component-title { display:flex; align-items:baseline; justify-content:space-between; gap:12px; flex-wrap:wrap; margin-bottom:20px; }.ds-component-title h3 { font:600 16px var(--rhine-mono); margin:0; }.ds-component-title>span { color:var(--rhine-muted); font-size:12px; }
|
|
19
|
+
.ds-row { display:flex; flex-wrap:wrap; gap:12px; align-items:center; }.ds-caption { font-size:12px; line-height:1.8; color:var(--rhine-muted); }.ds-gap-top { margin-top:20px; }.ds-badges { margin-bottom:24px; }.ds-loaded { min-height:72px; margin:0; }
|
|
20
|
+
.ds-footer { border-top:1px solid var(--rhine-ink); display:flex; justify-content:space-between; gap:16px; flex-wrap:wrap; padding:24px 0; color:var(--rhine-muted); font-size:12px; }
|
|
21
|
+
@media(max-width:760px) { .ds-hero,.ds-grid { grid-template-columns:1fr; gap:24px; }.ds-hero { padding-top:32px; }.ds-hero h1 { font-size:32px; letter-spacing:-1px; }.ds-palette { grid-template-columns:repeat(auto-fit,minmax(min(100%,90px),1fr)); }.ds-palette>div>div { height:64px; }.ds-section-title h2 { font-size:19px; } }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
.ds-shell { display:grid; grid-template-columns:232px minmax(0,1fr); height:100dvh; background:var(--rhine-bg); }
|
|
2
|
+
.ds-skip { position:fixed; top:8px; left:16px; z-index:100; padding:12px; background:var(--rhine-ink); color:var(--rhine-surface); transform:translateY(-160%); }
|
|
3
|
+
.ds-skip:focus { transform:none; }
|
|
4
|
+
.ds-sidebar { display:flex; flex-direction:column; min-height:0; border-right:1px solid var(--rhine-line); background:var(--rhine-surface); }
|
|
5
|
+
.ds-sidebar-brand { padding:28px 24px 24px; }
|
|
6
|
+
.ds-sidebar-brand>a { display:flex; gap:12px; align-items:center; color:var(--rhine-ink); text-decoration:none; font-size:18px; font-weight:600; }
|
|
7
|
+
.ds-sidebar-brand small { display:block; margin-top:2px; font:10px/16px var(--rhine-mono); letter-spacing:.08em; color:var(--rhine-muted); }
|
|
8
|
+
.ds-sidebar-nav { flex:1; min-height:0; overflow:auto; padding:0 16px 20px; scrollbar-width:thin; }
|
|
9
|
+
.ds-sidebar-foot { display:grid; gap:6px; padding:20px 28px; border-top:1px solid var(--rhine-line); color:var(--rhine-muted); font:12px/18px var(--rhine-font); }
|
|
10
|
+
.ds-sidebar-foot>span:first-child { font:10px/16px var(--rhine-mono); letter-spacing:.06em; }
|
|
11
|
+
.ds-menu-toggle { display:none; }
|
|
12
|
+
.ds-workspace { min-width:0; min-height:0; overflow:auto; scrollbar-gutter:stable; }
|
|
13
|
+
.ds-workspace:focus { outline:none; }
|
|
14
|
+
.ds-workspace-head { min-height:80px; display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 32px; border-bottom:1px solid var(--rhine-line); }
|
|
15
|
+
.ds-head-controls { display:flex; align-items:flex-end; gap:16px; flex-wrap:wrap; }
|
|
16
|
+
.ds-workspace-head>div:first-child { font-size:12px; }.ds-workspace-head>div:first-child>span { color:var(--rhine-muted); }
|
|
17
|
+
.ds-page { max-width:1200px; margin:0 auto; padding:0 32px; animation:rhine-enter var(--rhine-duration-panel) var(--rhine-ease-standard); }
|
|
18
|
+
.ds-overview-links { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; padding-bottom:40px; }
|
|
19
|
+
.ds-overview-links>a { display:grid; grid-template-columns:1fr auto; gap:12px; padding:24px; color:var(--rhine-ink); text-decoration:none; background:var(--rhine-surface); border:1px solid var(--rhine-line); transition:border-color var(--rhine-duration-hover) var(--rhine-ease-standard); }
|
|
20
|
+
.ds-overview-links>a:hover { border-color:var(--rhine-green); }.ds-overview-links strong { font-size:18px; }.ds-overview-links p { grid-column:1/-1; margin:0; color:var(--rhine-muted); }
|
|
21
|
+
@media(min-width:761px) and (max-width:1100px) {
|
|
22
|
+
.ds-shell { grid-template-columns:200px minmax(0,1fr); }.ds-page { padding:0 24px; }
|
|
23
|
+
.ds-page .ds-grid,.ds-page .ds-startup-layout,.ds-page .ds-motion-grid { grid-template-columns:1fr; }
|
|
24
|
+
.ds-page .ds-hero { grid-template-columns:1fr; gap:24px; }.ds-page .ds-hero h1 { font-size:36px; }
|
|
25
|
+
.ds-page .ds-type-row { grid-template-columns:130px minmax(0,1fr); }
|
|
26
|
+
}
|
|
27
|
+
@media(max-width:760px) {
|
|
28
|
+
.ds-shell { grid-template-columns:minmax(0,1fr); grid-template-rows:auto minmax(0,1fr); }
|
|
29
|
+
.ds-sidebar { border-right:0; border-bottom:1px solid var(--rhine-line); }
|
|
30
|
+
.ds-sidebar-brand { display:flex; align-items:center; justify-content:space-between; gap:16px; padding:12px 20px; }
|
|
31
|
+
.ds-menu-toggle { display:inline-flex; }.ds-sidebar-foot { display:none; }
|
|
32
|
+
.ds-sidebar-nav { display:none; flex:none; max-height:45dvh; }.ds-sidebar[data-open=true] .ds-sidebar-nav { display:block; }
|
|
33
|
+
.ds-workspace-head { min-height:0; padding:16px 20px; flex-wrap:wrap; gap:12px; }
|
|
34
|
+
.ds-page { padding:0 20px; }.ds-overview-links { grid-template-columns:1fr; }
|
|
35
|
+
}
|
package/preview/startup.css
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
.ds-startup-layout { display:grid; grid-template-columns:minmax(0,1.6fr) minmax(240px,1fr); gap:40px; margin:24px 0; align-items:center; }
|
|
2
|
-
.ds-startup-window { border:1px solid var(--
|
|
3
|
-
.ds-startup-chrome { display:flex; justify-content:space-between; gap:12px; padding:12px 20px; border-bottom:1px solid var(--
|
|
2
|
+
.ds-startup-window { border:1px solid var(--rhine-line); background:var(--rhine-bg); min-width:0; }
|
|
3
|
+
.ds-startup-chrome { display:flex; justify-content:space-between; gap:12px; padding:12px 20px; border-bottom:1px solid var(--rhine-line); font:12px/18px var(--rhine-font); color:var(--rhine-muted); }
|
|
4
4
|
.ds-startup-stage { min-height:540px; padding:40px 24px 24px; display:flex; flex-direction:column; align-items:center; justify-content:flex-start; position:relative; isolation:isolate; }
|
|
5
5
|
.ds-startup-emblem { width:240px; height:220px; position:relative; box-sizing:border-box; flex:none; }
|
|
6
6
|
.ds-startup-logo-anchor { position:absolute; left:32px; top:32px; width:176px; height:176px; transform-origin:center; transition:transform calc(560ms * var(--startup-speed)) cubic-bezier(.22,1,.36,1); }
|
|
7
7
|
.ds-startup-construction { position:absolute; inset:0; width:240px; height:240px; pointer-events:none; transition:opacity calc(180ms * var(--startup-speed)) ease-out; }
|
|
8
|
-
.ds-startup-guide { stroke:var(--
|
|
9
|
-
.ds-startup-ticks { stroke:var(--
|
|
10
|
-
.ds-startup-signal { fill:var(--
|
|
11
|
-
.ds-startup-wordmark { position:absolute; top:246px; width:100%; text-align:center; color:var(--
|
|
12
|
-
.ds-startup-status { font:12px/18px var(--
|
|
13
|
-
.ds-startup-footnote { display:flex; justify-content:space-between; flex-wrap:wrap; gap:16px; width:100%; margin-top:auto; padding-top:32px; font:12px/18px var(--
|
|
14
|
-
.ds-startup-score h3 { font:600 26px/1.4 var(--
|
|
15
|
-
.ds-startup-score ol { list-style:none; padding:0; margin:28px 0; }.ds-startup-score li { padding:16px 0; border-top:1px solid var(--
|
|
16
|
-
.ds-startup-controls { display:flex; align-items:center; gap:24px; flex-wrap:wrap; margin-bottom:20px; }.ds-startup-controls>.
|
|
8
|
+
.ds-startup-guide { stroke:var(--rhine-control); stroke-width:.75; opacity:0; }
|
|
9
|
+
.ds-startup-ticks { stroke:var(--rhine-line); stroke-width:1; }
|
|
10
|
+
.ds-startup-signal { fill:var(--rhine-signal); opacity:0; }
|
|
11
|
+
.ds-startup-wordmark { position:absolute; top:246px; width:100%; text-align:center; color:var(--rhine-ink); font:600 30px/38px var(--rhine-font); letter-spacing:.04em; transition:transform calc(560ms * var(--startup-speed)) cubic-bezier(.22,1,.36,1); }
|
|
12
|
+
.ds-startup-status { font:12px/18px var(--rhine-font); color:var(--rhine-muted); margin:100px 0 24px; }
|
|
13
|
+
.ds-startup-footnote { display:flex; justify-content:space-between; flex-wrap:wrap; gap:16px; width:100%; margin-top:auto; padding-top:32px; font:12px/18px var(--rhine-mono); letter-spacing:.06em; color:var(--rhine-muted); }
|
|
14
|
+
.ds-startup-score h3 { font:600 26px/1.4 var(--rhine-font); margin:20px 0 12px; }.ds-startup-score>p { color:var(--rhine-muted); }
|
|
15
|
+
.ds-startup-score ol { list-style:none; padding:0; margin:28px 0; }.ds-startup-score li { padding:16px 0; border-top:1px solid var(--rhine-line); }.ds-startup-score li>span { display:block; color:var(--rhine-muted); font:12px/18px var(--rhine-mono); margin-bottom:8px; }.ds-startup-score li strong { font-size:16px; font-weight:600; }.ds-startup-score li p { margin:4px 0 0; font-size:12px; color:var(--rhine-muted); }
|
|
16
|
+
.ds-startup-controls { display:flex; align-items:center; gap:24px; flex-wrap:wrap; margin-bottom:20px; }.ds-startup-controls>.rhine-field { flex:1; min-width:180px; }
|
|
17
17
|
.ds-startup-destination { display:flex; flex-direction:column; gap:16px; align-items:center; text-align:center; width:100%; max-width:320px; animation:startup-arrival calc(420ms * var(--startup-speed)) ease-out both; }
|
|
18
|
-
.ds-startup-destination>.
|
|
18
|
+
.ds-startup-destination>.rhine-button { margin-top:8px; width:100%; max-width:260px; }
|
|
19
19
|
.ds-startup-destination:focus-within { animation:none; }
|
|
20
20
|
.ds-startup-stage[data-state=ready] .ds-startup-logo-anchor { transform:translateY(-16px) scale(.5); }
|
|
21
21
|
.ds-startup-stage[data-state=ready] .ds-startup-wordmark { transform:translateY(-84px); }
|
|
22
22
|
.ds-startup-stage[data-state=ready] .ds-startup-construction { opacity:0; }
|
|
23
23
|
@keyframes startup-arrival { from { opacity:.12; transform:translateY(3px); } to { opacity:1; transform:translateY(0); } }
|
|
24
|
-
.ds-startup-stage[data-state=playing] .ds-startup-guide { animation:startup-guide calc(1340ms * var(--startup-speed)) var(--
|
|
24
|
+
.ds-startup-stage[data-state=playing] .ds-startup-guide { animation:startup-guide calc(1340ms * var(--startup-speed)) var(--rhine-ease-standard) both; }
|
|
25
25
|
.ds-startup-stage[data-state=playing] .ds-startup-signal { animation:startup-signal calc(280ms * var(--startup-speed)) linear calc(1060ms * var(--startup-speed)) both; }
|
|
26
|
-
.ds-startup-stage[data-state=playing] .ds-startup-wordmark { animation:startup-destination calc(240ms * var(--startup-speed)) var(--
|
|
26
|
+
.ds-startup-stage[data-state=playing] .ds-startup-wordmark { animation:startup-destination calc(240ms * var(--startup-speed)) var(--rhine-ease-standard) calc(1080ms * var(--startup-speed)) both; }
|
|
27
27
|
@keyframes startup-guide { 0% { stroke-dasharray:1; stroke-dashoffset:1; opacity:0; } 24%,79% { stroke-dasharray:1; stroke-dashoffset:0; opacity:.65; } 100% { stroke-dasharray:1; stroke-dashoffset:0; opacity:0; } }
|
|
28
28
|
@keyframes startup-signal { 0%,100% { opacity:0; } 20%,65% { opacity:1; } }
|
|
29
29
|
@keyframes startup-destination { from { opacity:0; } to { opacity:1; } }
|
|
30
|
-
.ds-startup[data-
|
|
30
|
+
.ds-startup[data-rhine-motion=reduced] * { animation:none!important; transition:none!important; }
|
|
31
31
|
@media(prefers-reduced-motion:reduce) { .ds-startup * { animation:none!important; transition:none!important; } }
|
|
32
32
|
@media(max-width:760px) { .ds-startup-layout { grid-template-columns:minmax(0,1fr); gap:24px; }.ds-startup-stage { padding-inline:16px; }.ds-startup-score ol { margin:20px 0; } }
|
|
33
33
|
@media(max-width:360px) { .ds-startup-chrome { padding-inline:12px; }.ds-startup-footnote { flex-wrap:wrap; } }
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
.ds-subscription-heading { display: flex; justify-content: space-between; align-items: center; gap: 24px; flex-wrap: wrap; }
|
|
2
|
+
.ds-subscription-heading h1 { font-size: clamp(28px, 3vw, 40px); line-height: 1.3; font-weight: 800; letter-spacing: -1px; margin: 12px 0; }
|
|
3
|
+
.ds-subscription-heading h1>span { color: var(--rhine-signal); }
|
|
4
|
+
.ds-subscription-notice { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; margin-top: 24px; font-size: 12px; color: var(--rhine-muted); }
|
|
5
|
+
.ds-subscription-status { color: var(--rhine-green); font-size: 12px; }
|
|
6
|
+
.ds-subscription-status:not(:empty) { margin-top: 16px; }
|
|
7
|
+
.ds-subscription-summary { margin-top: 24px; }
|
|
8
|
+
.ds-subscription-section-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 12px; margin: 32px 0 20px; }
|
|
9
|
+
.ds-subscription-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr)); gap: 24px; }
|
|
10
|
+
.ds-subscription-cards>.rhine-overlay-anchor { display: block; min-width: 0; }
|
|
11
|
+
.ds-subscription-card { display: flex; flex-direction: column; width: 100%; height: 100%; text-align: left; font: inherit; color: var(--rhine-ink); cursor: pointer; transition: background-color 120ms; }
|
|
12
|
+
.ds-subscription-card:hover { background: var(--rhine-selected); }
|
|
13
|
+
.ds-subscription-card-top { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
|
|
14
|
+
.ds-subscription-arrow { font-size: 24px; }
|
|
15
|
+
.ds-subscription-count { display: flex; align-items: baseline; flex-wrap: wrap; gap: 10px; font-size: 52px; font-weight: 800; line-height: 1.2; margin: 24px 0 8px; font-variant-numeric: tabular-nums; }
|
|
16
|
+
.ds-subscription-count small, .ds-subscription-card-bottom small { font-size: 12px; color: var(--rhine-muted); font-weight: 400; }
|
|
17
|
+
.ds-subscription-description { font-size: 12px; color: var(--rhine-muted); margin-bottom: 24px; }
|
|
18
|
+
.ds-subscription-card-bottom { display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap; gap: 12px; margin-top: auto; padding-top: 16px; border-top: 1px solid var(--rhine-line); }
|
|
19
|
+
.ds-subscription-running { color: var(--rhine-green); font-size: 12px; }
|
|
20
|
+
.ds-subscription-card-bottom strong { font-size: 16px; font-variant-numeric: tabular-nums; }
|
|
21
|
+
.ds-subscription-table { margin-top: 32px; }
|
|
22
|
+
.ds-subscription-total { display: flex; justify-content: space-between; gap: 16px; padding-top: 20px; }
|
|
23
|
+
.ds-subscriptions .rhine-type-tag { font-size: 12px; font-weight: 700; }
|
|
24
|
+
@media(max-width:480px) {
|
|
25
|
+
.ds-subscription-heading h1 { font-size: 28px; }
|
|
26
|
+
.ds-subscription-summary .rhine-grid { grid-template-columns: 1fr; }
|
|
27
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/* Gallery-only chrome and decoration. Not imported by the public theme entry. */
|
|
2
|
+
/* ================= 全局质感 ================= */
|
|
3
|
+
|
|
4
|
+
/* 坐标网格底纹 + 顶部扫描线氛围 */
|
|
5
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-workspace {
|
|
6
|
+
background-image:
|
|
7
|
+
linear-gradient(var(--ak-gridline) 1px, transparent 1px),
|
|
8
|
+
linear-gradient(90deg, var(--ak-gridline) 1px, transparent 1px);
|
|
9
|
+
background-size: 56px 56px;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/* ================= 字体性格 ================= */
|
|
13
|
+
/* 标签、编号、说明全部等宽化,正文保持无衬线可读性 */
|
|
14
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-caption,
|
|
15
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-component-title>span,
|
|
16
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-notes {
|
|
17
|
+
font-family: var(--rhine-mono);
|
|
18
|
+
letter-spacing: .04em;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* ================= 顶栏 ================= */
|
|
22
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-workspace-head {
|
|
23
|
+
position: relative;
|
|
24
|
+
background: rgba(11, 13, 16, .85);
|
|
25
|
+
border-bottom-color: var(--rhine-line);
|
|
26
|
+
}
|
|
27
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-workspace-head::after {
|
|
28
|
+
content: '';
|
|
29
|
+
position: absolute;
|
|
30
|
+
left: 32px;
|
|
31
|
+
bottom: -1px;
|
|
32
|
+
width: 160px;
|
|
33
|
+
height: 4px;
|
|
34
|
+
background: var(--ak-hazard);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* ================= 侧栏:深色舱室 ================= */
|
|
38
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-sidebar {
|
|
39
|
+
background: #08090c;
|
|
40
|
+
border-right-color: var(--rhine-line);
|
|
41
|
+
}
|
|
42
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-sidebar-brand {
|
|
43
|
+
border-bottom: 1px solid var(--rhine-line);
|
|
44
|
+
background: repeating-linear-gradient(-45deg, rgba(255, 212, 0, .07) 0 10px, transparent 10px 20px);
|
|
45
|
+
}
|
|
46
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-sidebar-brand>a { color: var(--rhine-ink); }
|
|
47
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-sidebar-brand small { color: var(--ak-accent); letter-spacing: .18em; }
|
|
48
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-sidebar-foot>span:first-child { color: var(--ak-accent); }
|
|
49
|
+
|
|
50
|
+
/* ================= 主视觉 Hero ================= */
|
|
51
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-kicker {
|
|
52
|
+
color: var(--ak-accent);
|
|
53
|
+
letter-spacing: 3px;
|
|
54
|
+
}
|
|
55
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-kicker::before { content: '// '; }
|
|
56
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-hero h1 {
|
|
57
|
+
font-size: 56px;
|
|
58
|
+
font-weight: 700;
|
|
59
|
+
letter-spacing: 0;
|
|
60
|
+
line-height: 1.2;
|
|
61
|
+
}
|
|
62
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-hero h1>span {
|
|
63
|
+
color: var(--ak-accent);
|
|
64
|
+
/* 黄色高光下划线块 */
|
|
65
|
+
background: linear-gradient(transparent 62%, rgba(255, 212, 0, .22) 62%);
|
|
66
|
+
}
|
|
67
|
+
@media(max-width:760px) {
|
|
68
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-hero h1 { font-size: 34px; }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* 总览卡片:大号幽灵编号 + 斜切 */
|
|
72
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-overview-links { counter-reset: ak-link; }
|
|
73
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-overview-links>a {
|
|
74
|
+
counter-increment: ak-link;
|
|
75
|
+
position: relative;
|
|
76
|
+
background: var(--ak-panel);
|
|
77
|
+
clip-path: polygon(0 0, calc(100% - var(--ak-cut)) 0, 100% var(--ak-cut), 100% 100%, 0 100%);
|
|
78
|
+
overflow: hidden;
|
|
79
|
+
}
|
|
80
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-overview-links>a::after {
|
|
81
|
+
content: counter(ak-link, decimal-leading-zero);
|
|
82
|
+
position: absolute;
|
|
83
|
+
right: 12px;
|
|
84
|
+
bottom: -14px;
|
|
85
|
+
font: 700 72px/1 var(--rhine-mono);
|
|
86
|
+
color: rgba(238, 240, 236, .05);
|
|
87
|
+
pointer-events: none;
|
|
88
|
+
}
|
|
89
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-overview-links>a:hover {
|
|
90
|
+
border-color: var(--ak-accent);
|
|
91
|
+
background: var(--ak-panel-hi);
|
|
92
|
+
}
|
|
93
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-overview-links>a:hover>span { color: var(--ak-accent); }
|
|
94
|
+
|
|
95
|
+
/* ================= 章节标题 ================= */
|
|
96
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-section-title { align-items:center; }
|
|
97
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-section-title>span {
|
|
98
|
+
background: var(--ak-accent);
|
|
99
|
+
color: var(--ak-accent-ink);
|
|
100
|
+
font: 700 12px/1 var(--rhine-mono);
|
|
101
|
+
padding: 5px 8px;
|
|
102
|
+
clip-path: polygon(0 0, 100% 0, calc(100% - 6px) 100%, 0 100%);
|
|
103
|
+
}
|
|
104
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-section-title h2 { letter-spacing: .02em; }
|
|
105
|
+
|
|
106
|
+
/* 组件标题等宽化 */
|
|
107
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-component-title h3 { letter-spacing: .06em; }
|
|
108
|
+
|
|
109
|
+
/* ================= 面板与容器:斜切 + 角标框架 ================= */
|
|
110
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-logo-stage {
|
|
111
|
+
background: var(--ak-panel);
|
|
112
|
+
clip-path: polygon(0 0, calc(100% - var(--ak-cut)) 0, 100% var(--ak-cut), 100% 100%, 0 100%);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* ================= Logo 展台 ================= */
|
|
116
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-logo-stage--dark { background: #08090c; border-color: var(--rhine-line); }
|
|
117
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-logo-stage>span:last-child { letter-spacing: 3px; color: var(--rhine-muted); }
|
|
118
|
+
|
|
119
|
+
/* ================= 页脚 ================= */
|
|
120
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-footer {
|
|
121
|
+
border-top: 0;
|
|
122
|
+
position: relative;
|
|
123
|
+
font-family: var(--rhine-mono);
|
|
124
|
+
letter-spacing: .06em;
|
|
125
|
+
}
|
|
126
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-footer::before {
|
|
127
|
+
content: '';
|
|
128
|
+
position: absolute;
|
|
129
|
+
top: 0;
|
|
130
|
+
left: 0;
|
|
131
|
+
width: 200px;
|
|
132
|
+
height: 4px;
|
|
133
|
+
background: var(--ak-hazard);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* ================= 调色板展示 ================= */
|
|
137
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-palette>div>div { border-color: var(--rhine-control); }
|
|
138
|
+
|
|
139
|
+
/* ================= 进阶:HUD 视框 / 扫描 / 开机 ================= */
|
|
140
|
+
|
|
141
|
+
/* 终端读数(默认隐藏,仅本主题显示) */
|
|
142
|
+
.ak-readout { display: none; }
|
|
143
|
+
.rhine-theme[data-rhine-theme="arknights"] .ak-readout {
|
|
144
|
+
display: block;
|
|
145
|
+
margin-top: 8px;
|
|
146
|
+
padding-top: 8px;
|
|
147
|
+
border-top: 1px dashed var(--rhine-line);
|
|
148
|
+
color: var(--ak-accent);
|
|
149
|
+
font: 11px/18px var(--rhine-mono);
|
|
150
|
+
letter-spacing: .08em;
|
|
151
|
+
font-variant-numeric: tabular-nums;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* 四角 HUD 取景框 */
|
|
155
|
+
.ak-hud { display: none; }
|
|
156
|
+
.rhine-theme[data-rhine-theme="arknights"] .ak-hud {
|
|
157
|
+
display: block;
|
|
158
|
+
position: fixed;
|
|
159
|
+
inset: 10px;
|
|
160
|
+
z-index: 90;
|
|
161
|
+
pointer-events: none;
|
|
162
|
+
}
|
|
163
|
+
.rhine-theme[data-rhine-theme="arknights"] .ak-hud i {
|
|
164
|
+
position: absolute;
|
|
165
|
+
width: 26px;
|
|
166
|
+
height: 26px;
|
|
167
|
+
border: 2px solid rgba(255, 212, 0, .5);
|
|
168
|
+
}
|
|
169
|
+
.rhine-theme[data-rhine-theme="arknights"] .ak-hud i:nth-child(1) { top: 0; left: 0; border-right: 0; border-bottom: 0; }
|
|
170
|
+
.rhine-theme[data-rhine-theme="arknights"] .ak-hud i:nth-child(2) { top: 0; right: 0; border-left: 0; border-bottom: 0; }
|
|
171
|
+
.rhine-theme[data-rhine-theme="arknights"] .ak-hud i:nth-child(3) { bottom: 0; left: 0; border-right: 0; border-top: 0; }
|
|
172
|
+
.rhine-theme[data-rhine-theme="arknights"] .ak-hud i:nth-child(4) { bottom: 0; right: 0; border-left: 0; border-top: 0; }
|
|
173
|
+
|
|
174
|
+
/* 主题切换开机闪屏 */
|
|
175
|
+
.rhine-theme[data-rhine-theme="arknights"].ds-shell::after {
|
|
176
|
+
content: '';
|
|
177
|
+
position: fixed;
|
|
178
|
+
inset: 0;
|
|
179
|
+
z-index: 200;
|
|
180
|
+
pointer-events: none;
|
|
181
|
+
background:
|
|
182
|
+
repeating-linear-gradient(0deg, rgba(255, 212, 0, .06) 0 2px, transparent 2px 4px),
|
|
183
|
+
#050608;
|
|
184
|
+
animation: ak-boot 520ms steps(3, end) both;
|
|
185
|
+
}
|
|
186
|
+
@keyframes ak-boot {
|
|
187
|
+
0% { opacity: 1; }
|
|
188
|
+
55% { opacity: .55; }
|
|
189
|
+
100% { opacity: 0; visibility: hidden; }
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* 屏幕右缘竖排标识 */
|
|
193
|
+
.rhine-theme[data-rhine-theme="arknights"].ds-shell::before {
|
|
194
|
+
content: 'RHINE // TACTICAL TERMINAL';
|
|
195
|
+
position: fixed;
|
|
196
|
+
right: 6px;
|
|
197
|
+
top: 50%;
|
|
198
|
+
transform: translateY(-50%);
|
|
199
|
+
writing-mode: vertical-rl;
|
|
200
|
+
font: 10px/1 var(--rhine-mono);
|
|
201
|
+
letter-spacing: 5px;
|
|
202
|
+
color: rgba(238, 240, 236, .16);
|
|
203
|
+
z-index: 50;
|
|
204
|
+
pointer-events: none;
|
|
205
|
+
}
|
|
206
|
+
@media(max-width:760px) {
|
|
207
|
+
.rhine-theme[data-rhine-theme="arknights"].ds-shell::before { content: none; }
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* Hero 扫描线 */
|
|
211
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-hero { position: relative; overflow: hidden; }
|
|
212
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-hero::after {
|
|
213
|
+
content: '';
|
|
214
|
+
position: absolute;
|
|
215
|
+
left: 0;
|
|
216
|
+
right: 0;
|
|
217
|
+
top: -120px;
|
|
218
|
+
height: 120px;
|
|
219
|
+
background: linear-gradient(180deg, transparent, rgba(255, 212, 0, .07), transparent);
|
|
220
|
+
pointer-events: none;
|
|
221
|
+
animation: ak-scan 4.5s linear infinite;
|
|
222
|
+
}
|
|
223
|
+
@keyframes ak-scan {
|
|
224
|
+
from { top: -120px; }
|
|
225
|
+
to { top: 100%; }
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* 减少动态:关闭扫描与开机闪屏 */
|
|
229
|
+
@media(prefers-reduced-motion:reduce) {
|
|
230
|
+
.rhine-theme[data-rhine-theme="arknights"] .ds-hero::after { animation: none; content: none; }
|
|
231
|
+
.rhine-theme[data-rhine-theme="arknights"].ds-shell::after { animation: none; content: none; }
|
|
232
|
+
}
|
|
233
|
+
.rhine-theme[data-rhine-theme="arknights"][data-rhine-motion=reduced] .ds-hero::after,
|
|
234
|
+
.rhine-theme[data-rhine-theme="arknights"][data-rhine-motion=reduced].ds-shell::after { animation: none; content: none; }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/* Gallery-only chrome and decoration. Not imported by the public theme entry. */
|
|
2
|
+
/* Gallery chrome uses the same theme; application layout stays with its host. */
|
|
3
|
+
.rhine-theme[data-rhine-theme="neo-brutalism"] .ds-sidebar { border-right-width: 2px; border-color: var(--rhine-ink); }
|
|
4
|
+
.rhine-theme[data-rhine-theme="neo-brutalism"] .ds-workspace-head { background: var(--rhine-surface); border-bottom: 2px solid var(--rhine-ink); flex-wrap: wrap; }
|
|
5
|
+
.rhine-theme[data-rhine-theme="neo-brutalism"] .ds-overview-links>a { border: 2px solid var(--rhine-ink); border-radius: 22px; box-shadow: var(--rhine-hard-shadow); }
|
|
6
|
+
.rhine-theme[data-rhine-theme="neo-brutalism"] .ds-hero h1 { font-weight: 800; }
|
|
7
|
+
.rhine-theme[data-rhine-theme="neo-brutalism"] .ds-hero h1>span { color: var(--rhine-ink); text-decoration: underline; text-decoration-color: var(--rhine-signal); text-decoration-thickness: 6px; text-underline-offset: 8px; }
|
|
8
|
+
.rhine-theme[data-rhine-theme="neo-brutalism"] .ds-logo-stage { border: 2px solid var(--rhine-ink); border-radius: 22px; }
|
|
9
|
+
@media(max-width:760px) {
|
|
10
|
+
.rhine-theme[data-rhine-theme="neo-brutalism"] .ds-sidebar { border-right: 0; border-bottom: 2px solid var(--rhine-ink); }
|
|
11
|
+
}
|
package/scripts/check-build.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import { join } from 'node:path';
|
|
|
4
4
|
const assets = new URL('../dist/assets/', import.meta.url);
|
|
5
5
|
const files = await readdir(assets);
|
|
6
6
|
const css = (await Promise.all(files.filter(file => file.endsWith('.css')).map(file => readFile(new URL(file, assets), 'utf8')))).join('\n');
|
|
7
|
-
for (const required of ['--
|
|
7
|
+
for (const required of ['--rhine-bg:', '.rhine-theme', '.rhine-button', '.ds-startup']) {
|
|
8
8
|
if (!css.includes(required)) throw new Error(`Design kit build lost required stylesheet content: ${required}`);
|
|
9
9
|
}
|
|
10
10
|
if (!files.some(file => /^logo-.*\.svg$/.test(file))) throw new Error('Design kit build lost the SVG master asset');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: rhine-design
|
|
3
3
|
description: Use Rhine Design components and specifications to design, implement, or review React UI, typography, themes, and motion. Apply when a project uses Rhine Design or the user requests its visual language or component system.
|
|
4
4
|
metadata:
|
|
5
|
-
version: "0.
|
|
5
|
+
version: "0.4.0"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Rhine Design · 莱茵设计
|
|
@@ -11,7 +11,7 @@ Use the installed version's components and contracts to build consistent interfa
|
|
|
11
11
|
|
|
12
12
|
## Locate the matching source
|
|
13
13
|
|
|
14
|
-
Package: `@linhey/rhine-design`. GitHub: `linhay/rhine-design` (different account spelling). This skill targets 0.
|
|
14
|
+
Package: `@linhey/rhine-design`. GitHub: `linhay/rhine-design` (different account spelling). This skill targets 0.4.0, including theme, navigation, form and timeline APIs. Never assume those APIs exist in an installed 0.3.0 package.
|
|
15
15
|
|
|
16
16
|
Find the package in the host's dependencies, normally `node_modules/@linhey/rhine-design/`, or its registered source checkout. Verify `package.json` name/version before using the paths below. Paths in references are relative to that package root, not the copied skill directory. Read installed types and source when versions differ; do not infer a new API from this skill. If the package is unavailable, use the task's supplied design sources and identify the missing implementation evidence.
|
|
17
17
|
|
|
@@ -23,15 +23,17 @@ Find the package in the host's dependencies, normally `node_modules/@linhey/rhin
|
|
|
23
23
|
|
|
24
24
|
## Design before implementation
|
|
25
25
|
|
|
26
|
-
1. Inventory existing components and tokens for the requested behavior. Compose them before creating a new component or duplicating styles.
|
|
26
|
+
1. Identify the task, interruption cost, information lifetime and recovery path using `docs/INTERACTION_PATTERNS.md` when present. Choose navigation, form, notification or overlay patterns before styling. Inventory existing components and tokens for the requested behavior. Compose them before creating a new component or duplicating styles.
|
|
27
27
|
2. Update the host's page mockup or the library's real `preview/` showcase first. A new shared capability includes its contract and a usable example.
|
|
28
28
|
3. Verify the changed states and interaction in the preview; then integrate into the app when implementation is in scope. Continue both stages when already authorized; a design-only request does not authorize an app migration.
|
|
29
29
|
4. For library changes run `npm run check`; for visual changes inspect relevant widths (400/520/880), 200% zoom, keyboard/focus and reduced motion. For consumer changes run that project's checks. Documentation-only edits need link, example and version consistency checks, not an unrelated UI test campaign.
|
|
30
30
|
|
|
31
31
|
## Preserve these contracts
|
|
32
32
|
|
|
33
|
-
- Use public exports, the `.
|
|
33
|
+
- Use public exports, the `.rhine-theme` root and existing tokens. Use the `rhine-` namespace for CSS variables, classes, animation names and motion data attributes; do not introduce host-product prefixes.
|
|
34
34
|
- Read the actual component signature before using it. Keep semantic headings separate from visual text variants.
|
|
35
35
|
- Host state determines data, selection and operation outcomes. Search and pagination remain host/server responsibilities; busy indicators never imply success.
|
|
36
|
+
- For multi-field failures, preserve input and focus a summary only after failed submission; links return to fields without changing routing. Use SideNav/Breadcrumbs/Steps only when exported by the installed source.
|
|
37
|
+
- Monitoring shows units, freshness and stale/unknown states; errors must not rely on color, flashing or transient toasts.
|
|
36
38
|
- Motion explains a change. Respect reduced motion, cancellation and replay; startup decoration never blocks real readiness. Preview-only experiments are not exported components.
|
|
37
39
|
- Keep independent release boundaries: do not change unrelated products or publish packages merely because this skill was invoked.
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# API map
|
|
2
2
|
|
|
3
|
-
All paths are relative to the matching package root. `components/index.ts`
|
|
3
|
+
All paths are relative to the matching package root. `package.json` exports, `components/index.ts` and the separate `components/theme.tsx` entry are the public export authority. This index locates APIs; exact props come from the installed source, not from remembered examples.
|
|
4
4
|
|
|
5
5
|
| Exports | Source |
|
|
6
6
|
| --- | --- |
|
|
7
|
+
| ThemeProvider, useTheme, themes, ThemeName, ThemeProviderProps (0.4.0;`@linhey/rhine-design/theme`) | `components/theme.tsx`;契约 `docs/THEMING.md` |
|
|
7
8
|
| Logo | `components/Logo.tsx` |
|
|
8
9
|
| Text | `components/Typography.tsx` |
|
|
9
10
|
| Select | `components/Select.tsx` |
|
|
@@ -12,7 +13,10 @@ All paths are relative to the matching package root. `components/index.ts` is th
|
|
|
12
13
|
| Divider, Stack, Inline, Grid | `components/Layout.tsx` |
|
|
13
14
|
| Metric, KeyValue, DataTable, Pagination | `components/Data.tsx` |
|
|
14
15
|
| Checkbox, RadioGroup, Switch, Textarea, SearchField, Combobox | `components/Forms.tsx` |
|
|
15
|
-
| Dialog, ConfirmDialog, Popover, Menu, Tooltip | `components/Overlays.tsx` |
|
|
16
|
+
| Dialog, Drawer (0.4.0), ConfirmDialog, Popover, Menu, Tooltip | `components/Overlays.tsx` |
|
|
17
|
+
| StatusTimeline, TimelineLegend (0.4.0) | `components/StatusTimeline.tsx`;历史证据,不计算健康评分 |
|
|
18
|
+
| SideNav, Breadcrumbs, Steps (0.4.0) | `components/Navigation.tsx` |
|
|
19
|
+
| Fieldset, ErrorSummary (0.4.0) | `components/FormWorkflow.tsx` |
|
|
16
20
|
| Toast | `components/Toast.tsx` |
|
|
17
21
|
| Button, Badge, Surface, SelectionCard, TextField, Tabs, SegmentedControl, Notice, Progress, Skeleton, Disclosure, EmptyState | `components/components.tsx` |
|
|
18
22
|
|
|
@@ -31,4 +35,4 @@ API decisions that commonly matter:
|
|
|
31
35
|
- `Text`'s `as` chooses semantics; `variant` chooses visual hierarchy.
|
|
32
36
|
- `Logo` accepts `wordmark` and `label`; its `theme` affects the logo, not the full component library.
|
|
33
37
|
- `Toast` presents one notification, not a global queue. `DataTable` is not a query or table-state engine.
|
|
34
|
-
- Components in `preview/` are demonstrations
|
|
38
|
+
- Components in `preview/` are demonstrations. Public API must resolve through a `package.json` export; theme APIs use the separate `/theme` entry.
|
|
@@ -4,8 +4,11 @@ Resolve the matching package root as described in SKILL.md. Open the first relev
|
|
|
4
4
|
|
|
5
5
|
| Task | First reference (relative to package root) | Implementation / example |
|
|
6
6
|
| --- | --- | --- |
|
|
7
|
+
| Theme integration, switching, controlled preferences | `docs/THEMING.md` (0.4.0) | `components/theme.tsx`, `preview/GalleryShell.tsx` |
|
|
8
|
+
| Scenario selection, navigation, form recovery, monitoring | `docs/INTERACTION_PATTERNS.md` (0.4.0; check installed version) | `preview/PatternGallery.tsx`; research in `docs/REFERENCE_RESEARCH.md` |
|
|
7
9
|
| Visual direction, colors, spacing, layout | `docs/DESIGN_SYSTEM.md` | `components/tokens.css`, `components/Layout.tsx` |
|
|
8
|
-
|
|
|
10
|
+
| Spacing, grouping, card composition | `components/SPACING.md` (0.4.0 docs; existing gap API works in 0.3.0) | `components/Layout.tsx`, `preview/SpacingGallery.tsx`; `/#spacing` |
|
|
11
|
+
| Text hierarchy, line height, paragraphs, Chinese/Latin text, metrics | `components/TYPOGRAPHY.md` | `components/Typography.tsx`, `preview/LineHeightGallery.tsx`; `/#typography` |
|
|
9
12
|
| Logo, light/dark variants, wordmark | `components/README.md` → 品牌标志 | `components/Logo.tsx`, `components/assets/logo.svg` |
|
|
10
13
|
| Buttons, navigation, basic states | `components/README.md` → 组件契约 | `components/components.tsx` |
|
|
11
14
|
| Forms, selection, combobox, data tables | `components/COMMON_COMPONENTS.md` | Use API_MAP for the source file |
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## Supported baseline
|
|
4
4
|
|
|
5
|
-
Rhine Design 0.
|
|
5
|
+
Rhine Design 0.4.0 ships TypeScript/TSX, CSS and SVG source for React 19 + Vite. Install `@linhey/rhine-design`; GitHub remains `linhay/rhine-design`. Check the installed package's engine and peer dependencies. Node 24 is the development baseline. Do not assume precompiled JavaScript, arbitrary SSR support or a complete dark theme.
|
|
6
6
|
|
|
7
7
|
```tsx
|
|
8
8
|
import { Button, Surface, Text } from '@linhey/rhine-design';
|
|
9
9
|
|
|
10
10
|
export function Example() {
|
|
11
11
|
return (
|
|
12
|
-
<div className="
|
|
12
|
+
<div className="rhine-theme">
|
|
13
13
|
<Surface>
|
|
14
14
|
<Text as="h2" variant="section">工作空间</Text>
|
|
15
15
|
<Button onClick={() => { /* host action */ }}>继续</Button>
|
|
@@ -21,11 +21,13 @@ export function Example() {
|
|
|
21
21
|
|
|
22
22
|
## Integration invariants
|
|
23
23
|
|
|
24
|
+
Version 0.4.0 also exports `ThemeProvider`, `useTheme`, `themes`, `ThemeName` and `ThemeProviderProps` from `@linhey/rhine-design/theme` (not in npm 0.3.0). See [the theme contract](../../../docs/THEMING.md). This entry loads base and built-in theme CSS and renders the `.rhine-theme` root. Use `defaultTheme` for local state, or `theme` with `onThemeChange` for host state; storage and URL preferences remain with the host. Sibling providers are supported; nested providers throw. Do not wrap it in another themed root or key the subtree by theme. Gallery decoration is excluded from the public theme CSS.
|
|
25
|
+
|
|
24
26
|
- The entry imports CSS automatically. Keep the package's entry and CSS `sideEffects` declarations so production tree shaking retains styles.
|
|
25
|
-
- Put `.
|
|
27
|
+
- Put `.rhine-theme` at the page root. Do not transform, clip or apply containment to it: overlays portal to the nearest theme root and need its variables and reduced-motion settings.
|
|
26
28
|
- For a locally linked checkout, use Vite `resolve.dedupe: ['react', 'react-dom']`. Duplicate React can break hooks; do not patch component state to mask this.
|
|
27
29
|
- Preserve SVG `?no-inline` handling. Logo uses a shared geometric master; missing symbols in production warrant checking the emitted SVG asset before replacing the logo.
|
|
28
|
-
- Reuse tokens for layout and state styling.
|
|
30
|
+
- Reuse tokens for layout and state styling. The arknights preset uses a dark palette; a general light/dark/system color-mode API is not provided. Logo color remains independent of the component theme.
|
|
29
31
|
|
|
30
32
|
## Host responsibilities
|
|
31
33
|
|