@press2ai/theme-specialist-glossy 0.10.0 → 0.11.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/package.json +2 -1
- package/src/index.ts +1 -9
- package/src/styles/base.ts +46 -0
- package/src/styles/catalog-grid.ts +8 -0
- package/src/styles/category-nav.ts +7 -0
- package/src/styles/footer.ts +29 -0
- package/src/styles/forms.ts +15 -0
- package/src/styles/glossy.css +8 -12
- package/src/styles/header.ts +12 -0
- package/src/styles/hero.ts +72 -0
- package/src/styles/index.ts +34 -0
- package/src/styles/pagination.ts +7 -0
- package/src/styles/profile-article.ts +27 -0
- package/src/styles/profile-card.ts +35 -0
- package/src/styles/stat-bar.ts +19 -0
- package/src/styles/steps.ts +29 -0
- package/src/templates/layout.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@press2ai/theme-specialist-glossy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Classless, AI-first theme inspired by Stripe. Framework-agnostic templates (Hono, Astro, raw HTML). Semantic HTML, Schema.org microdata, JSON-LD — built for LLM crawlers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"./ProfileArticle.astro": "./src/components/ProfileArticle.astro",
|
|
36
36
|
"./ProfileCard.astro": "./src/components/ProfileCard.astro",
|
|
37
37
|
"./Hero.astro": "./src/components/Hero.astro",
|
|
38
|
+
"./styles": "./src/styles/index.ts",
|
|
38
39
|
"./styles/glossy.css": "./src/styles/glossy.css",
|
|
39
40
|
"./schema": "./src/schema.ts",
|
|
40
41
|
"./ai": "./src/ai.ts"
|
package/src/index.ts
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
1
|
export { profileSchema, type Profile } from './schema.ts';
|
|
2
2
|
export { getJsonSchema, getAiManifest, getJsonLd } from './ai.ts';
|
|
3
|
-
|
|
4
|
-
// import { layout, hero, profileCard, profileArticle } from '@press2ai/theme-specialist-glossy/templates';
|
|
5
|
-
//
|
|
6
|
-
// Astro components (thin wrappers over templates):
|
|
7
|
-
// import Layout from '@press2ai/theme-specialist-glossy/Layout.astro';
|
|
8
|
-
// import ProfileArticle from '@press2ai/theme-specialist-glossy/ProfileArticle.astro';
|
|
9
|
-
//
|
|
10
|
-
// CSS (classless, works with any framework):
|
|
11
|
-
// import '@press2ai/theme-specialist-glossy/styles/glossy.css';
|
|
3
|
+
export { composeCss, allCss } from './styles/index.ts';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export const css = `@import url('https://rsms.me/inter/inter.css');
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--font: 'Inter', system-ui, sans-serif;
|
|
5
|
+
--g1: 0.5rem; --g2: 0.8125rem; --g3: 1.3125rem; --g4: 2.125rem; --g5: 3.4375rem; --g6: 5.5625rem; --g7: 9rem;
|
|
6
|
+
--t-xs: 0.8rem; --t-sm: 1rem; --t-md: 1.25rem; --t-lg: 1.563rem; --t-xl: 1.953rem; --t-2xl: 2.441rem;
|
|
7
|
+
--container: 1080px; --pad: var(--g4);
|
|
8
|
+
--w-6: 495px; --w-8: 667px; --w-10: 839px; --measure: 38rem;
|
|
9
|
+
--white: #ffffff; --bg: #f8f9fb; --card: #ffffff;
|
|
10
|
+
--ink: #1a1a2e; --ink-2: #4a4a68; --ink-3: #8b8ba3;
|
|
11
|
+
--line: #e8e8ef; --line-h: #d0d0de;
|
|
12
|
+
--violet: #7c5cfc; --violet-s: #f3f0ff; --violet-glow: rgba(124,92,252,.18);
|
|
13
|
+
--teal: #0d9488; --teal-s: #ecfdf5;
|
|
14
|
+
--rose: #e11d63; --rose-s: #fff1f5;
|
|
15
|
+
--amber: #d97706; --amber-s: #fffbeb;
|
|
16
|
+
--sky: #0284c7; --sky-s: #f0f9ff;
|
|
17
|
+
--r: 16px; --r-lg: 20px; --pill: 999px;
|
|
18
|
+
--shadow: 0 1px 3px rgba(0,0,0,.04);
|
|
19
|
+
--shadow-md: 0 4px 16px rgba(0,0,0,.06), 0 1px 3px rgba(0,0,0,.04);
|
|
20
|
+
--shadow-up: 0 8px 24px rgba(0,0,0,.08), 0 2px 6px rgba(0,0,0,.03);
|
|
21
|
+
--ease: 200ms cubic-bezier(.4,0,.2,1);
|
|
22
|
+
}
|
|
23
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; }
|
|
24
|
+
html { font-size: 16px; -webkit-font-smoothing: antialiased; scroll-behavior: smooth; }
|
|
25
|
+
body {
|
|
26
|
+
font-family: var(--font); font-feature-settings: 'cv11', 'ss01';
|
|
27
|
+
color: var(--ink); background: var(--bg); line-height: 1.6; overflow-x: clip;
|
|
28
|
+
}
|
|
29
|
+
h1, h2, h3 { color: var(--ink); letter-spacing: -0.02em; }
|
|
30
|
+
h1 { font-size: clamp(var(--t-xl), 5vw, var(--t-2xl)); font-weight: 800; line-height: 1.1; letter-spacing: -0.035em; margin-bottom: var(--g3); }
|
|
31
|
+
h2 { font-size: var(--t-lg); font-weight: 700; line-height: 1.25; margin-bottom: var(--g2); }
|
|
32
|
+
h3 { font-size: var(--t-md); font-weight: 600; line-height: 1.35; margin-bottom: var(--g2); }
|
|
33
|
+
p { font-size: var(--t-sm); line-height: 1.6; color: var(--ink-2); margin-bottom: var(--g2); max-width: var(--measure); }
|
|
34
|
+
a { color: var(--violet); text-decoration: none; transition: color var(--ease); }
|
|
35
|
+
a:hover { color: var(--ink); }
|
|
36
|
+
small { font-size: var(--t-xs); color: var(--ink-3); }
|
|
37
|
+
strong { color: var(--ink); font-weight: 600; }
|
|
38
|
+
main {
|
|
39
|
+
max-width: var(--container); margin-inline: auto;
|
|
40
|
+
padding-inline: var(--pad); padding-top: 0; padding-bottom: 0;
|
|
41
|
+
}
|
|
42
|
+
main > * + * { margin-top: var(--g5); }
|
|
43
|
+
@media (max-width: 640px) {
|
|
44
|
+
:root { --pad: var(--g3); }
|
|
45
|
+
main { padding: 0 var(--pad) var(--g4); }
|
|
46
|
+
}`;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const css = `section:has(> article[itemscope]) {
|
|
2
|
+
display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--g3);
|
|
3
|
+
}
|
|
4
|
+
section:has(> article[itemscope]) > h2 { grid-column: 1 / -1; margin-bottom: var(--g2); }
|
|
5
|
+
section:has(> article[itemscope]) > nav[aria-label] { grid-column: 1 / -1; margin-bottom: var(--g2); }
|
|
6
|
+
@media (max-width: 640px) {
|
|
7
|
+
section:has(> article[itemscope]) { grid-template-columns: 1fr; }
|
|
8
|
+
}`;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const css = `nav[aria-label] { display: flex; flex-wrap: wrap; gap: var(--g1); }
|
|
2
|
+
nav[aria-label] a {
|
|
3
|
+
display: inline-flex; align-items: center; height: 32px; padding: 0 var(--g2);
|
|
4
|
+
border-radius: var(--pill); font-size: var(--t-xs); font-weight: 500;
|
|
5
|
+
background: var(--white); border: 1px solid var(--line); color: var(--ink-2); transition: all var(--ease);
|
|
6
|
+
}
|
|
7
|
+
nav[aria-label] a:hover { border-color: var(--violet); color: var(--violet); background: var(--violet-s); }`;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const css = `body > footer {
|
|
2
|
+
border-top: 1px solid var(--line); background: var(--white);
|
|
3
|
+
padding: var(--g5) 0 var(--g4);
|
|
4
|
+
}
|
|
5
|
+
body > footer > small {
|
|
6
|
+
display: block; max-width: var(--container); margin-inline: auto; padding-inline: var(--pad);
|
|
7
|
+
color: var(--ink-3); font-size: var(--t-xs);
|
|
8
|
+
}
|
|
9
|
+
body > footer a { color: var(--ink-2); transition: color var(--ease); }
|
|
10
|
+
body > footer a:hover { color: var(--violet); }
|
|
11
|
+
body > footer > small > nav {
|
|
12
|
+
display: grid; grid-template-columns: 2fr 1fr 1fr; gap: var(--g4);
|
|
13
|
+
margin-bottom: var(--g4);
|
|
14
|
+
}
|
|
15
|
+
body > footer > small > nav section { all: unset; display: block; }
|
|
16
|
+
body > footer > small > nav strong {
|
|
17
|
+
display: block; font-size: var(--t-xs); font-weight: 600; color: var(--ink);
|
|
18
|
+
text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: var(--g2);
|
|
19
|
+
}
|
|
20
|
+
body > footer > small > nav p { font-size: var(--t-xs); line-height: 1.6; color: var(--ink-3); margin: 0; max-width: 36ch; }
|
|
21
|
+
body > footer > small > nav a { display: block; font-size: var(--t-xs); line-height: 2; color: var(--ink-3); }
|
|
22
|
+
body > footer > small > nav a:hover { color: var(--violet); }
|
|
23
|
+
body > footer > small > p {
|
|
24
|
+
padding-top: var(--g3); border-top: 1px solid var(--line);
|
|
25
|
+
font-size: var(--t-xs); color: var(--ink-3); text-align: left;
|
|
26
|
+
}
|
|
27
|
+
@media (max-width: 640px) {
|
|
28
|
+
body > footer > small > nav { grid-template-columns: 1fr; gap: var(--g3); }
|
|
29
|
+
}`;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const css = `label { display: block; font-size: var(--t-sm); color: var(--ink-2); font-weight: 500; margin-bottom: var(--g1); }
|
|
2
|
+
input[type="text"] {
|
|
3
|
+
display: block; width: 100%; margin-top: var(--g1); height: 44px;
|
|
4
|
+
padding: 0 var(--g3); background: var(--white); border: 1px solid var(--line);
|
|
5
|
+
border-radius: var(--r); color: var(--ink); font-size: var(--t-sm); font-family: var(--font);
|
|
6
|
+
transition: border-color var(--ease);
|
|
7
|
+
}
|
|
8
|
+
input[type="text"]:focus { outline: none; border-color: var(--violet); box-shadow: 0 0 0 3px var(--violet-glow); }
|
|
9
|
+
form:not([role="search"]) button[type="submit"] {
|
|
10
|
+
margin-top: var(--g3); height: 44px; padding: 0 var(--g4);
|
|
11
|
+
border: none; border-radius: var(--pill); background: var(--violet); color: var(--white);
|
|
12
|
+
font-size: var(--t-sm); font-weight: 600; font-family: var(--font); cursor: pointer;
|
|
13
|
+
transition: all var(--ease); box-shadow: 0 4px 14px var(--violet-glow);
|
|
14
|
+
}
|
|
15
|
+
form:not([role="search"]) button[type="submit"]:hover { background: var(--ink); transform: translateY(-1px); }`;
|
package/src/styles/glossy.css
CHANGED
|
@@ -57,12 +57,12 @@ body > header nav {
|
|
|
57
57
|
body > header nav a { color: var(--ink-2); text-decoration: none; font-size: var(--t-sm); font-weight: 500; }
|
|
58
58
|
body > header nav a strong { font-size: var(--t-md); font-weight: 700; color: var(--ink); }
|
|
59
59
|
|
|
60
|
-
/* Main —
|
|
60
|
+
/* Main — systemic gap between blocks, no per-block hacks */
|
|
61
61
|
main {
|
|
62
62
|
max-width: var(--container); margin-inline: auto;
|
|
63
63
|
padding-inline: var(--pad); padding-top: 0; padding-bottom: 0;
|
|
64
64
|
}
|
|
65
|
-
main >
|
|
65
|
+
main > * + * { margin-top: var(--g5); }
|
|
66
66
|
|
|
67
67
|
/* Footer */
|
|
68
68
|
body > footer {
|
|
@@ -96,7 +96,7 @@ body > footer > small > p {
|
|
|
96
96
|
hgroup {
|
|
97
97
|
position: relative; text-align: center; isolation: isolate; overflow: hidden;
|
|
98
98
|
padding: var(--g6) var(--pad) var(--g5);
|
|
99
|
-
margin:
|
|
99
|
+
margin-inline: calc(50% - 50vw);
|
|
100
100
|
background:
|
|
101
101
|
radial-gradient(ellipse 70% 50% at 20% 30%, var(--violet-glow) 0%, transparent 60%),
|
|
102
102
|
radial-gradient(ellipse 50% 60% at 80% 20%, rgba(13,148,136,.12) 0%, transparent 55%),
|
|
@@ -166,7 +166,6 @@ form[role="search"] button {
|
|
|
166
166
|
form[role="search"] button:hover { background: var(--ink); }
|
|
167
167
|
|
|
168
168
|
/* Stats — structural selector, no hardcoded aria-label */
|
|
169
|
-
section:has(> dl) { margin-top: var(--g6); }
|
|
170
169
|
section:has(> dl) > p {
|
|
171
170
|
text-align: center; font-size: var(--t-md); font-weight: 500; line-height: 1.55;
|
|
172
171
|
color: var(--ink); margin: 0 auto var(--g4); max-width: var(--measure);
|
|
@@ -185,7 +184,7 @@ section:has(> dl) > dl dt { font-size: var(--t-lg); font-weight: 800; line-heigh
|
|
|
185
184
|
section:has(> dl) > dl dd { margin: 2px 0 0; font-size: var(--t-xs); line-height: 1.4; color: var(--ink-3); font-weight: 500; text-transform: uppercase; letter-spacing: 0.06em; }
|
|
186
185
|
|
|
187
186
|
/* Category pills — single accent, no position-dependent colors */
|
|
188
|
-
nav[aria-label] { display: flex; flex-wrap: wrap; gap: var(--g1);
|
|
187
|
+
nav[aria-label] { display: flex; flex-wrap: wrap; gap: var(--g1); }
|
|
189
188
|
nav[aria-label] a {
|
|
190
189
|
display: inline-flex; align-items: center; height: 32px; padding: 0 var(--g2);
|
|
191
190
|
border-radius: var(--pill); font-size: var(--t-xs); font-weight: 500;
|
|
@@ -195,7 +194,7 @@ nav[aria-label] a:hover { border-color: var(--violet); color: var(--violet); bac
|
|
|
195
194
|
|
|
196
195
|
/* Steps — full-bleed white band */
|
|
197
196
|
section:has(> ol) {
|
|
198
|
-
margin:
|
|
197
|
+
margin-inline: calc(50% - 50vw);
|
|
199
198
|
padding: var(--g5) var(--pad);
|
|
200
199
|
background: var(--white);
|
|
201
200
|
border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
|
|
@@ -222,11 +221,10 @@ section > ol li span { font-size: var(--t-xs); line-height: 1.5; color: var(--in
|
|
|
222
221
|
|
|
223
222
|
/* Trainer cards — no position-dependent colors */
|
|
224
223
|
section:has(> article[itemscope]) {
|
|
225
|
-
margin-top: var(--g6);
|
|
226
224
|
display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--g3);
|
|
227
225
|
}
|
|
228
226
|
section:has(> article[itemscope]) > h2 { grid-column: 1 / -1; margin-bottom: var(--g2); }
|
|
229
|
-
section:has(> article[itemscope]) > nav[aria-label] { grid-column: 1 / -1; margin-
|
|
227
|
+
section:has(> article[itemscope]) > nav[aria-label] { grid-column: 1 / -1; margin-bottom: var(--g2); }
|
|
230
228
|
article[itemscope] {
|
|
231
229
|
position: relative; background: var(--card); border: 1px solid var(--line);
|
|
232
230
|
border-radius: var(--r-lg); padding: var(--g3);
|
|
@@ -268,7 +266,7 @@ article[itemscope] > a:last-child:hover { color: var(--ink); gap: 4px; }
|
|
|
268
266
|
|
|
269
267
|
/* Single trainer */
|
|
270
268
|
main > article {
|
|
271
|
-
max-width: var(--w-8); margin:
|
|
269
|
+
max-width: var(--w-8); margin-inline: auto; background: var(--card);
|
|
272
270
|
border: 1px solid var(--line); border-radius: var(--r-lg); padding: var(--g5); box-shadow: var(--shadow-md);
|
|
273
271
|
}
|
|
274
272
|
main > article > header { border-bottom: 1px solid var(--line); padding-bottom: var(--g3); margin-bottom: var(--g4); }
|
|
@@ -289,10 +287,9 @@ main > article ul li {
|
|
|
289
287
|
main > article dl { display: grid; grid-template-columns: max-content 1fr; gap: var(--g1) var(--g3); }
|
|
290
288
|
main > article dt { font-size: var(--t-xs); color: var(--ink-3); font-weight: 500; }
|
|
291
289
|
main > article dd { margin: 0; font-size: var(--t-sm); }
|
|
292
|
-
|
|
290
|
+
|
|
293
291
|
|
|
294
292
|
/* Pagination */
|
|
295
|
-
main > nav { margin-top: var(--g4); }
|
|
296
293
|
main > nav p { display: flex; align-items: center; justify-content: center; gap: var(--g3); font-size: var(--t-sm); color: var(--ink-3); }
|
|
297
294
|
main > nav a {
|
|
298
295
|
height: 32px; display: inline-flex; align-items: center; padding: 0 var(--g2);
|
|
@@ -319,7 +316,6 @@ form:not([role="search"]) button[type="submit"] {
|
|
|
319
316
|
form:not([role="search"]) button[type="submit"]:hover { background: var(--ink); transform: translateY(-1px); }
|
|
320
317
|
|
|
321
318
|
/* Trust block */
|
|
322
|
-
aside:has(> ul) { margin-top: var(--g5); }
|
|
323
319
|
|
|
324
320
|
/* Responsive */
|
|
325
321
|
@media (max-width: 640px) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const css = `body > header {
|
|
2
|
+
position: sticky; top: 0; z-index: 50;
|
|
3
|
+
background: rgba(255,255,255,.82);
|
|
4
|
+
backdrop-filter: saturate(180%) blur(16px); -webkit-backdrop-filter: saturate(180%) blur(16px);
|
|
5
|
+
border-bottom: 1px solid var(--line);
|
|
6
|
+
}
|
|
7
|
+
body > header nav {
|
|
8
|
+
max-width: var(--container); margin-inline: auto; padding-inline: var(--pad);
|
|
9
|
+
height: 48px; display: flex; align-items: center; justify-content: space-between;
|
|
10
|
+
}
|
|
11
|
+
body > header nav a { color: var(--ink-2); text-decoration: none; font-size: var(--t-sm); font-weight: 500; }
|
|
12
|
+
body > header nav a strong { font-size: var(--t-md); font-weight: 700; color: var(--ink); }`;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const css = `hgroup {
|
|
2
|
+
position: relative; text-align: center; isolation: isolate; overflow: hidden;
|
|
3
|
+
padding: var(--g6) var(--pad) var(--g5);
|
|
4
|
+
margin-inline: calc(50% - 50vw);
|
|
5
|
+
background:
|
|
6
|
+
radial-gradient(ellipse 70% 50% at 20% 30%, var(--violet-glow) 0%, transparent 60%),
|
|
7
|
+
radial-gradient(ellipse 50% 60% at 80% 20%, rgba(13,148,136,.12) 0%, transparent 55%),
|
|
8
|
+
radial-gradient(ellipse 60% 40% at 50% 100%, rgba(225,29,99,.08) 0%, transparent 50%),
|
|
9
|
+
linear-gradient(180deg, #fff 0%, var(--bg) 100%);
|
|
10
|
+
border-bottom: 1px solid var(--line);
|
|
11
|
+
}
|
|
12
|
+
hgroup::before {
|
|
13
|
+
content: ''; position: absolute; inset: 0;
|
|
14
|
+
background-image:
|
|
15
|
+
linear-gradient(rgba(124,92,252,.04) 1px, transparent 1px),
|
|
16
|
+
linear-gradient(90deg, rgba(124,92,252,.04) 1px, transparent 1px);
|
|
17
|
+
background-size: 48px 48px;
|
|
18
|
+
mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, black 0%, transparent 70%);
|
|
19
|
+
-webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, black 0%, transparent 70%);
|
|
20
|
+
z-index: -1;
|
|
21
|
+
}
|
|
22
|
+
hgroup > * { position: relative; }
|
|
23
|
+
hgroup > p:first-child { display: inline-flex; margin-bottom: var(--g4); padding: 0; }
|
|
24
|
+
hgroup > p:first-child small {
|
|
25
|
+
display: inline-flex; align-items: center; gap: var(--g1);
|
|
26
|
+
background: rgba(255,255,255,.7); backdrop-filter: blur(8px);
|
|
27
|
+
padding: var(--g1) var(--g2); border: 1px solid var(--line);
|
|
28
|
+
border-radius: var(--pill); font-size: var(--t-xs); font-weight: 600; color: var(--teal);
|
|
29
|
+
box-shadow: var(--shadow);
|
|
30
|
+
}
|
|
31
|
+
hgroup > p:first-child small::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: #00d24a; box-shadow: 0 0 0 3px rgba(0,210,74,.2); }
|
|
32
|
+
hgroup h1 { max-width: 18ch; margin: 0 auto var(--g4); color: var(--ink); }
|
|
33
|
+
hgroup p { font-size: var(--t-md); line-height: 1.55; color: var(--ink-2); max-width: var(--measure); margin: 0 auto var(--g4); }
|
|
34
|
+
hgroup > nav {
|
|
35
|
+
display: flex; gap: var(--g2); flex-wrap: wrap; justify-content: center;
|
|
36
|
+
margin-top: var(--g4); margin-bottom: 0;
|
|
37
|
+
}
|
|
38
|
+
hgroup > nav > a {
|
|
39
|
+
display: inline-flex; align-items: center; height: 44px; padding: 0 var(--g4);
|
|
40
|
+
border-radius: var(--pill); font-weight: 600; font-size: var(--t-sm); transition: all var(--ease);
|
|
41
|
+
background: var(--white); color: var(--ink); border: 1px solid var(--line);
|
|
42
|
+
}
|
|
43
|
+
hgroup > nav > a:first-child {
|
|
44
|
+
background: var(--violet); color: var(--white); border-color: transparent;
|
|
45
|
+
box-shadow: 0 4px 14px var(--violet-glow);
|
|
46
|
+
}
|
|
47
|
+
hgroup > nav > a:first-child:hover { background: var(--ink); color: var(--white); transform: translateY(-1px); box-shadow: 0 6px 20px rgba(26,26,46,.2); }
|
|
48
|
+
hgroup > nav > a:not(:first-child):hover { border-color: var(--line-h); background: var(--bg); }
|
|
49
|
+
form[role="search"] {
|
|
50
|
+
display: flex; max-width: var(--w-6); height: 48px;
|
|
51
|
+
margin: var(--g4) auto 0; background: var(--white);
|
|
52
|
+
border: 1px solid var(--line); border-radius: var(--pill);
|
|
53
|
+
overflow: hidden; box-shadow: var(--shadow-md); transition: all var(--ease);
|
|
54
|
+
}
|
|
55
|
+
form[role="search"]:focus-within { border-color: var(--violet); box-shadow: 0 4px 16px var(--violet-glow); }
|
|
56
|
+
form[role="search"] input {
|
|
57
|
+
flex: 1; min-width: 0; border: none; background: transparent; color: var(--ink);
|
|
58
|
+
padding: 0 var(--g3); font-size: var(--t-sm); font-family: var(--font); outline: none;
|
|
59
|
+
-webkit-appearance: none; appearance: none;
|
|
60
|
+
}
|
|
61
|
+
form[role="search"] input::placeholder { color: var(--ink-3); }
|
|
62
|
+
form[role="search"] button {
|
|
63
|
+
flex-shrink: 0; height: 100%; border: none; background: var(--violet); color: var(--white);
|
|
64
|
+
padding: 0 var(--g4); font-size: var(--t-sm); font-weight: 600;
|
|
65
|
+
font-family: var(--font); cursor: pointer; transition: background var(--ease);
|
|
66
|
+
}
|
|
67
|
+
form[role="search"] button:hover { background: var(--ink); }
|
|
68
|
+
@media (max-width: 640px) {
|
|
69
|
+
hgroup { padding: var(--g5) var(--pad) var(--g4); }
|
|
70
|
+
form[role="search"] { height: 40px; }
|
|
71
|
+
form[role="search"] input { font-size: var(--t-xs); }
|
|
72
|
+
}`;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { css as base } from './base.ts';
|
|
2
|
+
import { css as header } from './header.ts';
|
|
3
|
+
import { css as footer } from './footer.ts';
|
|
4
|
+
import { css as hero } from './hero.ts';
|
|
5
|
+
import { css as statBar } from './stat-bar.ts';
|
|
6
|
+
import { css as categoryNav } from './category-nav.ts';
|
|
7
|
+
import { css as steps } from './steps.ts';
|
|
8
|
+
import { css as catalogGrid } from './catalog-grid.ts';
|
|
9
|
+
import { css as profileCard } from './profile-card.ts';
|
|
10
|
+
import { css as profileArticle } from './profile-article.ts';
|
|
11
|
+
import { css as pagination } from './pagination.ts';
|
|
12
|
+
import { css as forms } from './forms.ts';
|
|
13
|
+
|
|
14
|
+
const components: Record<string, string> = {
|
|
15
|
+
hero,
|
|
16
|
+
statBar,
|
|
17
|
+
categoryNav,
|
|
18
|
+
steps,
|
|
19
|
+
catalogGrid,
|
|
20
|
+
profileCard,
|
|
21
|
+
profileArticle,
|
|
22
|
+
pagination,
|
|
23
|
+
forms,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const layoutCss = base + '\n' + header + '\n' + footer;
|
|
27
|
+
|
|
28
|
+
export function composeCss(...names: string[]): string {
|
|
29
|
+
return layoutCss + '\n' + names.map(n => components[n] ?? '').join('\n');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const allCss = layoutCss + '\n' + Object.values(components).join('\n');
|
|
33
|
+
|
|
34
|
+
export { base, header, footer, hero, statBar, categoryNav, steps, catalogGrid, profileCard, profileArticle, pagination, forms };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const css = `main > nav p { display: flex; align-items: center; justify-content: center; gap: var(--g3); font-size: var(--t-sm); color: var(--ink-3); }
|
|
2
|
+
main > nav a {
|
|
3
|
+
height: 32px; display: inline-flex; align-items: center; padding: 0 var(--g2);
|
|
4
|
+
border-radius: var(--pill); background: var(--white); border: 1px solid var(--line);
|
|
5
|
+
font-size: var(--t-xs); font-weight: 500; transition: all var(--ease);
|
|
6
|
+
}
|
|
7
|
+
main > nav a:hover { border-color: var(--violet); color: var(--violet); transform: translateY(-1px); }`;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const css = `main > article {
|
|
2
|
+
max-width: var(--w-8); margin-inline: auto; background: var(--card);
|
|
3
|
+
border: 1px solid var(--line); border-radius: var(--r-lg); padding: var(--g5); box-shadow: var(--shadow-md);
|
|
4
|
+
}
|
|
5
|
+
main > article > header { border-bottom: 1px solid var(--line); padding-bottom: var(--g3); margin-bottom: var(--g4); }
|
|
6
|
+
main > article > header h1 { margin-bottom: var(--g2); }
|
|
7
|
+
main > article > header p { font-size: var(--t-md); color: var(--ink-3); margin: 0; }
|
|
8
|
+
main > article address {
|
|
9
|
+
font-style: normal; display: inline-block; background: var(--bg);
|
|
10
|
+
padding: var(--g1) var(--g2); border-radius: var(--r); margin-bottom: var(--g3);
|
|
11
|
+
color: var(--ink-2); border: 1px solid var(--line); font-size: var(--t-sm);
|
|
12
|
+
}
|
|
13
|
+
main > article section { margin: var(--g4) 0; }
|
|
14
|
+
main > article section h2 { font-size: var(--t-xs); font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-3); margin: 0 0 var(--g2); }
|
|
15
|
+
main > article ul { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: var(--g1); }
|
|
16
|
+
main > article ul li {
|
|
17
|
+
background: var(--violet-s); color: var(--violet);
|
|
18
|
+
padding: calc(var(--g1) / 2) var(--g2); border-radius: var(--pill); font-size: var(--t-xs); font-weight: 500;
|
|
19
|
+
}
|
|
20
|
+
main > article dl { display: grid; grid-template-columns: max-content 1fr; gap: var(--g1) var(--g3); }
|
|
21
|
+
main > article dt { font-size: var(--t-xs); color: var(--ink-3); font-weight: 500; }
|
|
22
|
+
main > article dd { margin: 0; font-size: var(--t-sm); }
|
|
23
|
+
@media (max-width: 640px) {
|
|
24
|
+
main > article { padding: var(--g3); }
|
|
25
|
+
main > article dl { grid-template-columns: 1fr; gap: calc(var(--g1) / 2) 0; }
|
|
26
|
+
main > article dt { margin-top: var(--g2); }
|
|
27
|
+
}`;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const css = `article[itemscope] {
|
|
2
|
+
position: relative; background: var(--card); border: 1px solid var(--line);
|
|
3
|
+
border-radius: var(--r-lg); padding: var(--g3);
|
|
4
|
+
display: flex; flex-direction: column;
|
|
5
|
+
box-shadow: var(--shadow); transition: all var(--ease);
|
|
6
|
+
}
|
|
7
|
+
article[itemscope]:hover { transform: translateY(-2px); box-shadow: var(--shadow-up); border-color: var(--line-h); }
|
|
8
|
+
article[itemscope] > div[aria-hidden] {
|
|
9
|
+
width: 40px; height: 40px; border-radius: 50%;
|
|
10
|
+
display: flex; align-items: center; justify-content: center;
|
|
11
|
+
font-size: var(--t-xs); font-weight: 700; color: var(--white);
|
|
12
|
+
margin-bottom: var(--g2); flex-shrink: 0; background: var(--violet);
|
|
13
|
+
}
|
|
14
|
+
article[itemscope] header { margin-bottom: var(--g1); }
|
|
15
|
+
article[itemscope] h2 { font-size: var(--t-sm); font-weight: 600; line-height: 1.3; margin: 0 0 2px; }
|
|
16
|
+
article[itemscope] h2 a { color: var(--ink); }
|
|
17
|
+
article[itemscope] h2 a:hover { color: var(--violet); }
|
|
18
|
+
article[itemscope] header p { font-size: var(--t-xs); line-height: 1.4; color: var(--ink-3); margin: 0; }
|
|
19
|
+
article[itemscope] header p:has([itemprop="address"]) {
|
|
20
|
+
display: inline-flex; align-items: center; gap: 4px; margin-top: 2px;
|
|
21
|
+
}
|
|
22
|
+
article[itemscope] header p:has([itemprop="address"])::before {
|
|
23
|
+
content: ''; display: inline-block; width: 3px; height: 3px; border-radius: 50%; background: var(--ink-3);
|
|
24
|
+
}
|
|
25
|
+
article[itemscope] [itemprop="description"] { font-size: var(--t-xs); line-height: 1.5; margin: var(--g1) 0 0; color: var(--ink-2); }
|
|
26
|
+
article[itemscope] ul { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: 4px; margin-top: var(--g1); }
|
|
27
|
+
article[itemscope] ul li {
|
|
28
|
+
background: var(--violet-s); color: var(--violet);
|
|
29
|
+
padding: 1px var(--g1); border-radius: var(--pill); font-size: 0.7rem; font-weight: 500;
|
|
30
|
+
}
|
|
31
|
+
article[itemscope] > a:last-child {
|
|
32
|
+
display: inline-flex; align-items: center; margin-top: auto; padding-top: var(--g2);
|
|
33
|
+
font-size: var(--t-xs); font-weight: 600; color: var(--violet); transition: all var(--ease);
|
|
34
|
+
}
|
|
35
|
+
article[itemscope] > a:last-child:hover { color: var(--ink); gap: 4px; }`;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const css = `section:has(> dl) > p {
|
|
2
|
+
text-align: center; font-size: var(--t-md); font-weight: 500; line-height: 1.55;
|
|
3
|
+
color: var(--ink); margin: 0 auto var(--g4); max-width: var(--measure);
|
|
4
|
+
}
|
|
5
|
+
section:has(> dl) > dl {
|
|
6
|
+
display: flex; justify-content: center; gap: var(--g5); margin: 0 auto; padding: 0;
|
|
7
|
+
border: none; background: none; box-shadow: none;
|
|
8
|
+
}
|
|
9
|
+
section:has(> dl) > dl div { text-align: center; }
|
|
10
|
+
section:has(> dl) > dl div > span:has(> svg) {
|
|
11
|
+
display: flex; align-items: center; justify-content: center; width: 36px; height: 36px;
|
|
12
|
+
margin: 0 auto var(--g1); background: var(--violet-s); border-radius: 50%; color: var(--violet);
|
|
13
|
+
}
|
|
14
|
+
section:has(> dl) > dl div > span:has(> svg) > svg { width: 18px; height: 18px; }
|
|
15
|
+
section:has(> dl) > dl dt { font-size: var(--t-lg); font-weight: 800; line-height: 1.2; color: var(--violet); }
|
|
16
|
+
section:has(> dl) > dl dd { margin: 2px 0 0; font-size: var(--t-xs); line-height: 1.4; color: var(--ink-3); font-weight: 500; text-transform: uppercase; letter-spacing: 0.06em; }
|
|
17
|
+
@media (max-width: 640px) {
|
|
18
|
+
section:has(> dl) > dl { gap: var(--g3); }
|
|
19
|
+
}`;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const css = `section:has(> ol) {
|
|
2
|
+
margin-inline: calc(50% - 50vw);
|
|
3
|
+
padding: var(--g5) var(--pad);
|
|
4
|
+
background: var(--white);
|
|
5
|
+
border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
|
|
6
|
+
}
|
|
7
|
+
section:has(> ol) > * { max-width: var(--container); margin-inline: auto; }
|
|
8
|
+
section:has(> ol) > h2 { text-align: center; margin-bottom: var(--g4); }
|
|
9
|
+
section > ol {
|
|
10
|
+
list-style: none; padding: 0; display: grid;
|
|
11
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--g3); margin: 0 auto; counter-reset: steps;
|
|
12
|
+
}
|
|
13
|
+
section > ol li {
|
|
14
|
+
counter-increment: steps; background: var(--bg); border: 1px solid var(--line);
|
|
15
|
+
border-radius: var(--r-lg); padding: var(--g4) var(--g3); text-align: center; transition: all var(--ease);
|
|
16
|
+
}
|
|
17
|
+
section > ol li:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
|
|
18
|
+
section > ol li::before {
|
|
19
|
+
content: counter(steps); display: flex; align-items: center; justify-content: center;
|
|
20
|
+
width: 40px; height: 40px; margin: 0 auto var(--g2);
|
|
21
|
+
border-radius: 50%; font-size: var(--t-sm); font-weight: 700;
|
|
22
|
+
background: var(--violet-s); color: var(--violet);
|
|
23
|
+
}
|
|
24
|
+
section > ol li strong { display: block; font-size: var(--t-sm); line-height: 1.4; margin-bottom: 4px; color: var(--ink); }
|
|
25
|
+
section > ol li span { font-size: var(--t-xs); line-height: 1.5; color: var(--ink-3); }
|
|
26
|
+
@media (max-width: 640px) {
|
|
27
|
+
section > ol { grid-template-columns: 1fr; }
|
|
28
|
+
section:has(> ol) { padding: var(--g4) var(--pad); }
|
|
29
|
+
}`;
|