@press2ai/theme-specialist-glossy 0.10.1 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@press2ai/theme-specialist-glossy",
3
- "version": "0.10.1",
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
- // Framework-agnostic templates (Hono, Cloudflare Workers, plain Node):
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); }`;
@@ -287,7 +287,7 @@ main > article ul li {
287
287
  main > article dl { display: grid; grid-template-columns: max-content 1fr; gap: var(--g1) var(--g3); }
288
288
  main > article dt { font-size: var(--t-xs); color: var(--ink-3); font-weight: 500; }
289
289
  main > article dd { margin: 0; font-size: var(--t-sm); }
290
- main > article > footer { margin-top: var(--g4); padding-top: var(--g3); border-top: 1px solid var(--line); text-align: center; }
290
+
291
291
 
292
292
  /* Pagination */
293
293
  main > nav p { display: flex; align-items: center; justify-content: center; gap: var(--g3); font-size: var(--t-sm); color: var(--ink-3); }
@@ -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
+ }`;
@@ -12,7 +12,7 @@ export interface LayoutProps {
12
12
  footerContent?: string;
13
13
  }
14
14
 
15
- const THEME_VERSION = '0.10.1';
15
+ const THEME_VERSION = '0.11.0';
16
16
 
17
17
  export function layout(props: LayoutProps, body: string): string {
18
18
  const {