@press2ai/theme-specialist-glossy 1.0.0 → 2.0.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": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Classless, AI-first glossy theme. 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",
package/src/ai.ts CHANGED
@@ -59,7 +59,7 @@ export function getAiManifest(opts: {
59
59
 
60
60
  powered_by: {
61
61
  name: '@press2ai/theme-specialist-glossy',
62
- version: '1.0.0',
62
+ version: '2.0.0',
63
63
  homepage: 'https://www.npmjs.com/package/@press2ai/theme-specialist-glossy',
64
64
  },
65
65
 
@@ -0,0 +1,3 @@
1
+ export const BREAKOUT = `margin-inline: calc(50% - 50vw); padding-inline: var(--pad);`;
2
+ export const BREAKOUT_LIGHT = `${BREAKOUT} background: var(--bg);`;
3
+ export const BREAKOUT_DARK = `${BREAKOUT} background: var(--ink); color: var(--white);`;
@@ -3,14 +3,14 @@ export const css = `@import url('https://rsms.me/inter/inter.css');
3
3
  --font: 'Inter', system-ui, sans-serif;
4
4
  --g1: .5rem; --g2: .8125rem; --g3: 1.3125rem; --g4: 2.125rem; --g5: 3.4375rem; --g6: 5.5625rem;
5
5
  --t-xs: .8rem; --t-sm: 1rem; --t-md: 1.25rem; --t-lg: 1.563rem; --t-xl: 1.953rem; --t-2xl: 2.441rem;
6
- --container: 1080px; --pad: var(--g4); --gap: var(--g4);
6
+ --container: 1080px; --pad: var(--g4);
7
+ --section-gap: var(--g4); --block-gap: var(--g3); --card-gap: var(--g3);
7
8
  --measure: 38rem;
8
9
  --white: #fff; --bg: #f8f9fb; --card: #fff;
9
10
  --ink: #1a1a2e; --ink-2: #4a4a68; --ink-3: #8b8ba3;
10
11
  --line: #e8e8ef; --line-h: #d0d0de;
11
12
  --violet: #7c5cfc; --violet-s: #f3f0ff; --violet-glow: rgba(124,92,252,.18);
12
13
  --teal: #0d9488; --teal-s: #ecfdf5;
13
- --rose: #e11d63; --amber: #d97706; --sky: #0284c7;
14
14
  --r: 16px; --r-lg: 20px; --pill: 999px;
15
15
  --shadow: 0 1px 3px rgba(0,0,0,.04);
16
16
  --shadow-md: 0 4px 16px rgba(0,0,0,.06), 0 1px 3px rgba(0,0,0,.04);
@@ -30,5 +30,5 @@ a:hover { color: var(--ink); }
30
30
  small { font-size: var(--t-xs); color: var(--ink-3); }
31
31
  strong { color: var(--ink); font-weight: 600; }
32
32
  main { max-width: var(--container); margin-inline: auto; padding-inline: var(--pad); }
33
- main > * + * { margin-top: var(--gap); }
34
- @media (max-width: 640px) { :root { --pad: var(--g3); --gap: var(--g3); } }`;
33
+ main > * + * { margin-top: var(--section-gap); }
34
+ @media (max-width: 640px) { :root { --pad: var(--g3); --section-gap: var(--g3); --block-gap: var(--g2); --card-gap: var(--g2); } }`;
@@ -1,5 +1,7 @@
1
- export const css = `section:has(> article[itemscope]) {
2
- display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--g3);
1
+ const R = 'main > section:has(> article[itemscope])';
2
+
3
+ export const css = `${R} {
4
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--card-gap);
3
5
  }
4
- section:has(> article[itemscope]) > h2 { grid-column: 1 / -1; margin-bottom: 0; }
5
- @media (max-width: 640px) { section:has(> article[itemscope]) { grid-template-columns: 1fr; } }`;
6
+ ${R} > h2 { grid-column: 1 / -1; margin-bottom: 0; }
7
+ @media (max-width: 640px) { ${R} { grid-template-columns: 1fr; } }`;
@@ -1,7 +1,9 @@
1
- export const css = `main > nav[aria-label] { display: flex; flex-wrap: wrap; gap: var(--g1); }
2
- main > nav[aria-label] a {
1
+ const R = 'main > nav:has(> a)';
2
+
3
+ export const css = `${R} { display: flex; flex-wrap: wrap; gap: var(--g1); }
4
+ ${R} > a {
3
5
  display: inline-flex; align-items: center; height: 32px; padding: 0 var(--g2);
4
6
  border-radius: var(--pill); font-size: var(--t-xs); font-weight: 500;
5
7
  background: var(--white); border: 1px solid var(--line); color: var(--ink-2); transition: all var(--ease);
6
8
  }
7
- main > nav[aria-label] a:hover { border-color: var(--violet); color: var(--violet); background: var(--violet-s); }`;
9
+ ${R} > a:hover { border-color: var(--violet); color: var(--violet); background: var(--violet-s); }`;
@@ -1,7 +1,11 @@
1
- export const css = `hgroup {
1
+ import { BREAKOUT } from './_shared.ts';
2
+
3
+ const R = 'main > hgroup';
4
+
5
+ export const css = `${R} {
6
+ ${BREAKOUT}
2
7
  position: relative; text-align: center; isolation: isolate; overflow: hidden;
3
- padding: var(--g6) var(--pad) var(--g5);
4
- margin-inline: calc(50% - 50vw);
8
+ padding-block: var(--g6) var(--g5);
5
9
  background:
6
10
  radial-gradient(ellipse 70% 50% at 20% 30%, var(--violet-glow) 0%, transparent 60%),
7
11
  radial-gradient(ellipse 50% 60% at 80% 20%, rgba(13,148,136,.12) 0%, transparent 55%),
@@ -9,7 +13,7 @@ export const css = `hgroup {
9
13
  linear-gradient(180deg, #fff 0%, var(--bg) 100%);
10
14
  border-bottom: 1px solid var(--line);
11
15
  }
12
- hgroup::before {
16
+ ${R}::before {
13
17
  content: ''; position: absolute; inset: 0;
14
18
  background-image:
15
19
  linear-gradient(rgba(124,92,252,.04) 1px, transparent 1px),
@@ -18,17 +22,17 @@ hgroup::before {
18
22
  mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, black 0%, transparent 70%);
19
23
  z-index: -1;
20
24
  }
21
- hgroup > * { position: relative; }
22
- hgroup > p:first-child { display: inline-flex; margin-bottom: var(--g4); }
23
- hgroup > p:first-child small {
25
+ ${R} > * { position: relative; }
26
+ ${R} > p:first-child { display: inline-flex; margin-bottom: var(--g4); }
27
+ ${R} > p:first-child small {
24
28
  display: inline-flex; align-items: center; gap: var(--g1);
25
29
  background: rgba(255,255,255,.7); backdrop-filter: blur(8px);
26
30
  padding: var(--g1) var(--g2); border: 1px solid var(--line);
27
31
  border-radius: var(--pill); font-weight: 600; color: var(--teal); box-shadow: var(--shadow);
28
32
  }
29
- 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); }
30
- hgroup h1 { max-width: 18ch; margin: 0 auto var(--g4); }
31
- hgroup p { font-size: var(--t-md); line-height: 1.55; color: var(--ink-2); max-width: var(--measure); margin: 0 auto var(--g4); }
33
+ ${R} > 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); }
34
+ ${R} h1 { max-width: 18ch; margin: 0 auto var(--g4); }
35
+ ${R} p { font-size: var(--t-md); line-height: 1.55; color: var(--ink-2); max-width: var(--measure); margin: 0 auto var(--g4); }
32
36
  form[role="search"] {
33
37
  display: flex; max-width: 495px; height: 48px;
34
38
  margin: var(--g4) auto 0; background: var(--white);
@@ -48,7 +52,7 @@ form[role="search"] button {
48
52
  }
49
53
  form[role="search"] button:hover { background: var(--ink); }
50
54
  @media (max-width: 640px) {
51
- hgroup { padding: var(--g5) var(--pad) var(--g4); }
55
+ ${R} { padding-block: var(--g5) var(--g4); }
52
56
  form[role="search"] { height: 40px; }
53
57
  form[role="search"] input { font-size: var(--t-xs); }
54
58
  }`;
@@ -1,7 +1,9 @@
1
- export const css = `main > nav:has(> p) p { display: flex; align-items: center; justify-content: center; gap: var(--g3); font-size: var(--t-sm); color: var(--ink-3); }
2
- main > nav:has(> p) a {
1
+ const R = 'main > nav:has(> p)';
2
+
3
+ export const css = `${R} > p { display: flex; align-items: center; justify-content: center; gap: var(--block-gap); font-size: var(--t-sm); color: var(--ink-3); }
4
+ ${R} a {
3
5
  height: 32px; display: inline-flex; align-items: center; padding: 0 var(--g2);
4
6
  border-radius: var(--pill); background: var(--white); border: 1px solid var(--line);
5
7
  font-size: var(--t-xs); font-weight: 500; transition: all var(--ease);
6
8
  }
7
- main > nav:has(> p) a:hover { border-color: var(--violet); color: var(--violet); transform: translateY(-1px); }`;
9
+ ${R} a:hover { border-color: var(--violet); color: var(--violet); transform: translateY(-1px); }`;
@@ -1,18 +1,20 @@
1
- export const css = `main > article[itemscope] { max-width: 667px; }
2
- main > article[itemscope] > header { padding-bottom: var(--g4); margin-bottom: var(--g4); border-bottom: 2px solid var(--ink); }
3
- main > article[itemscope] > header h1 { font-size: var(--t-2xl); font-weight: 800; letter-spacing: -.04em; line-height: 1.05; margin-bottom: var(--g1); }
4
- main > article[itemscope] > header p { font-size: var(--t-md); color: var(--ink-2); margin: 0; }
5
- main > article[itemscope] > header small { display: block; margin-top: var(--g1); font-size: var(--t-xs); color: var(--teal); font-weight: 600; text-transform: uppercase; letter-spacing: .08em; }
6
- main > article[itemscope] address { font-style: normal; font-size: var(--t-sm); color: var(--ink-2); padding: var(--g2) 0; margin-bottom: var(--g3); border-bottom: 1px solid var(--line); }
7
- main > article[itemscope] section { margin: var(--g4) 0; padding-top: var(--g3); border-top: 1px solid var(--line); }
8
- main > article[itemscope] section h2 { font-size: var(--t-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .1em; margin: 0 0 var(--g2); }
9
- main > article[itemscope] ul { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: var(--g1); }
10
- main > article[itemscope] ul li { font-size: var(--t-xs); font-weight: 500; color: var(--ink-2); padding: calc(var(--g1)/2) 0; }
11
- main > article[itemscope] ul li:not(:last-child)::after { content: ','; }
12
- main > article[itemscope] dl { display: grid; grid-template-columns: 8rem 1fr; gap: var(--g1) var(--g3); }
13
- main > article[itemscope] dt { font-size: var(--t-xs); color: var(--ink-3); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }
14
- main > article[itemscope] dd { margin: 0; font-size: var(--t-sm); }
1
+ const R = 'main > article[itemscope]';
2
+
3
+ export const css = `${R} { max-width: 667px; }
4
+ ${R} > header { padding-bottom: var(--g4); margin-bottom: var(--g4); border-bottom: 2px solid var(--ink); }
5
+ ${R} > header h1 { font-size: var(--t-2xl); font-weight: 800; letter-spacing: -.04em; line-height: 1.05; margin-bottom: var(--g1); }
6
+ ${R} > header p { font-size: var(--t-md); color: var(--ink-2); margin: 0; }
7
+ ${R} > header small { display: block; margin-top: var(--g1); font-size: var(--t-xs); color: var(--teal); font-weight: 600; text-transform: uppercase; letter-spacing: .08em; }
8
+ ${R} address { font-style: normal; font-size: var(--t-sm); color: var(--ink-2); padding: var(--g2) 0; margin-bottom: var(--block-gap); border-bottom: 1px solid var(--line); }
9
+ ${R} section { margin: var(--g4) 0; padding-top: var(--block-gap); border-top: 1px solid var(--line); }
10
+ ${R} section h2 { font-size: var(--t-xs); font-weight: 700; text-transform: uppercase; letter-spacing: .1em; margin: 0 0 var(--g2); }
11
+ ${R} ul { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: var(--g1); }
12
+ ${R} ul li { font-size: var(--t-xs); font-weight: 500; color: var(--ink-2); padding: calc(var(--g1)/2) 0; }
13
+ ${R} ul li:not(:last-child)::after { content: ','; }
14
+ ${R} dl { display: grid; grid-template-columns: 8rem 1fr; gap: var(--g1) var(--block-gap); }
15
+ ${R} dt { font-size: var(--t-xs); color: var(--ink-3); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; }
16
+ ${R} dd { margin: 0; font-size: var(--t-sm); }
15
17
  @media (max-width: 640px) {
16
- main > article[itemscope] dl { grid-template-columns: 1fr; gap: calc(var(--g1)/2) 0; }
17
- main > article[itemscope] dt { margin-top: var(--g2); }
18
+ ${R} dl { grid-template-columns: 1fr; gap: calc(var(--g1)/2) 0; }
19
+ ${R} dt { margin-top: var(--g2); }
18
20
  }`;
@@ -1,31 +1,32 @@
1
- const S = 'section:has(> article[itemscope]) > article[itemscope]';
2
- export const css = `${S} {
1
+ const R = 'main > section:has(> article[itemscope]) > article[itemscope]';
2
+
3
+ export const css = `${R} {
3
4
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);
4
5
  padding: var(--g3); display: flex; flex-direction: column;
5
6
  box-shadow: var(--shadow); transition: all var(--ease);
6
7
  }
7
- ${S}:hover { transform: translateY(-2px); box-shadow: var(--shadow-up); border-color: var(--line-h); }
8
- ${S} > div[aria-hidden] {
8
+ ${R}:hover { transform: translateY(-2px); box-shadow: var(--shadow-up); border-color: var(--line-h); }
9
+ ${R} > div[aria-hidden] {
9
10
  width: 40px; height: 40px; border-radius: 50%;
10
11
  display: flex; align-items: center; justify-content: center;
11
12
  font-size: var(--t-xs); font-weight: 700; color: var(--white);
12
13
  margin-bottom: var(--g2); background: var(--violet);
13
14
  }
14
- ${S} header { margin-bottom: var(--g1); }
15
- ${S} h2 { font-size: var(--t-sm); font-weight: 600; line-height: 1.3; margin: 0 0 2px; }
16
- ${S} h2 a { color: var(--ink); }
17
- ${S} h2 a:hover { color: var(--violet); }
18
- ${S} header p { font-size: var(--t-xs); color: var(--ink-3); margin: 0; }
19
- ${S} header p:has([itemprop="address"]) { display: inline-flex; align-items: center; gap: 4px; margin-top: 2px; }
20
- ${S} header p:has([itemprop="address"])::before { content: ''; width: 3px; height: 3px; border-radius: 50%; background: var(--ink-3); }
21
- ${S} [itemprop="description"] { font-size: var(--t-xs); line-height: 1.5; margin: var(--g1) 0 0; color: var(--ink-2); }
22
- ${S} ul { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: 4px; margin-top: var(--g1); }
23
- ${S} ul li {
15
+ ${R} header { margin-bottom: var(--g1); }
16
+ ${R} h2 { font-size: var(--t-sm); font-weight: 600; line-height: 1.3; margin: 0 0 2px; }
17
+ ${R} h2 a { color: var(--ink); }
18
+ ${R} h2 a:hover { color: var(--violet); }
19
+ ${R} header p { font-size: var(--t-xs); color: var(--ink-3); margin: 0; }
20
+ ${R} header p:has([itemprop="address"]) { display: inline-flex; align-items: center; gap: 4px; margin-top: 2px; }
21
+ ${R} header p:has([itemprop="address"])::before { content: ''; width: 3px; height: 3px; border-radius: 50%; background: var(--ink-3); }
22
+ ${R} [itemprop="description"] { font-size: var(--t-xs); line-height: 1.5; margin: var(--g1) 0 0; color: var(--ink-2); }
23
+ ${R} ul { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: 4px; margin-top: var(--g1); }
24
+ ${R} ul li {
24
25
  background: var(--violet-s); color: var(--violet);
25
26
  padding: 1px var(--g1); border-radius: var(--pill); font-size: .7rem; font-weight: 500;
26
27
  }
27
- ${S} > a:last-child {
28
+ ${R} > a:last-child {
28
29
  display: inline-flex; margin-top: auto; padding-top: var(--g2);
29
30
  font-size: var(--t-xs); font-weight: 600; color: var(--violet); transition: all var(--ease);
30
31
  }
31
- ${S} > a:last-child:hover { color: var(--ink); }`;
32
+ ${R} > a:last-child:hover { color: var(--ink); }`;
@@ -1,12 +1,14 @@
1
- export const css = `section:has(> dl) > dl {
1
+ const R = 'main > section:has(> dl)';
2
+
3
+ export const css = `${R} > dl {
2
4
  display: flex; justify-content: center; gap: var(--g5); padding: 0;
3
5
  }
4
- section:has(> dl) > dl div { text-align: center; }
5
- section:has(> dl) > dl div > span:has(> svg) {
6
+ ${R} > dl div { text-align: center; }
7
+ ${R} > dl div > span:has(> svg) {
6
8
  display: flex; align-items: center; justify-content: center; width: 36px; height: 36px;
7
9
  margin: 0 auto var(--g1); background: var(--violet-s); border-radius: 50%; color: var(--violet);
8
10
  }
9
- section:has(> dl) > dl div > span:has(> svg) > svg { width: 18px; height: 18px; }
10
- section:has(> dl) > dl dt { font-size: var(--t-lg); font-weight: 800; line-height: 1.2; color: var(--violet); }
11
- section:has(> dl) > dl dd { margin: 2px 0 0; font-size: var(--t-xs); color: var(--ink-3); font-weight: 500; text-transform: uppercase; letter-spacing: .06em; }
12
- @media (max-width: 640px) { section:has(> dl) > dl { gap: var(--g3); } }`;
11
+ ${R} > dl div > span:has(> svg) > svg { width: 18px; height: 18px; }
12
+ ${R} > dl dt { font-size: var(--t-lg); font-weight: 800; line-height: 1.2; color: var(--violet); }
13
+ ${R} > dl dd { margin: 2px 0 0; font-size: var(--t-xs); color: var(--ink-3); font-weight: 500; text-transform: uppercase; letter-spacing: .06em; }
14
+ @media (max-width: 640px) { ${R} > dl { gap: var(--block-gap); } }`;
@@ -1,27 +1,32 @@
1
- export const css = `section:has(> ol) {
2
- margin-inline: calc(50% - 50vw); padding: var(--g5) var(--pad);
3
- background: var(--white); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
1
+ import { BREAKOUT_LIGHT } from './_shared.ts';
2
+
3
+ const R = 'main > section:has(> ol)';
4
+
5
+ export const css = `${R} {
6
+ ${BREAKOUT_LIGHT}
7
+ padding-block: var(--g5);
8
+ border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
4
9
  }
5
- section:has(> ol) h2 { text-align: center; margin-bottom: var(--g4); }
6
- section > ol {
10
+ ${R} > h2 { text-align: center; margin-bottom: var(--g4); }
11
+ ${R} > ol {
7
12
  list-style: none; padding: 0; margin: 0 auto; max-width: var(--container);
8
- display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--g3);
13
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--card-gap);
9
14
  counter-reset: steps;
10
15
  }
11
- section > ol li {
16
+ ${R} > ol > li {
12
17
  counter-increment: steps; background: var(--bg); border: 1px solid var(--line);
13
18
  border-radius: var(--r-lg); padding: var(--g4) var(--g3); text-align: center; transition: all var(--ease);
14
19
  }
15
- section > ol li:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
16
- section > ol li::before {
20
+ ${R} > ol > li:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
21
+ ${R} > ol > li::before {
17
22
  content: counter(steps); display: flex; align-items: center; justify-content: center;
18
23
  width: 40px; height: 40px; margin: 0 auto var(--g2);
19
24
  border-radius: 50%; font-size: var(--t-sm); font-weight: 700;
20
25
  background: var(--violet-s); color: var(--violet);
21
26
  }
22
- section > ol li strong { display: block; font-size: var(--t-sm); margin-bottom: 4px; color: var(--ink); }
23
- section > ol li span { font-size: var(--t-xs); line-height: 1.5; color: var(--ink-3); }
27
+ ${R} > ol > li strong { display: block; font-size: var(--t-sm); margin-bottom: 4px; color: var(--ink); }
28
+ ${R} > ol > li span { font-size: var(--t-xs); line-height: 1.5; color: var(--ink-3); }
24
29
  @media (max-width: 640px) {
25
- section > ol { grid-template-columns: 1fr; }
26
- section:has(> ol) { padding: var(--g4) var(--pad); }
30
+ ${R} > ol { grid-template-columns: 1fr; }
31
+ ${R} { padding-block: var(--g4); }
27
32
  }`;
@@ -12,7 +12,7 @@ export interface LayoutProps {
12
12
  footerContent?: string;
13
13
  }
14
14
 
15
- const THEME_VERSION = '1.0.0';
15
+ const THEME_VERSION = '2.0.0';
16
16
 
17
17
  export function layout(props: LayoutProps, body: string): string {
18
18
  const {