@getvitops/generator 8.3.0-alpha.3 → 8.3.0-alpha.5
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 +75 -0
- package/assets/css/index.css +1 -0
- package/assets/css/layout-utilities.css +13 -0
- package/assets/css/layout.css +23 -0
- package/assets/css/patterns/carousel.css +9 -2
- package/assets/css/patterns/details.css +14 -0
- package/assets/css/patterns/forms.css +14 -1
- package/assets/css/patterns/logos.css +14 -0
- package/assets/css/patterns/masthead.css +201 -0
- package/assets/css/patterns/section.css +10 -0
- package/assets/css/patterns/sitenav.css +111 -0
- package/assets/css/patterns/steps.css +85 -3
- package/assets/css/patterns/subgrid.css +9 -0
- package/assets/css/patterns/tone.css +16 -4
- package/assets/js/elements.js +1 -1
- package/config.schema.json +228 -5
- package/dist/config-BaMpGSUZ.mjs +1856 -0
- package/dist/config-BaMpGSUZ.mjs.map +1 -0
- package/dist/{config-D5xuz8--.mjs → config-Bie2MqRh.mjs} +7 -4
- package/dist/config-Bie2MqRh.mjs.map +1 -0
- package/dist/config-C1p83v26.mjs +1832 -0
- package/dist/config-C1p83v26.mjs.map +1 -0
- package/dist/config.d.mts +270 -7
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +63 -9
- package/dist/index.mjs.map +1 -1
- package/dist/{schema-C-P9dF9F.d.mts → schema-7FhnyZZy.d.mts} +9 -1
- package/dist/schema-7FhnyZZy.d.mts.map +1 -0
- package/dist/{tokens-CaIGQQLk.mjs → tokens-D0DsePUl.mjs} +11 -7
- package/dist/tokens-D0DsePUl.mjs.map +1 -0
- package/dist/{tokens-DH5cpvKd.d.mts → tokens-GQUicLBj.d.mts} +10 -3
- package/dist/tokens-GQUicLBj.d.mts.map +1 -0
- package/dist/tokens.d.mts +1 -1
- package/dist/tokens.mjs +1 -1
- package/package.json +4 -4
- package/schema.json +19 -0
- package/dist/config-D5xuz8--.mjs.map +0 -1
- package/dist/schema-C-P9dF9F.d.mts.map +0 -1
- package/dist/tokens-CaIGQQLk.mjs.map +0 -1
- package/dist/tokens-DH5cpvKd.d.mts.map +0 -1
package/config.schema.json
CHANGED
|
@@ -158,6 +158,11 @@
|
|
|
158
158
|
"dark"
|
|
159
159
|
],
|
|
160
160
|
"description": "Polarity of `text-on-<role>`, the foreground for a filled surface. Default is whichever of near-white / near-black has more contrast on the solid. Set `\"dark\"` so a bright fill carries dark text (or `\"light\"` for the reverse). The build still fails if the forced pair is below APCA Lc 60."
|
|
161
|
+
},
|
|
162
|
+
"acknowledgeContrast": {
|
|
163
|
+
"type": "number",
|
|
164
|
+
"exclusiveMinimum": 0,
|
|
165
|
+
"description": "Acknowledge a near miss on this role: a pairing that falls short of its APCA bar by no more than this many Lc is reported as a build warning instead of failing the build (e.g. `1` for a brand colour that lands at Lc 59.5 against 60). A larger shortfall still fails. Applies to this role only."
|
|
161
166
|
}
|
|
162
167
|
},
|
|
163
168
|
"required": [
|
|
@@ -2095,7 +2100,7 @@
|
|
|
2095
2100
|
"type": "string"
|
|
2096
2101
|
},
|
|
2097
2102
|
"additionalProperties": {
|
|
2098
|
-
"
|
|
2103
|
+
"oneOf": [
|
|
2099
2104
|
{
|
|
2100
2105
|
"type": "object",
|
|
2101
2106
|
"properties": {
|
|
@@ -2178,6 +2183,7 @@
|
|
|
2178
2183
|
"textarea",
|
|
2179
2184
|
"select",
|
|
2180
2185
|
"checkbox",
|
|
2186
|
+
"checkboxes",
|
|
2181
2187
|
"radio",
|
|
2182
2188
|
"date",
|
|
2183
2189
|
"file",
|
|
@@ -2332,6 +2338,160 @@
|
|
|
2332
2338
|
},
|
|
2333
2339
|
"additionalProperties": false
|
|
2334
2340
|
},
|
|
2341
|
+
"chrome": {
|
|
2342
|
+
"description": "Page furniture: the masthead (top bar — position, hide-on-scroll, glass/transparent surface, inset/floating layout, shadow/border) and how its navigation behaves at each width (compact drawer or dropdown, mega tier). Read by `<Masthead />` and `<SiteNav />` via `resolveMasthead()` / `resolveNavOptions()`; a prop overrides a field per layout.",
|
|
2343
|
+
"type": "object",
|
|
2344
|
+
"properties": {
|
|
2345
|
+
"masthead": {
|
|
2346
|
+
"description": "The top bar: position, scroll behaviour, surface, layout, elevation.",
|
|
2347
|
+
"type": "object",
|
|
2348
|
+
"properties": {
|
|
2349
|
+
"position": {
|
|
2350
|
+
"description": "`static` scrolls away; `sticky` stays in flow and pins to the top; `fixed` is out of flow and overlays the first section (for a transparent masthead over a hero). Default `static`.",
|
|
2351
|
+
"type": "string",
|
|
2352
|
+
"enum": [
|
|
2353
|
+
"static",
|
|
2354
|
+
"sticky",
|
|
2355
|
+
"fixed"
|
|
2356
|
+
]
|
|
2357
|
+
},
|
|
2358
|
+
"behavior": {
|
|
2359
|
+
"description": "`hide-on-scroll` slides the masthead away while scrolling down and back on scrolling up. Ignored when `position` is `static`. It never hides while a menu inside it is open or has focus. Uses `scroll-state()`; in a browser without it (Firefox today) the masthead just stays visible. Default `always`.",
|
|
2360
|
+
"type": "string",
|
|
2361
|
+
"enum": [
|
|
2362
|
+
"always",
|
|
2363
|
+
"hide-on-scroll"
|
|
2364
|
+
]
|
|
2365
|
+
},
|
|
2366
|
+
"surface": {
|
|
2367
|
+
"description": "`solid`, `glass` (blurred + tinted via `--surface-glass`), `transparent`, or `transparent-until-scrolled` (clear while the page is at the top, solid once it scrolls; a browser without `scroll-state()` shows it solid throughout). Default `solid`.",
|
|
2368
|
+
"type": "string",
|
|
2369
|
+
"enum": [
|
|
2370
|
+
"solid",
|
|
2371
|
+
"glass",
|
|
2372
|
+
"transparent",
|
|
2373
|
+
"transparent-until-scrolled"
|
|
2374
|
+
]
|
|
2375
|
+
},
|
|
2376
|
+
"tone": {
|
|
2377
|
+
"description": "A `colors.roles` key, optionally `<role>:solid`, applied as the masthead `.tone` so text contrast stays the generator's guarantee.",
|
|
2378
|
+
"type": "string"
|
|
2379
|
+
},
|
|
2380
|
+
"layout": {
|
|
2381
|
+
"description": "`full` is flush to the viewport edges; `inset` leaves a gap to them; `floating` is inset with a panel radius. Default `full`.",
|
|
2382
|
+
"type": "string",
|
|
2383
|
+
"enum": [
|
|
2384
|
+
"full",
|
|
2385
|
+
"inset",
|
|
2386
|
+
"floating"
|
|
2387
|
+
]
|
|
2388
|
+
},
|
|
2389
|
+
"width": {
|
|
2390
|
+
"description": "`content` keeps the masthead row on the page's `.centered` track; `full` lets it span the masthead. Default `content`.",
|
|
2391
|
+
"type": "string",
|
|
2392
|
+
"enum": [
|
|
2393
|
+
"full",
|
|
2394
|
+
"content"
|
|
2395
|
+
]
|
|
2396
|
+
},
|
|
2397
|
+
"elevation": {
|
|
2398
|
+
"description": "Shadow and border.",
|
|
2399
|
+
"type": "object",
|
|
2400
|
+
"properties": {
|
|
2401
|
+
"shadow": {
|
|
2402
|
+
"description": "A `designSystem.shadows` key (e.g. `sm`). Omit for no shadow.",
|
|
2403
|
+
"type": "string"
|
|
2404
|
+
},
|
|
2405
|
+
"border": {
|
|
2406
|
+
"description": "A bottom border (a full outline when `layout` is not `full`).",
|
|
2407
|
+
"type": "boolean"
|
|
2408
|
+
},
|
|
2409
|
+
"onScroll": {
|
|
2410
|
+
"description": "Apply the shadow/border only once the page has scrolled, so the masthead sits flush with the page at the top. Uses `scroll-state()` container queries; in a browser without them (Firefox today) the elevation is simply always on.",
|
|
2411
|
+
"type": "boolean"
|
|
2412
|
+
}
|
|
2413
|
+
},
|
|
2414
|
+
"additionalProperties": false
|
|
2415
|
+
},
|
|
2416
|
+
"height": {
|
|
2417
|
+
"description": "CSS length for the masthead row (default `4rem`). `calc()`, `clamp()`, `min()` and `max()` are accepted, so it can be fluid: `clamp(3.5rem, 8cqi, 4.5rem)`. `cqi` resolves against the nearest size container (`body`, the same one the nav breakpoints use), `vw` against the viewport. Becomes `--masthead-height` and, when the masthead is sticky or fixed, `--header-offset` so in-page anchors land below it.",
|
|
2418
|
+
"type": "string"
|
|
2419
|
+
},
|
|
2420
|
+
"inset": {
|
|
2421
|
+
"description": "Gap between a `layout: inset` or `floating` masthead and the viewport edge (default `0.75rem`). Same length grammar as `height`, e.g. `clamp(0.5rem, 2cqi, 1.5rem)`. Ignored when `layout` is `full`. Becomes `--masthead-inset` and is counted in `--header-offset`.",
|
|
2422
|
+
"type": "string"
|
|
2423
|
+
}
|
|
2424
|
+
},
|
|
2425
|
+
"additionalProperties": false
|
|
2426
|
+
},
|
|
2427
|
+
"nav": {
|
|
2428
|
+
"description": "How the masthead navigation behaves at each width.",
|
|
2429
|
+
"type": "object",
|
|
2430
|
+
"properties": {
|
|
2431
|
+
"breakpoint": {
|
|
2432
|
+
"description": "Container width where the default `primary` menu promotes from the compact control to a navbar. Default `md`.",
|
|
2433
|
+
"type": "string",
|
|
2434
|
+
"enum": [
|
|
2435
|
+
"sm",
|
|
2436
|
+
"md",
|
|
2437
|
+
"lg",
|
|
2438
|
+
"xl"
|
|
2439
|
+
]
|
|
2440
|
+
},
|
|
2441
|
+
"mobileBreakpoint": {
|
|
2442
|
+
"description": "Where a `primary-mobile` menu hands over to `primary`. Default = `breakpoint`.",
|
|
2443
|
+
"type": "string",
|
|
2444
|
+
"enum": [
|
|
2445
|
+
"sm",
|
|
2446
|
+
"md",
|
|
2447
|
+
"lg",
|
|
2448
|
+
"xl"
|
|
2449
|
+
]
|
|
2450
|
+
},
|
|
2451
|
+
"megaBreakpoint": {
|
|
2452
|
+
"description": "Where a `primary-mega` menu takes over. Default `xl`.",
|
|
2453
|
+
"type": "string",
|
|
2454
|
+
"enum": [
|
|
2455
|
+
"sm",
|
|
2456
|
+
"md",
|
|
2457
|
+
"lg",
|
|
2458
|
+
"xl"
|
|
2459
|
+
]
|
|
2460
|
+
},
|
|
2461
|
+
"depth": {
|
|
2462
|
+
"description": "Levels in the default nav (1–3). Default 3.",
|
|
2463
|
+
"type": "integer",
|
|
2464
|
+
"minimum": 1,
|
|
2465
|
+
"maximum": 3
|
|
2466
|
+
},
|
|
2467
|
+
"megaDepth": {
|
|
2468
|
+
"description": "Levels in the mega panel (1–3). Default 3.",
|
|
2469
|
+
"type": "integer",
|
|
2470
|
+
"minimum": 1,
|
|
2471
|
+
"maximum": 3
|
|
2472
|
+
},
|
|
2473
|
+
"compact": {
|
|
2474
|
+
"description": "What the toggle opens below its breakpoint: an edge `drawer`, or a columnar `dropdown` panel anchored under the toggle. Default `drawer`.",
|
|
2475
|
+
"type": "string",
|
|
2476
|
+
"enum": [
|
|
2477
|
+
"drawer",
|
|
2478
|
+
"dropdown"
|
|
2479
|
+
]
|
|
2480
|
+
},
|
|
2481
|
+
"drawerSide": {
|
|
2482
|
+
"description": "Edge the drawer slides from when `compact` is `drawer`. Default `end`.",
|
|
2483
|
+
"type": "string",
|
|
2484
|
+
"enum": [
|
|
2485
|
+
"start",
|
|
2486
|
+
"end"
|
|
2487
|
+
]
|
|
2488
|
+
}
|
|
2489
|
+
},
|
|
2490
|
+
"additionalProperties": false
|
|
2491
|
+
}
|
|
2492
|
+
},
|
|
2493
|
+
"additionalProperties": false
|
|
2494
|
+
},
|
|
2335
2495
|
"seo": {
|
|
2336
2496
|
"description": "SEO defaults: site name, title/description defaults, robots policy, verification tokens, Open Graph + Twitter cards, and post-deploy indexing notification. Read by `<Seo />`, `vitops robots` and `vitops search notify`.",
|
|
2337
2497
|
"type": "object",
|
|
@@ -2708,6 +2868,46 @@
|
|
|
2708
2868
|
"items": {
|
|
2709
2869
|
"type": "string"
|
|
2710
2870
|
}
|
|
2871
|
+
},
|
|
2872
|
+
"phoneNumbers": {
|
|
2873
|
+
"description": "Show a visitor from an ad the tracking number for that platform instead of the real one. Swapped in by the capture script from the landing URL (immediately) or the `_ac` cookie (later pages, once `marketing` is granted); the matching `tel:` links are rewritten too. An organic visitor is never swapped. Needs `enabled: true`.",
|
|
2874
|
+
"type": "object",
|
|
2875
|
+
"properties": {
|
|
2876
|
+
"number": {
|
|
2877
|
+
"type": "string",
|
|
2878
|
+
"description": "The real phone number exactly as the site displays it. Server-rendered HTML always carries this one, so crawlers, structured data and visitors without JavaScript see it."
|
|
2879
|
+
},
|
|
2880
|
+
"sources": {
|
|
2881
|
+
"type": "object",
|
|
2882
|
+
"propertyNames": {
|
|
2883
|
+
"type": "string",
|
|
2884
|
+
"enum": [
|
|
2885
|
+
"google",
|
|
2886
|
+
"meta",
|
|
2887
|
+
"linkedin",
|
|
2888
|
+
"reddit",
|
|
2889
|
+
"tiktok",
|
|
2890
|
+
"microsoft",
|
|
2891
|
+
"pinterest",
|
|
2892
|
+
"snapchat",
|
|
2893
|
+
"default-paid"
|
|
2894
|
+
]
|
|
2895
|
+
},
|
|
2896
|
+
"additionalProperties": {
|
|
2897
|
+
"type": "string"
|
|
2898
|
+
},
|
|
2899
|
+
"description": "Tracking numbers keyed by ad platform (the `site.ads` provider names), each provisioned with a call-tracking provider and forwarding to `number`. `default-paid` is the fallback for a paid visit from a platform with no number of its own. Google needs no entry when `site.ads.google.callTracking` is set — Google supplies its own."
|
|
2900
|
+
},
|
|
2901
|
+
"provider": {
|
|
2902
|
+
"description": "The call-tracking provider (e.g. `twilio`, `callrail`). Informational, but it records callers’ numbers, so it must be named in the privacy policy — declare it in `site.legal.privacyPolicy.processors` unless it is a known one.",
|
|
2903
|
+
"type": "string"
|
|
2904
|
+
}
|
|
2905
|
+
},
|
|
2906
|
+
"required": [
|
|
2907
|
+
"number",
|
|
2908
|
+
"sources"
|
|
2909
|
+
],
|
|
2910
|
+
"additionalProperties": false
|
|
2711
2911
|
}
|
|
2712
2912
|
},
|
|
2713
2913
|
"additionalProperties": false
|
|
@@ -2740,7 +2940,7 @@
|
|
|
2740
2940
|
"type": "string"
|
|
2741
2941
|
},
|
|
2742
2942
|
"conversionLabel": {
|
|
2743
|
-
"description": "Google Ads only: the conversion action label(s) paired with the `AW-…` conversion ID — either one bare label (back-compat, treated as the `call` action) or a map of action → label, so a call, an email click and a form submission each fire their own Google Ads conversion action instead of all three reporting as the same one.",
|
|
2943
|
+
"description": "Google Ads only: the conversion action label(s) paired with the `AW-…` conversion ID — the category (Phone call lead, Contact, …) is a property of the action in Google Ads, not of the tag call, so a wrong category can't be fixed from code; either one bare label (back-compat, treated as the `call` action) or a map of action → label, so a call, an email click and a form submission each fire their own Google Ads conversion action instead of all three reporting as the same one.",
|
|
2744
2944
|
"anyOf": [
|
|
2745
2945
|
{
|
|
2746
2946
|
"type": "string"
|
|
@@ -2749,15 +2949,15 @@
|
|
|
2749
2949
|
"type": "object",
|
|
2750
2950
|
"properties": {
|
|
2751
2951
|
"call": {
|
|
2752
|
-
"description": "Fired on a tel: link click.",
|
|
2952
|
+
"description": "Fired on a tel: link click. Create the action in Google Ads with category \"Phone call lead\".",
|
|
2753
2953
|
"type": "string"
|
|
2754
2954
|
},
|
|
2755
2955
|
"email": {
|
|
2756
|
-
"description": "Fired on a mailto: link click.",
|
|
2956
|
+
"description": "Fired on a mailto: link click. Create the action in Google Ads with category \"Contact\".",
|
|
2757
2957
|
"type": "string"
|
|
2758
2958
|
},
|
|
2759
2959
|
"form": {
|
|
2760
|
-
"description": "Fired client-side by `vitopsFormConversion()` — the consumer's own submit handler calls it once a form POST succeeds.",
|
|
2960
|
+
"description": "Fired client-side by `vitopsFormConversion()` — the consumer's own submit handler calls it once a form POST succeeds. Create the action in Google Ads with category \"Submit lead form\". Don't fire it from a success-page query parameter: that replays on refresh and the honeypot returns the same success page.",
|
|
2761
2961
|
"type": "string"
|
|
2762
2962
|
}
|
|
2763
2963
|
},
|
|
@@ -2791,6 +2991,29 @@
|
|
|
2791
2991
|
}
|
|
2792
2992
|
]
|
|
2793
2993
|
},
|
|
2994
|
+
"callTracking": {
|
|
2995
|
+
"description": "Google Ads only: **website call conversions**. The Google tag fetches a Google forwarding number for visitors who arrived from a Google ad and swaps it in for `number`, so a phone call (not just a `tel:` tap) is attributed to the click. Google decides who sees it; this toolchain also rewrites the matching `tel:` links, which Google does not. Counts the same call as `conversionLabel.call` if both are primary — make one secondary in Google Ads. Any other platform has no equivalent: see `site.tracking.phoneNumbers`.",
|
|
2996
|
+
"type": "object",
|
|
2997
|
+
"properties": {
|
|
2998
|
+
"label": {
|
|
2999
|
+
"type": "string",
|
|
3000
|
+
"description": "The conversion action label of a **separate** Google Ads action of type \"Calls from a phone number on your website\" (not the `conversionLabel.call` action, which counts `tel:` taps). Paired with `pixelId` as `AW-…/<label>`."
|
|
3001
|
+
},
|
|
3002
|
+
"number": {
|
|
3003
|
+
"type": "string",
|
|
3004
|
+
"description": "The phone number exactly as the site displays it, e.g. `613-555-0100`. Google swaps its forwarding number in only where the page text matches these digits, so a differently formatted number on the page is silently never replaced."
|
|
3005
|
+
},
|
|
3006
|
+
"cache": {
|
|
3007
|
+
"description": "Set false to stop Google caching the fetched forwarding number in a cookie (`phone_conversion_options.cache`). Default true, so the number follows the visitor across pages.",
|
|
3008
|
+
"type": "boolean"
|
|
3009
|
+
}
|
|
3010
|
+
},
|
|
3011
|
+
"required": [
|
|
3012
|
+
"label",
|
|
3013
|
+
"number"
|
|
3014
|
+
],
|
|
3015
|
+
"additionalProperties": false
|
|
3016
|
+
},
|
|
2794
3017
|
"reporting": {
|
|
2795
3018
|
"description": "Google Ads only: `\"client\"` (default) fires the conversion via `gtag.js` in the browser at click/submit time; `\"server\"` uploads it via the Ads API from the conversion endpoint instead (see `conversionActionId`). An action with no matching `conversionActionId` keeps firing client-side regardless of this setting, so setting it before `conversionActionId` is filled in never silently drops a conversion.",
|
|
2796
3019
|
"type": "string",
|