@sankhyatronics/sankhya-cms 0.1.18 → 0.3.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/custom-elements.json +11634 -3153
- package/dist/attention-panel/index.js +2 -2
- package/dist/bar-chart/index.js +2 -2
- package/dist/bento-grid/index.d.ts +33 -1
- package/dist/bento-grid/index.js +4 -3
- package/dist/booking/index.d.ts +309 -0
- package/dist/booking/index.js +20 -0
- package/dist/booking/index.js.map +1 -0
- package/dist/card/index.d.ts +3 -4
- package/dist/card/index.js +2 -2
- package/dist/carousel/index.d.ts +20 -6
- package/dist/carousel/index.js +3 -3
- package/dist/chip/index.js +2 -2
- package/dist/{chunk-JQY2G4QK.js → chunk-2GTR37PU.js} +2 -2
- package/dist/chunk-2GTR37PU.js.map +1 -0
- package/dist/{chunk-FLY7TNRT.js → chunk-2HMOX253.js} +128 -25
- package/dist/chunk-2HMOX253.js.map +1 -0
- package/dist/{chunk-DH53HZPB.js → chunk-37KFBKPD.js} +32 -4
- package/dist/chunk-37KFBKPD.js.map +1 -0
- package/dist/{chunk-ALI26WOB.js → chunk-4XPKKYVZ.js} +54 -15
- package/dist/chunk-4XPKKYVZ.js.map +1 -0
- package/dist/chunk-535QAZ6A.js +236 -0
- package/dist/chunk-535QAZ6A.js.map +1 -0
- package/dist/{chunk-AKJQ345O.js → chunk-5AWGZQWU.js} +2 -2
- package/dist/chunk-6OZKZG5J.js +300 -0
- package/dist/chunk-6OZKZG5J.js.map +1 -0
- package/dist/chunk-AYNT7G3J.js +805 -0
- package/dist/chunk-AYNT7G3J.js.map +1 -0
- package/dist/chunk-BEWX3E6P.js +32 -0
- package/dist/chunk-BEWX3E6P.js.map +1 -0
- package/dist/chunk-CZUGPKXV.js +275 -0
- package/dist/chunk-CZUGPKXV.js.map +1 -0
- package/dist/{chunk-LEXZKGQX.js → chunk-DJFWZOZM.js} +107 -11
- package/dist/chunk-DJFWZOZM.js.map +1 -0
- package/dist/chunk-DPANTC3O.js +1714 -0
- package/dist/chunk-DPANTC3O.js.map +1 -0
- package/dist/chunk-EKZFFY45.js +426 -0
- package/dist/chunk-EKZFFY45.js.map +1 -0
- package/dist/chunk-ER7MCPDV.js +7 -0
- package/dist/chunk-ER7MCPDV.js.map +1 -0
- package/dist/chunk-EW2RK5Y6.js +383 -0
- package/dist/chunk-EW2RK5Y6.js.map +1 -0
- package/dist/{chunk-BLQV2YMO.js → chunk-EZOKT7NJ.js} +2 -2
- package/dist/chunk-FF2LWEF3.js +386 -0
- package/dist/chunk-FF2LWEF3.js.map +1 -0
- package/dist/chunk-FOUK3NHR.js +7 -0
- package/dist/chunk-FOUK3NHR.js.map +1 -0
- package/dist/chunk-GB4NGCZI.js +181 -0
- package/dist/chunk-GB4NGCZI.js.map +1 -0
- package/dist/{chunk-7NLZND6Q.js → chunk-GOFSMD6W.js} +35 -11
- package/dist/chunk-GOFSMD6W.js.map +1 -0
- package/dist/{chunk-6D6ROU7X.js → chunk-IGMVF3KK.js} +2 -2
- package/dist/{chunk-INMSEYT6.js → chunk-IVPVYVWG.js} +2 -2
- package/dist/chunk-JURCF4OD.js +381 -0
- package/dist/chunk-JURCF4OD.js.map +1 -0
- package/dist/{chunk-FZ36KL73.js → chunk-KZ7PMFWS.js} +11 -1
- package/dist/chunk-KZ7PMFWS.js.map +1 -0
- package/dist/{chunk-EMCQBT3S.js → chunk-LO6TZBGD.js} +129 -35
- package/dist/chunk-LO6TZBGD.js.map +1 -0
- package/dist/chunk-MFRGAT6D.js +860 -0
- package/dist/chunk-MFRGAT6D.js.map +1 -0
- package/dist/chunk-MIBVQXRU.js +1098 -0
- package/dist/chunk-MIBVQXRU.js.map +1 -0
- package/dist/{chunk-35TX3AOA.js → chunk-NABSRUXG.js} +2 -2
- package/dist/{chunk-R5G6KFTJ.js → chunk-NXKDZWS7.js} +44 -6
- package/dist/chunk-NXKDZWS7.js.map +1 -0
- package/dist/{chunk-KMU6ABQF.js → chunk-NXUS2CH7.js} +14 -1
- package/dist/chunk-NXUS2CH7.js.map +1 -0
- package/dist/{chunk-GJO3RGOB.js → chunk-OCPGOLVF.js} +56 -11
- package/dist/chunk-OCPGOLVF.js.map +1 -0
- package/dist/chunk-OEOE6IFY.js +628 -0
- package/dist/chunk-OEOE6IFY.js.map +1 -0
- package/dist/{chunk-SMLR736E.js → chunk-PV6OCXXN.js} +2 -2
- package/dist/chunk-PV6OCXXN.js.map +1 -0
- package/dist/chunk-Q66CJO3P.js +534 -0
- package/dist/chunk-Q66CJO3P.js.map +1 -0
- package/dist/{chunk-MG2VTZA4.js → chunk-QS3ANOWN.js} +2 -2
- package/dist/{chunk-ZN4LIKVG.js → chunk-QSJ543V2.js} +2 -2
- package/dist/chunk-QSJ543V2.js.map +1 -0
- package/dist/{chunk-FML6AG2V.js → chunk-RANC3OI6.js} +2 -2
- package/dist/chunk-T4BIN37Q.js +32 -0
- package/dist/chunk-T4BIN37Q.js.map +1 -0
- package/dist/{chunk-YVTFQHVY.js → chunk-TEAZZPDQ.js} +2 -2
- package/dist/chunk-TJK55CJ2.js +49 -0
- package/dist/chunk-TJK55CJ2.js.map +1 -0
- package/dist/chunk-UKIVLF7S.js +32 -0
- package/dist/chunk-UKIVLF7S.js.map +1 -0
- package/dist/chunk-V4R7PYP5.js +905 -0
- package/dist/chunk-V4R7PYP5.js.map +1 -0
- package/dist/{chunk-AG2COC64.js → chunk-VVYQ2DDS.js} +2 -2
- package/dist/chunk-WAMOAAMN.js +16 -0
- package/dist/chunk-WAMOAAMN.js.map +1 -0
- package/dist/chunk-WAYHHL4J.js +1234 -0
- package/dist/chunk-WAYHHL4J.js.map +1 -0
- package/dist/{chunk-YQ42EBK5.js → chunk-WH6HE6SY.js} +10 -4
- package/dist/chunk-WH6HE6SY.js.map +1 -0
- package/dist/chunk-XP6DI3VY.js +180 -0
- package/dist/chunk-XP6DI3VY.js.map +1 -0
- package/dist/{chunk-5EBWMPJS.js → chunk-XS6LNTSH.js} +76 -14
- package/dist/chunk-XS6LNTSH.js.map +1 -0
- package/dist/{chunk-WT4OATGP.js → chunk-ZKFCDVB4.js} +16 -7
- package/dist/chunk-ZKFCDVB4.js.map +1 -0
- package/dist/cms-theme.css +29 -0
- package/dist/contact-form/index.d.ts +220 -0
- package/dist/contact-form/index.js +16 -0
- package/dist/contact-form/index.js.map +1 -0
- package/dist/content-block/index.d.ts +39 -4
- package/dist/content-block/index.js +8 -4
- package/dist/cookie-consent/index.d.ts +60 -12
- package/dist/cookie-consent/index.js +3 -2
- package/dist/date-tile/index.js +2 -2
- package/dist/dropdown/index.d.ts +29 -11
- package/dist/dropdown/index.js +4 -2
- package/dist/feature-split/index.d.ts +6 -1
- package/dist/feature-split/index.js +5 -4
- package/dist/features-section/index.d.ts +53 -9
- package/dist/features-section/index.js +6 -5
- package/dist/flow/index.d.ts +35 -0
- package/dist/flow/index.js +9 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/footer/index.d.ts +13 -0
- package/dist/footer/index.js +2 -2
- package/dist/header/index.d.ts +135 -16
- package/dist/header/index.js +3 -2
- package/dist/hero/index.d.ts +92 -8
- package/dist/hero/index.js +6 -3
- package/dist/icon-button/index.d.ts +7 -7
- package/dist/icon-button/index.js +2 -2
- package/dist/index.d.ts +12 -3
- package/dist/index.js +121 -47
- package/dist/items-accordion/index.d.ts +9 -0
- package/dist/items-accordion/index.js +4 -3
- package/dist/kpi-card/index.js +2 -2
- package/dist/markdown/index.d.ts +19 -2
- package/dist/markdown/index.js +3 -2
- package/dist/mega-menu/index.d.ts +95 -7
- package/dist/mega-menu/index.js +7 -2
- package/dist/menu-grid/index.d.ts +2 -3
- package/dist/menu-grid/index.js +2 -2
- package/dist/menu-grid-item/index.d.ts +6 -8
- package/dist/menu-grid-item/index.js +2 -2
- package/dist/menu-item/index.d.ts +11 -7
- package/dist/menu-item/index.js +3 -2
- package/dist/plan-cards/index.d.ts +69 -0
- package/dist/plan-cards/index.js +13 -0
- package/dist/plan-cards/index.js.map +1 -0
- package/dist/product-nav/index.d.ts +127 -0
- package/dist/product-nav/index.js +11 -0
- package/dist/product-nav/index.js.map +1 -0
- package/dist/promo-banner/index.d.ts +42 -4
- package/dist/promo-banner/index.js +6 -3
- package/dist/quote-dialog/index.d.ts +174 -0
- package/dist/quote-dialog/index.js +22 -0
- package/dist/quote-dialog/index.js.map +1 -0
- package/dist/schema/index.d.ts +11 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/screenshot-tour/index.d.ts +54 -0
- package/dist/screenshot-tour/index.js +9 -0
- package/dist/screenshot-tour/index.js.map +1 -0
- package/dist/section/index.d.ts +3 -0
- package/dist/section/index.js +3 -3
- package/dist/segmented-control/index.js +2 -2
- package/dist/select/index.js +2 -2
- package/dist/shared/styles.d.ts +7 -1
- package/dist/shared/styles.js +3 -1
- package/dist/stats/index.js +2 -2
- package/dist/steps/index.d.ts +45 -0
- package/dist/steps/index.js +11 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/tag-strip/index.d.ts +33 -0
- package/dist/tag-strip/index.js +9 -0
- package/dist/tag-strip/index.js.map +1 -0
- package/dist/testimonials/index.d.ts +9 -1
- package/dist/testimonials/index.js +3 -3
- package/dist/tooltip/index.js +2 -2
- package/package.json +38 -2
- package/dist/chunk-5EBWMPJS.js.map +0 -1
- package/dist/chunk-76AVBQUA.js +0 -252
- package/dist/chunk-76AVBQUA.js.map +0 -1
- package/dist/chunk-7NLZND6Q.js.map +0 -1
- package/dist/chunk-ALI26WOB.js.map +0 -1
- package/dist/chunk-BMHMNXIA.js +0 -158
- package/dist/chunk-BMHMNXIA.js.map +0 -1
- package/dist/chunk-DH53HZPB.js.map +0 -1
- package/dist/chunk-EMCQBT3S.js.map +0 -1
- package/dist/chunk-FLY7TNRT.js.map +0 -1
- package/dist/chunk-FZ36KL73.js.map +0 -1
- package/dist/chunk-GJO3RGOB.js.map +0 -1
- package/dist/chunk-J6EO4R73.js +0 -633
- package/dist/chunk-J6EO4R73.js.map +0 -1
- package/dist/chunk-JKBWZLG4.js +0 -348
- package/dist/chunk-JKBWZLG4.js.map +0 -1
- package/dist/chunk-JQY2G4QK.js.map +0 -1
- package/dist/chunk-KMU6ABQF.js.map +0 -1
- package/dist/chunk-LEXZKGQX.js.map +0 -1
- package/dist/chunk-MSSH3HFK.js +0 -205
- package/dist/chunk-MSSH3HFK.js.map +0 -1
- package/dist/chunk-R5G6KFTJ.js.map +0 -1
- package/dist/chunk-SMLR736E.js.map +0 -1
- package/dist/chunk-VWS53WY4.js +0 -157
- package/dist/chunk-VWS53WY4.js.map +0 -1
- package/dist/chunk-WT4OATGP.js.map +0 -1
- package/dist/chunk-XWB4CKDU.js +0 -708
- package/dist/chunk-XWB4CKDU.js.map +0 -1
- package/dist/chunk-YQ42EBK5.js.map +0 -1
- package/dist/chunk-ZN4LIKVG.js.map +0 -1
- /package/dist/{chunk-AKJQ345O.js.map → chunk-5AWGZQWU.js.map} +0 -0
- /package/dist/{chunk-BLQV2YMO.js.map → chunk-EZOKT7NJ.js.map} +0 -0
- /package/dist/{chunk-6D6ROU7X.js.map → chunk-IGMVF3KK.js.map} +0 -0
- /package/dist/{chunk-INMSEYT6.js.map → chunk-IVPVYVWG.js.map} +0 -0
- /package/dist/{chunk-35TX3AOA.js.map → chunk-NABSRUXG.js.map} +0 -0
- /package/dist/{chunk-MG2VTZA4.js.map → chunk-QS3ANOWN.js.map} +0 -0
- /package/dist/{chunk-FML6AG2V.js.map → chunk-RANC3OI6.js.map} +0 -0
- /package/dist/{chunk-YVTFQHVY.js.map → chunk-TEAZZPDQ.js.map} +0 -0
- /package/dist/{chunk-AG2COC64.js.map → chunk-VVYQ2DDS.js.map} +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import * as lit from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
|
|
4
|
+
interface QuoteOption {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
hint?: string;
|
|
8
|
+
/** Short name for the e-mail subject's `{option}` (e.g. "Cloud" for "Cloud (SaaS)"). Defaults to `label`. */
|
|
9
|
+
subjectLabel?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A quote-request dialog: radio cards for the kind of request, then name, e-mail, company, a user
|
|
13
|
+
* count, an optional message and a required consent box. It opens when a window `st-quote-open`
|
|
14
|
+
* event names its `id` (`st-plan-cards` does this on a button click), with that option preselected.
|
|
15
|
+
*
|
|
16
|
+
* It is a native `<dialog>` opened with `showModal()`, so focus is trapped, Esc closes it and the page
|
|
17
|
+
* behind is inert. Closing (Esc, the close button or a click on the backdrop) returns focus to the
|
|
18
|
+
* element that opened it. While open, `<html>` carries `data-st-modal-open` (removed on every close and
|
|
19
|
+
* on disconnect), so other fixed page UI such as `st-cookie-consent` steps aside.
|
|
20
|
+
* Submitting checks the fields, opens a `mailto:` message to `mailto` with
|
|
21
|
+
* every answer in the body, dispatches `quote-submit` and shows `success-title` / `success-text`
|
|
22
|
+
* (`{option}` in the text becomes the chosen option's label). Without `mailto` nothing is opened and
|
|
23
|
+
* the success state still shows. `subject` may use `{option}` (the option's `subjectLabel`, else its
|
|
24
|
+
* label), `{company}` and `{name}`. `mailto-note` is shown under the success text (`{email}` becomes
|
|
25
|
+
* the `mailto` address, as a link) with a button that copies the address, for visitors whose mail
|
|
26
|
+
* app did not open. An empty `consent-label` leaves out the consent box.
|
|
27
|
+
*
|
|
28
|
+
* The element's `id` is the dialog name: set it on the JSON node (`"id": "quote"`), and point
|
|
29
|
+
* `quoteDialog` on a `st-plan-cards` at the same value.
|
|
30
|
+
*
|
|
31
|
+
* @fires quote-submit - Bubbles and is composed. Detail `{ option, name, email, company, count, message, consent }`.
|
|
32
|
+
* @cssprop --st-quote-dialog-backdrop - Colour of the backdrop behind the dialog (default a navy at 55%).
|
|
33
|
+
* @csspart dialog - The native dialog.
|
|
34
|
+
* @csspart form - The request form.
|
|
35
|
+
* @csspart submit - The submit button.
|
|
36
|
+
* @csspart close - The close button.
|
|
37
|
+
*/
|
|
38
|
+
declare class QuoteDialog extends LitElement {
|
|
39
|
+
static styles: lit.CSSResult;
|
|
40
|
+
/** Heading of the dialog (an `<h2>`, named by the dialog). */
|
|
41
|
+
title: string;
|
|
42
|
+
subtitle: string;
|
|
43
|
+
/** The radio cards for the kind of request. */
|
|
44
|
+
options: QuoteOption[];
|
|
45
|
+
optionsLabel: string;
|
|
46
|
+
nameLabel: string;
|
|
47
|
+
namePlaceholder: string;
|
|
48
|
+
emailLabel: string;
|
|
49
|
+
emailPlaceholder: string;
|
|
50
|
+
companyLabel: string;
|
|
51
|
+
companyPlaceholder: string;
|
|
52
|
+
countLabel: string;
|
|
53
|
+
countPlaceholder: string;
|
|
54
|
+
/** Label of the optional message box. "(optional)" is appended. */
|
|
55
|
+
messageLabel: string;
|
|
56
|
+
messagePlaceholder: string;
|
|
57
|
+
consentLabel: string;
|
|
58
|
+
submitLabel: string;
|
|
59
|
+
successTitle: string;
|
|
60
|
+
/** Shown after submitting. `{option}` is replaced with the chosen option's label. */
|
|
61
|
+
successText: string;
|
|
62
|
+
closeLabel: string;
|
|
63
|
+
/** Recipient of the request e-mail. Without it, submitting opens no e-mail. */
|
|
64
|
+
mailto: string;
|
|
65
|
+
/** Subject of the request e-mail. `{option}`, `{company}` and `{name}` are filled in. */
|
|
66
|
+
subject: string;
|
|
67
|
+
/** Shown under the success text when `mailto` is set. `{email}` becomes the address as a link. Empty hides it. */
|
|
68
|
+
mailtoNote: string;
|
|
69
|
+
copyLabel: string;
|
|
70
|
+
copiedLabel: string;
|
|
71
|
+
private selected;
|
|
72
|
+
private copied;
|
|
73
|
+
private submitted;
|
|
74
|
+
private errors;
|
|
75
|
+
private submittedOption;
|
|
76
|
+
private dialogEl?;
|
|
77
|
+
private formEl?;
|
|
78
|
+
private trigger;
|
|
79
|
+
connectedCallback(): void;
|
|
80
|
+
disconnectedCallback(): void;
|
|
81
|
+
/** Opens for `st-quote-open` events aimed at this dialog's `id`. */
|
|
82
|
+
private onOpenRequest;
|
|
83
|
+
/** Renders the reset form first, so every open starts empty, then shows the modal. */
|
|
84
|
+
private open;
|
|
85
|
+
private close;
|
|
86
|
+
/** Runs on every close (Esc, the close button, the backdrop): focus goes back to the opener. */
|
|
87
|
+
private onDialogClose;
|
|
88
|
+
private onBackdropClick;
|
|
89
|
+
private fieldValue;
|
|
90
|
+
private validate;
|
|
91
|
+
private onSubmit;
|
|
92
|
+
private renderField;
|
|
93
|
+
/** One sentence listing every failing field, for the live region ("" when valid). */
|
|
94
|
+
private errorSummary;
|
|
95
|
+
private renderForm;
|
|
96
|
+
private renderConsent;
|
|
97
|
+
private copyAddress;
|
|
98
|
+
/** The mailto note with `{email}` as a link to the address. */
|
|
99
|
+
private renderMailtoNote;
|
|
100
|
+
private renderSuccess;
|
|
101
|
+
render(): lit.TemplateResult<1>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Window-level event that asks a `st-quote-dialog` with the matching `id` to open. */
|
|
105
|
+
declare const QUOTE_OPEN_EVENT = "st-quote-open";
|
|
106
|
+
/** Detail of `st-quote-open`. `trigger` is the element that opened the dialog; focus returns to it on close. */
|
|
107
|
+
interface QuoteOpenEventDetail {
|
|
108
|
+
/** The `id` of the `st-quote-dialog` to open. */
|
|
109
|
+
dialog: string;
|
|
110
|
+
/** Option to preselect (an option `id`, or `unsure`). */
|
|
111
|
+
option?: string;
|
|
112
|
+
trigger?: HTMLElement | null;
|
|
113
|
+
}
|
|
114
|
+
/** Detail of the `quote-submit` event: the chosen option and every field the visitor filled in. */
|
|
115
|
+
interface QuoteSubmitEventDetail {
|
|
116
|
+
option: string;
|
|
117
|
+
name: string;
|
|
118
|
+
email: string;
|
|
119
|
+
company: string;
|
|
120
|
+
count: string;
|
|
121
|
+
message: string;
|
|
122
|
+
consent: boolean;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** One labelled line of a `mailto:` body. */
|
|
126
|
+
interface MailtoField {
|
|
127
|
+
label: string;
|
|
128
|
+
value: string;
|
|
129
|
+
}
|
|
130
|
+
interface MailtoInput {
|
|
131
|
+
/** Recipient address. */
|
|
132
|
+
to: string;
|
|
133
|
+
subject: string;
|
|
134
|
+
/** Written into the body as one `Label: value` line each, in order. */
|
|
135
|
+
fields: MailtoField[];
|
|
136
|
+
/**
|
|
137
|
+
* Longest the percent-encoded body may be (default 1800). Mail apps and browsers cut off long
|
|
138
|
+
* `mailto:` URLs, so the field picked by `truncateField` is shortened with "…" until the body fits.
|
|
139
|
+
*/
|
|
140
|
+
maxBodyLength?: number;
|
|
141
|
+
/** Index of the field to shorten when the body is too long (default: the last field). */
|
|
142
|
+
truncateField?: number;
|
|
143
|
+
}
|
|
144
|
+
declare const DEFAULT_MAILTO_BODY_LIMIT = 1800;
|
|
145
|
+
/**
|
|
146
|
+
* Builds a `mailto:` URL whose body is plain text: one `Label: value` line per field (an empty value
|
|
147
|
+
* is written as `-`). Subject and body are percent-encoded, so line breaks and symbols survive the
|
|
148
|
+
* URL. When the encoded body is longer than `maxBodyLength`, one field (the last, unless
|
|
149
|
+
* `truncateField` says otherwise) is cut short, on a character boundary, and ends in "…".
|
|
150
|
+
*/
|
|
151
|
+
declare function buildMailto({ to, subject, fields, maxBodyLength, truncateField }: MailtoInput): string;
|
|
152
|
+
|
|
153
|
+
/** One labelled line of the request e-mail. */
|
|
154
|
+
type QuoteMailField = MailtoField;
|
|
155
|
+
interface QuoteMailtoInput {
|
|
156
|
+
/** Recipient address. */
|
|
157
|
+
to: string;
|
|
158
|
+
subject: string;
|
|
159
|
+
/** Human label of the chosen option, written into the body. */
|
|
160
|
+
optionLabel: string;
|
|
161
|
+
fields: QuoteMailField[];
|
|
162
|
+
/** Longest the encoded body may be; the last field is shortened with "…" to fit (default 1800). */
|
|
163
|
+
maxBodyLength?: number;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Builds a `mailto:` URL whose body is plain text: the chosen option, then one `Label: value` line
|
|
167
|
+
* per field (see `buildMailto`). Subject and body are percent-encoded, so line breaks and symbols
|
|
168
|
+
* survive the URL. An empty value is written as `-`.
|
|
169
|
+
*/
|
|
170
|
+
declare function buildQuoteMailto({ to, subject, optionLabel, fields, maxBodyLength }: QuoteMailtoInput): string;
|
|
171
|
+
/** Fills `{name}` placeholders in a subject or text line; unknown names are left as they are. */
|
|
172
|
+
declare function fillTemplate(template: string, values: Record<string, string>): string;
|
|
173
|
+
|
|
174
|
+
export { DEFAULT_MAILTO_BODY_LIMIT, type MailtoField, type MailtoInput, QUOTE_OPEN_EVENT, QuoteDialog, type QuoteMailField, type QuoteMailtoInput, type QuoteOpenEventDetail, type QuoteOption, type QuoteSubmitEventDetail, buildMailto, buildQuoteMailto, fillTemplate };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_MAILTO_BODY_LIMIT,
|
|
3
|
+
QuoteDialog,
|
|
4
|
+
buildMailto,
|
|
5
|
+
buildQuoteMailto,
|
|
6
|
+
fillTemplate
|
|
7
|
+
} from "../chunk-AYNT7G3J.js";
|
|
8
|
+
import {
|
|
9
|
+
QUOTE_OPEN_EVENT
|
|
10
|
+
} from "../chunk-FOUK3NHR.js";
|
|
11
|
+
import "../chunk-WAMOAAMN.js";
|
|
12
|
+
import "../chunk-NXUS2CH7.js";
|
|
13
|
+
import "../chunk-EUXUH3YW.js";
|
|
14
|
+
export {
|
|
15
|
+
DEFAULT_MAILTO_BODY_LIMIT,
|
|
16
|
+
QUOTE_OPEN_EVENT,
|
|
17
|
+
QuoteDialog,
|
|
18
|
+
buildMailto,
|
|
19
|
+
buildQuoteMailto,
|
|
20
|
+
fillTemplate
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ interface NodeEnvelope<TNode> {
|
|
|
8
8
|
slot?: string;
|
|
9
9
|
/** Editor-only label, never passed to the component. */
|
|
10
10
|
label?: string;
|
|
11
|
+
/** `false` leaves the node (and its children) out of the rendered page. Omit, or `true`, to show it. Never passed to the component. */
|
|
12
|
+
visible?: boolean;
|
|
11
13
|
children?: TNode[];
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
@@ -38,8 +40,10 @@ declare const componentTags: {
|
|
|
38
40
|
readonly Card: "st-card";
|
|
39
41
|
readonly AttentionPanel: "st-attention-panel";
|
|
40
42
|
readonly BarChart: "st-bar-chart";
|
|
43
|
+
readonly Booking: "st-booking";
|
|
41
44
|
readonly Carousel: "st-carousel";
|
|
42
45
|
readonly Chip: "st-chip";
|
|
46
|
+
readonly ContactForm: "st-contact-form";
|
|
43
47
|
readonly ContentBlock: "st-content-block";
|
|
44
48
|
readonly CookieConsent: "st-cookie-consent";
|
|
45
49
|
readonly DateTile: "st-date-tile";
|
|
@@ -47,6 +51,7 @@ declare const componentTags: {
|
|
|
47
51
|
readonly FeatureItem: "st-feature-item";
|
|
48
52
|
readonly FeatureSplit: "st-feature-split";
|
|
49
53
|
readonly FeaturesSection: "st-features-section";
|
|
54
|
+
readonly Flow: "st-flow";
|
|
50
55
|
readonly Footer: "st-footer";
|
|
51
56
|
readonly Header: "st-header";
|
|
52
57
|
readonly Hero: "st-hero";
|
|
@@ -59,11 +64,17 @@ declare const componentTags: {
|
|
|
59
64
|
readonly MenuGrid: "st-menu-grid";
|
|
60
65
|
readonly MenuGridItem: "st-menu-grid-item";
|
|
61
66
|
readonly MenuItem: "st-menu-item";
|
|
67
|
+
readonly PlanCards: "st-plan-cards";
|
|
68
|
+
readonly ProductNav: "st-product-nav";
|
|
62
69
|
readonly PromoBanner: "st-promo-banner";
|
|
70
|
+
readonly QuoteDialog: "st-quote-dialog";
|
|
71
|
+
readonly ScreenshotTour: "st-screenshot-tour";
|
|
63
72
|
readonly SegmentedControl: "st-segmented-control";
|
|
64
73
|
readonly Section: "st-section";
|
|
65
74
|
readonly Select: "st-select";
|
|
66
75
|
readonly Stats: "st-stats";
|
|
76
|
+
readonly Steps: "st-steps";
|
|
77
|
+
readonly TagStrip: "st-tag-strip";
|
|
67
78
|
readonly Testimonials: "st-testimonials";
|
|
68
79
|
};
|
|
69
80
|
/** Every `type` the base set knows. */
|
package/dist/schema/index.js
CHANGED
|
@@ -19,8 +19,10 @@ var componentTags = {
|
|
|
19
19
|
Card: "st-card",
|
|
20
20
|
AttentionPanel: "st-attention-panel",
|
|
21
21
|
BarChart: "st-bar-chart",
|
|
22
|
+
Booking: "st-booking",
|
|
22
23
|
Carousel: "st-carousel",
|
|
23
24
|
Chip: "st-chip",
|
|
25
|
+
ContactForm: "st-contact-form",
|
|
24
26
|
ContentBlock: "st-content-block",
|
|
25
27
|
CookieConsent: "st-cookie-consent",
|
|
26
28
|
DateTile: "st-date-tile",
|
|
@@ -28,6 +30,7 @@ var componentTags = {
|
|
|
28
30
|
FeatureItem: "st-feature-item",
|
|
29
31
|
FeatureSplit: "st-feature-split",
|
|
30
32
|
FeaturesSection: "st-features-section",
|
|
33
|
+
Flow: "st-flow",
|
|
31
34
|
Footer: "st-footer",
|
|
32
35
|
Header: "st-header",
|
|
33
36
|
Hero: "st-hero",
|
|
@@ -40,11 +43,17 @@ var componentTags = {
|
|
|
40
43
|
MenuGrid: "st-menu-grid",
|
|
41
44
|
MenuGridItem: "st-menu-grid-item",
|
|
42
45
|
MenuItem: "st-menu-item",
|
|
46
|
+
PlanCards: "st-plan-cards",
|
|
47
|
+
ProductNav: "st-product-nav",
|
|
43
48
|
PromoBanner: "st-promo-banner",
|
|
49
|
+
QuoteDialog: "st-quote-dialog",
|
|
50
|
+
ScreenshotTour: "st-screenshot-tour",
|
|
44
51
|
SegmentedControl: "st-segmented-control",
|
|
45
52
|
Section: "st-section",
|
|
46
53
|
Select: "st-select",
|
|
47
54
|
Stats: "st-stats",
|
|
55
|
+
Steps: "st-steps",
|
|
56
|
+
TagStrip: "st-tag-strip",
|
|
48
57
|
Testimonials: "st-testimonials"
|
|
49
58
|
};
|
|
50
59
|
function isBaseComponentType(type) {
|
package/dist/schema/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schema/node.ts","../../src/schema/nodeUtils.ts","../../src/schema/components.ts","../../src/schema/validate.ts"],"sourcesContent":["/** Dependency-free node types, safe to import from the content API layer. */\n\n/** Action reference in JSON, resolved against the `handlers` prop of `DynamicRenderer`. */\nexport type ActionRef = `@action:${string}`;\n\n/** Keys the renderer owns; everything else on a node is passed to the component as a prop. */\nexport interface NodeEnvelope<TNode> {\n id?: string;\n /** Named slot in the parent (e.g. Header: \"utility\"). Omit for the default slot. */\n slot?: string;\n /** Editor-only label, never passed to the component. */\n label?: string;\n children?: TNode[];\n}\n\n/**\n * A node as it appears in JSON: flat, no `data` wrapper.\n * `{ \"type\": \"Hero\", \"id\": \"home-hero\", \"title\": \"...\", \"children\": [...] }`\n */\nexport interface ComponentNode extends NodeEnvelope<ComponentNode> {\n type: string;\n [prop: string]: unknown;\n}\n\n/** A page is a list of nodes. */\nexport type PageContent = ComponentNode[];\n\nexport function isComponentNode(value: unknown): value is ComponentNode {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n typeof (value as { type?: unknown }).type === 'string' &&\n (value as { type: string }).type.trim().length > 0\n );\n}\n","import type { ComponentNode } from './node';\n\n/**\n * Returns a copy of `nodes` where the node with the given `id` has `props` merged in.\n * Use it to inject runtime state (e.g. the selected language) into fetched JSON without mutating it.\n */\nexport function patchNodeById(nodes: ComponentNode[], id: string, props: Record<string, unknown>): ComponentNode[] {\n return nodes.map(node => {\n const patched = node.id === id ? { ...node, ...props } : node;\n return patched.children\n ? { ...patched, children: patchNodeById(patched.children, id, props) }\n : patched;\n });\n}\n","/**\n * The JSON `type` of every base component, and the Lit element that renders it.\n * This is the contract page JSON is written against — renderers (React, or any other binding)\n * map each `type` to their own component for that element.\n */\nexport const componentTags = {\n BentoGrid: 'st-bento-grid',\n Card: 'st-card',\n AttentionPanel: 'st-attention-panel',\n BarChart: 'st-bar-chart',\n Carousel: 'st-carousel',\n Chip: 'st-chip',\n ContentBlock: 'st-content-block',\n CookieConsent: 'st-cookie-consent',\n DateTile: 'st-date-tile',\n Dropdown: 'st-dropdown',\n FeatureItem: 'st-feature-item',\n FeatureSplit: 'st-feature-split',\n FeaturesSection: 'st-features-section',\n Footer: 'st-footer',\n Header: 'st-header',\n Hero: 'st-hero',\n IconButton: 'st-icon-button',\n ItemsAccordion: 'st-items-accordion',\n KpiCard: 'st-kpi-card',\n MegaMenu: 'st-mega-menu',\n MegaMenuColumn: 'st-mega-menu-column',\n MegaMenuFeature: 'st-mega-menu-feature',\n MenuGrid: 'st-menu-grid',\n MenuGridItem: 'st-menu-grid-item',\n MenuItem: 'st-menu-item',\n PromoBanner: 'st-promo-banner',\n SegmentedControl: 'st-segmented-control',\n Section: 'st-section',\n Select: 'st-select',\n Stats: 'st-stats',\n Testimonials: 'st-testimonials'\n} as const;\n\n/** Every `type` the base set knows. */\nexport type ComponentType = keyof typeof componentTags;\n\nexport function isBaseComponentType(type: string): type is ComponentType {\n return Object.hasOwn(componentTags, type);\n}\n","import { isBaseComponentType } from './components';\nimport type { ComponentNode } from './node';\n\n/** Keys from the pre-flat schema; their presence means the JSON still needs `scripts/migrate-json.mjs`. */\nconst LEGACY_KEYS = ['data', 'embeddedView', 'data-position', 'image', 'contentUrl'] as const;\n\n/**\n * Returns the schema violations for a node and its descendants (empty when valid).\n * `isKnownType` defaults to the base component set; pass a wider predicate when a renderer also\n * registers custom components.\n */\nexport function validateNode(node: unknown, where = 'node', isKnownType: (type: string) => boolean = isBaseComponentType): string[] {\n if (typeof node !== 'object' || node === null || Array.isArray(node)) return [`${where}: node must be an object`];\n const n = node as ComponentNode;\n const found: string[] = [];\n if (typeof n.type !== 'string' || !isKnownType(n.type)) found.push(`${where}: unknown type \"${String(n.type)}\"`);\n for (const legacy of LEGACY_KEYS) {\n if (legacy in n) found.push(`${where}: legacy key \"${legacy}\"`);\n }\n if (Array.isArray(n.items) && n.items.some(item => typeof item === 'object' && item !== null && 'type' in item)) {\n found.push(`${where}: \"items\" must hold plain data; nest components under \"children\"`);\n }\n if (n.children !== undefined) {\n if (!Array.isArray(n.children)) found.push(`${where}: children must be an array`);\n else n.children.forEach((child, i) => found.push(...validateNode(child, `${where}.children[${i}]`, isKnownType)));\n }\n return found;\n}\n\n/** Validates a page: a node or a list of nodes. */\nexport function validatePage(page: unknown, isKnownType?: (type: string) => boolean): string[] {\n const nodes = Array.isArray(page) ? page : [page];\n return nodes.flatMap((node, i) => validateNode(node, `[${i}]`, isKnownType));\n}\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../../src/schema/node.ts","../../src/schema/nodeUtils.ts","../../src/schema/components.ts","../../src/schema/validate.ts"],"sourcesContent":["/** Dependency-free node types, safe to import from the content API layer. */\n\n/** Action reference in JSON, resolved against the `handlers` prop of `DynamicRenderer`. */\nexport type ActionRef = `@action:${string}`;\n\n/** Keys the renderer owns; everything else on a node is passed to the component as a prop. */\nexport interface NodeEnvelope<TNode> {\n id?: string;\n /** Named slot in the parent (e.g. Header: \"utility\"). Omit for the default slot. */\n slot?: string;\n /** Editor-only label, never passed to the component. */\n label?: string;\n /** `false` leaves the node (and its children) out of the rendered page. Omit, or `true`, to show it. Never passed to the component. */\n visible?: boolean;\n children?: TNode[];\n}\n\n/**\n * A node as it appears in JSON: flat, no `data` wrapper.\n * `{ \"type\": \"Hero\", \"id\": \"home-hero\", \"title\": \"...\", \"children\": [...] }`\n */\nexport interface ComponentNode extends NodeEnvelope<ComponentNode> {\n type: string;\n [prop: string]: unknown;\n}\n\n/** A page is a list of nodes. */\nexport type PageContent = ComponentNode[];\n\nexport function isComponentNode(value: unknown): value is ComponentNode {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n typeof (value as { type?: unknown }).type === 'string' &&\n (value as { type: string }).type.trim().length > 0\n );\n}\n","import type { ComponentNode } from './node';\n\n/**\n * Returns a copy of `nodes` where the node with the given `id` has `props` merged in.\n * Use it to inject runtime state (e.g. the selected language) into fetched JSON without mutating it.\n */\nexport function patchNodeById(nodes: ComponentNode[], id: string, props: Record<string, unknown>): ComponentNode[] {\n return nodes.map(node => {\n const patched = node.id === id ? { ...node, ...props } : node;\n return patched.children\n ? { ...patched, children: patchNodeById(patched.children, id, props) }\n : patched;\n });\n}\n","/**\n * The JSON `type` of every base component, and the Lit element that renders it.\n * This is the contract page JSON is written against — renderers (React, or any other binding)\n * map each `type` to their own component for that element.\n */\nexport const componentTags = {\n BentoGrid: 'st-bento-grid',\n Card: 'st-card',\n AttentionPanel: 'st-attention-panel',\n BarChart: 'st-bar-chart',\n Booking: 'st-booking',\n Carousel: 'st-carousel',\n Chip: 'st-chip',\n ContactForm: 'st-contact-form',\n ContentBlock: 'st-content-block',\n CookieConsent: 'st-cookie-consent',\n DateTile: 'st-date-tile',\n Dropdown: 'st-dropdown',\n FeatureItem: 'st-feature-item',\n FeatureSplit: 'st-feature-split',\n FeaturesSection: 'st-features-section',\n Flow: 'st-flow',\n Footer: 'st-footer',\n Header: 'st-header',\n Hero: 'st-hero',\n IconButton: 'st-icon-button',\n ItemsAccordion: 'st-items-accordion',\n KpiCard: 'st-kpi-card',\n MegaMenu: 'st-mega-menu',\n MegaMenuColumn: 'st-mega-menu-column',\n MegaMenuFeature: 'st-mega-menu-feature',\n MenuGrid: 'st-menu-grid',\n MenuGridItem: 'st-menu-grid-item',\n MenuItem: 'st-menu-item',\n PlanCards: 'st-plan-cards',\n ProductNav: 'st-product-nav',\n PromoBanner: 'st-promo-banner',\n QuoteDialog: 'st-quote-dialog',\n ScreenshotTour: 'st-screenshot-tour',\n SegmentedControl: 'st-segmented-control',\n Section: 'st-section',\n Select: 'st-select',\n Stats: 'st-stats',\n Steps: 'st-steps',\n TagStrip: 'st-tag-strip',\n Testimonials: 'st-testimonials'\n} as const;\n\n/** Every `type` the base set knows. */\nexport type ComponentType = keyof typeof componentTags;\n\nexport function isBaseComponentType(type: string): type is ComponentType {\n return Object.hasOwn(componentTags, type);\n}\n","import { isBaseComponentType } from './components';\nimport type { ComponentNode } from './node';\n\n/** Keys from the pre-flat schema; their presence means the JSON still needs `scripts/migrate-json.mjs`. */\nconst LEGACY_KEYS = ['data', 'embeddedView', 'data-position', 'image', 'contentUrl'] as const;\n\n/**\n * Returns the schema violations for a node and its descendants (empty when valid).\n * `isKnownType` defaults to the base component set; pass a wider predicate when a renderer also\n * registers custom components.\n */\nexport function validateNode(node: unknown, where = 'node', isKnownType: (type: string) => boolean = isBaseComponentType): string[] {\n if (typeof node !== 'object' || node === null || Array.isArray(node)) return [`${where}: node must be an object`];\n const n = node as ComponentNode;\n const found: string[] = [];\n if (typeof n.type !== 'string' || !isKnownType(n.type)) found.push(`${where}: unknown type \"${String(n.type)}\"`);\n for (const legacy of LEGACY_KEYS) {\n if (legacy in n) found.push(`${where}: legacy key \"${legacy}\"`);\n }\n if (Array.isArray(n.items) && n.items.some(item => typeof item === 'object' && item !== null && 'type' in item)) {\n found.push(`${where}: \"items\" must hold plain data; nest components under \"children\"`);\n }\n if (n.children !== undefined) {\n if (!Array.isArray(n.children)) found.push(`${where}: children must be an array`);\n else n.children.forEach((child, i) => found.push(...validateNode(child, `${where}.children[${i}]`, isKnownType)));\n }\n return found;\n}\n\n/** Validates a page: a node or a list of nodes. */\nexport function validatePage(page: unknown, isKnownType?: (type: string) => boolean): string[] {\n const nodes = Array.isArray(page) ? page : [page];\n return nodes.flatMap((node, i) => validateNode(node, `[${i}]`, isKnownType));\n}\n"],"mappings":";;;AA6BO,SAAS,gBAAgB,OAAwC;AACpE,SACI,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAQ,MAA6B,SAAS,YAC7C,MAA2B,KAAK,KAAK,EAAE,SAAS;AAEzD;;;AC/BO,SAAS,cAAc,OAAwB,IAAY,OAAiD;AAC/G,SAAO,MAAM,IAAI,UAAQ;AACrB,UAAM,UAAU,KAAK,OAAO,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,IAAI;AACzD,WAAO,QAAQ,WACT,EAAE,GAAG,SAAS,UAAU,cAAc,QAAQ,UAAU,IAAI,KAAK,EAAE,IACnE;AAAA,EACV,CAAC;AACL;;;ACRO,IAAM,gBAAgB;AAAA,EACzB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAClB;AAKO,SAAS,oBAAoB,MAAqC;AACrE,SAAO,OAAO,OAAO,eAAe,IAAI;AAC5C;;;ACjDA,IAAM,cAAc,CAAC,QAAQ,gBAAgB,iBAAiB,SAAS,YAAY;AAO5E,SAAS,aAAa,MAAe,QAAQ,QAAQ,cAAyC,qBAA+B;AAChI,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,GAAG,KAAK,0BAA0B;AAChH,QAAM,IAAI;AACV,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,EAAE,SAAS,YAAY,CAAC,YAAY,EAAE,IAAI,EAAG,OAAM,KAAK,GAAG,KAAK,mBAAmB,OAAO,EAAE,IAAI,CAAC,GAAG;AAC/G,aAAW,UAAU,aAAa;AAC9B,QAAI,UAAU,EAAG,OAAM,KAAK,GAAG,KAAK,iBAAiB,MAAM,GAAG;AAAA,EAClE;AACA,MAAI,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,KAAK,UAAQ,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,IAAI,GAAG;AAC7G,UAAM,KAAK,GAAG,KAAK,kEAAkE;AAAA,EACzF;AACA,MAAI,EAAE,aAAa,QAAW;AAC1B,QAAI,CAAC,MAAM,QAAQ,EAAE,QAAQ,EAAG,OAAM,KAAK,GAAG,KAAK,6BAA6B;AAAA,QAC3E,GAAE,SAAS,QAAQ,CAAC,OAAO,MAAM,MAAM,KAAK,GAAG,aAAa,OAAO,GAAG,KAAK,aAAa,CAAC,KAAK,WAAW,CAAC,CAAC;AAAA,EACpH;AACA,SAAO;AACX;AAGO,SAAS,aAAa,MAAe,aAAmD;AAC3F,QAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAChD,SAAO,MAAM,QAAQ,CAAC,MAAM,MAAM,aAAa,MAAM,IAAI,CAAC,KAAK,WAAW,CAAC;AAC/E;","names":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as lit from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
|
|
4
|
+
interface ScreenshotTourItem {
|
|
5
|
+
/** Text on the tab button that selects this screen. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Small uppercase line above the title (e.g. "Step 2"). */
|
|
8
|
+
step?: string;
|
|
9
|
+
/** Heading shown under the screenshot. */
|
|
10
|
+
title: string;
|
|
11
|
+
/** Body text shown under the heading. */
|
|
12
|
+
caption?: string;
|
|
13
|
+
/** Screenshot URL. */
|
|
14
|
+
src: string;
|
|
15
|
+
/** Alternative text for the screenshot. */
|
|
16
|
+
alt: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A product tour: a row of tab buttons, one per screenshot, and below it the selected screenshot
|
|
20
|
+
* in a framed figure with its step, title and caption. Only the selected screen is shown; the
|
|
21
|
+
* others are not rendered in the document flow.
|
|
22
|
+
*
|
|
23
|
+
* Keyboard (on the tab row): Arrow Right/Down moves to the next tab and Arrow Left/Up to the
|
|
24
|
+
* previous one, both wrapping at the ends; Home and End jump to the first and last tab. Each of
|
|
25
|
+
* these moves focus to the tab and selects it. Tab and Shift+Tab move through the tabs as usual.
|
|
26
|
+
* On narrow screens the tab row scrolls sideways (it never scrolls the page vertically).
|
|
27
|
+
*
|
|
28
|
+
* @csspart tabs - The row of tab buttons (`role="group"`).
|
|
29
|
+
* @csspart tab - Each tab button. Selected tabs carry `aria-pressed="true"`.
|
|
30
|
+
* @csspart figure - The `figure` holding the screenshot and its caption.
|
|
31
|
+
* @csspart frame - The bordered frame around the screenshot.
|
|
32
|
+
* @csspart image - The screenshot `img`.
|
|
33
|
+
* @csspart caption - The `figcaption` with the text beside (or below, on narrow screens) the image.
|
|
34
|
+
* @csspart step - The small eyebrow line above the title.
|
|
35
|
+
* @csspart title - The screen's heading.
|
|
36
|
+
* @csspart text - The caption paragraph.
|
|
37
|
+
*/
|
|
38
|
+
declare class ScreenshotTour extends LitElement {
|
|
39
|
+
static styles: lit.CSSResult;
|
|
40
|
+
/** The screens, in tab order. */
|
|
41
|
+
items: ScreenshotTourItem[];
|
|
42
|
+
/** Accessible name for the tab group. */
|
|
43
|
+
label: string;
|
|
44
|
+
/** Index of the selected screen. Clamped to the range of `items`. */
|
|
45
|
+
private active;
|
|
46
|
+
/** The selected index, kept inside the range of `items`. */
|
|
47
|
+
private get current();
|
|
48
|
+
private tabButtons;
|
|
49
|
+
private select;
|
|
50
|
+
private onKeydown;
|
|
51
|
+
render(): lit.TemplateResult<1>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { ScreenshotTour, type ScreenshotTourItem };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/section/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { LitElement } from 'lit';
|
|
|
12
12
|
* @cssprop --st-section-padding-inline - Overrides the left/right padding (not with `width="full"`).
|
|
13
13
|
* @csspart inner - The width-limited content box.
|
|
14
14
|
* @csspart header - The heading block.
|
|
15
|
+
* @csspart content - The wrapper around the slot (the grid when `columns` is 2).
|
|
15
16
|
*/
|
|
16
17
|
declare class Section extends LitElement {
|
|
17
18
|
static styles: lit.CSSResult;
|
|
@@ -26,6 +27,8 @@ declare class Section extends LitElement {
|
|
|
26
27
|
spacingBelow: 'none' | 's' | 'm' | 'l' | 'xl' | 'xxl';
|
|
27
28
|
/** `contained` (default, the page container width), `narrow` (reading width) or `full` (edge to edge). */
|
|
28
29
|
width: 'contained' | 'narrow' | 'full';
|
|
30
|
+
/** Columns for the slotted children: `1` (default, stacked) or `2` (two equal columns, stacked again below 720px). */
|
|
31
|
+
columns: 1 | 2;
|
|
29
32
|
/** Alignment of the heading. */
|
|
30
33
|
textAlignment: 'left' | 'center';
|
|
31
34
|
render(): lit.TemplateResult<1>;
|
package/dist/section/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Section
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-GOFSMD6W.js";
|
|
4
|
+
import "../chunk-KZ7PMFWS.js";
|
|
5
|
+
import "../chunk-NXUS2CH7.js";
|
|
6
6
|
import "../chunk-EUXUH3YW.js";
|
|
7
7
|
export {
|
|
8
8
|
Section
|
package/dist/select/index.js
CHANGED
package/dist/shared/styles.d.ts
CHANGED
|
@@ -23,6 +23,12 @@ declare const truncateStyles: lit.CSSResult;
|
|
|
23
23
|
* font-size, and color are layered on.
|
|
24
24
|
*/
|
|
25
25
|
declare const buttonResetStyles: lit.CSSResult;
|
|
26
|
+
/**
|
|
27
|
+
* The pill CTA shape (`buttonStyle="pill"`): fully rounded, centred label, `min-height` 52px for a
|
|
28
|
+
* main CTA (hero, banner). A component can set `--st-cta-pill-min-height: 44px` for smaller CTAs.
|
|
29
|
+
* Fill, colour, border and padding stay local (they differ between primary and secondary).
|
|
30
|
+
*/
|
|
31
|
+
declare const ctaPillStyles: lit.CSSResult;
|
|
26
32
|
/**
|
|
27
33
|
* The dark-filled primary-action button look (wizard Next/Generate/Run/Save,
|
|
28
34
|
* active toggle buttons, ...). Pair with `ctaButtonDisabledStyles` on the
|
|
@@ -87,4 +93,4 @@ declare const rootFontFamilyStyles: lit.CSSResult;
|
|
|
87
93
|
declare const BREAKPOINT_TABLET = 900;
|
|
88
94
|
declare const BREAKPOINT_MOBILE = 500;
|
|
89
95
|
|
|
90
|
-
export { BREAKPOINT_MOBILE, BREAKPOINT_TABLET, buttonResetStyles, cardShellStyles, controlBaseStyles, ctaButtonDisabledStyles, ctaButtonFillStyles, ctaButtonStyles, dropdownPanelStyles, emptyStateStyles, eyebrowLabelStyles, fontFamilyStyles, itemCaptionStyles, itemNameStyles, resultLinkStyles, resultNameStyles, resultRowStyles, rootFontFamilyStyles, rowDividerStyles, tableShellStyles, truncateStyles };
|
|
96
|
+
export { BREAKPOINT_MOBILE, BREAKPOINT_TABLET, buttonResetStyles, cardShellStyles, controlBaseStyles, ctaButtonDisabledStyles, ctaButtonFillStyles, ctaButtonStyles, ctaPillStyles, dropdownPanelStyles, emptyStateStyles, eyebrowLabelStyles, fontFamilyStyles, itemCaptionStyles, itemNameStyles, resultLinkStyles, resultNameStyles, resultRowStyles, rootFontFamilyStyles, rowDividerStyles, tableShellStyles, truncateStyles };
|
package/dist/shared/styles.js
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
ctaButtonDisabledStyles,
|
|
8
8
|
ctaButtonFillStyles,
|
|
9
9
|
ctaButtonStyles,
|
|
10
|
+
ctaPillStyles,
|
|
10
11
|
dropdownPanelStyles,
|
|
11
12
|
emptyStateStyles,
|
|
12
13
|
eyebrowLabelStyles,
|
|
@@ -20,7 +21,7 @@ import {
|
|
|
20
21
|
rowDividerStyles,
|
|
21
22
|
tableShellStyles,
|
|
22
23
|
truncateStyles
|
|
23
|
-
} from "../chunk-
|
|
24
|
+
} from "../chunk-NXUS2CH7.js";
|
|
24
25
|
import "../chunk-EUXUH3YW.js";
|
|
25
26
|
export {
|
|
26
27
|
BREAKPOINT_MOBILE,
|
|
@@ -31,6 +32,7 @@ export {
|
|
|
31
32
|
ctaButtonDisabledStyles,
|
|
32
33
|
ctaButtonFillStyles,
|
|
33
34
|
ctaButtonStyles,
|
|
35
|
+
ctaPillStyles,
|
|
34
36
|
dropdownPanelStyles,
|
|
35
37
|
emptyStateStyles,
|
|
36
38
|
eyebrowLabelStyles,
|
package/dist/stats/index.js
CHANGED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as lit from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
|
|
4
|
+
interface StepItem {
|
|
5
|
+
title: string;
|
|
6
|
+
/** Plain text, or Markdown when the block has `markdown` set (for inline `code`). */
|
|
7
|
+
description?: string;
|
|
8
|
+
/** Small pill beside the title (e.g. "Included"). On the highlighted last card it turns cyan. */
|
|
9
|
+
badge?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A numbered process: a responsive grid of cards, each with an automatic "01", "02", ... number, a
|
|
13
|
+
* title and a description. `highlightLast` makes the final card a dark navy call-out, the way
|
|
14
|
+
* enterprise pages close a how-it-works sequence. `inverted` puts the whole block on the dark band.
|
|
15
|
+
* `variant="band"` sets the block on a white full-width band with hairline top and bottom borders;
|
|
16
|
+
* the cards sit on a light blue surface and the numbers are large azure.
|
|
17
|
+
*
|
|
18
|
+
* @cssprop --st-steps-padding - Overrides the block's padding.
|
|
19
|
+
* @csspart header - The eyebrow/title/subtitle block.
|
|
20
|
+
* @csspart card - Each step card (an `li`).
|
|
21
|
+
* @csspart number - The step number.
|
|
22
|
+
* @csspart badge - The pill beside a step's title.
|
|
23
|
+
*/
|
|
24
|
+
declare class Steps extends LitElement {
|
|
25
|
+
static styles: lit.CSSResult;
|
|
26
|
+
/** Small uppercase label above the title. */
|
|
27
|
+
eyebrow: string;
|
|
28
|
+
title: string;
|
|
29
|
+
subtitle: string;
|
|
30
|
+
/** The steps, in order. */
|
|
31
|
+
items: StepItem[];
|
|
32
|
+
/** Renders the last step as a dark navy call-out card. */
|
|
33
|
+
highlightLast: boolean;
|
|
34
|
+
/** Puts the block on the dark band (`--st-cms-band-dark-bg`), which stays dark in the dark theme. */
|
|
35
|
+
inverted: boolean;
|
|
36
|
+
/** `default` is the bordered card grid; `band` is a white full-width band with light blue cards. */
|
|
37
|
+
variant: 'default' | 'band';
|
|
38
|
+
/** Renders each step's description as Markdown (inline `code`, links). Off by default: descriptions are plain text. */
|
|
39
|
+
markdown: boolean;
|
|
40
|
+
private renderDescription;
|
|
41
|
+
private renderTitle;
|
|
42
|
+
render(): lit.TemplateResult<1>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { type StepItem, Steps };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as lit from 'lit';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A single bordered band: a small uppercase label on the left and a run of bold items beside it
|
|
6
|
+
* (e.g. "Supported platforms: AWS · Azure · GCP"). Items wrap onto new lines on narrow screens.
|
|
7
|
+
* `inverted` puts the band on the dark band (`--st-cms-band-dark-bg`).
|
|
8
|
+
*
|
|
9
|
+
* @cssprop --st-tag-strip-padding - Overrides the block's padding.
|
|
10
|
+
* @csspart strip - The bordered band.
|
|
11
|
+
* @csspart label - The uppercase label.
|
|
12
|
+
* @csspart items - The list of items.
|
|
13
|
+
* @csspart item - Each item (an `li`).
|
|
14
|
+
*/
|
|
15
|
+
declare class TagStrip extends LitElement {
|
|
16
|
+
static styles: lit.CSSResult;
|
|
17
|
+
/** Small uppercase label at the start of the band. Omit it for items alone. */
|
|
18
|
+
label: string;
|
|
19
|
+
/**
|
|
20
|
+
* The same label as `label`, under a name the page JSON can use: the site renderer drops a node's
|
|
21
|
+
* `label` key (it is the node's own name), so JSON sets `heading`. Shown when `label` is empty.
|
|
22
|
+
*/
|
|
23
|
+
heading: string;
|
|
24
|
+
/** The items, shown in order. */
|
|
25
|
+
items: string[];
|
|
26
|
+
/** Puts the band on the dark band (`--st-cms-band-dark-bg`), which stays dark in the dark theme. */
|
|
27
|
+
inverted: boolean;
|
|
28
|
+
/** `default` is the bordered band; `spread` is a white card with the label left and the items right (`label` shown). */
|
|
29
|
+
variant: 'default' | 'spread';
|
|
30
|
+
render(): lit.TemplateResult<1>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { TagStrip };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -37,7 +37,8 @@ interface TestimonialItem {
|
|
|
37
37
|
* (default) lays the cards out in a grid; `layout="carousel"` puts them on one horizontally
|
|
38
38
|
* scrolling, snapping row with previous/next buttons next to the heading — the customer-story
|
|
39
39
|
* carousel of enterprise marketing pages. `action-label`/`action-href` add a section-level link
|
|
40
|
-
* (e.g. "Explore customer stories").
|
|
40
|
+
* (e.g. "Explore customer stories"). Any item set can use the carousel: `region-label` names it for
|
|
41
|
+
* assistive technology (e.g. "Services") and `role-description` changes its `aria-roledescription`.
|
|
41
42
|
*
|
|
42
43
|
* @fires testimonials-link - Cancelable, before following a story or section link. Detail `{ href }`.
|
|
43
44
|
* @cssprop --st-testimonials-padding - Overrides the section's padding.
|
|
@@ -52,6 +53,13 @@ declare class Testimonials extends LitElement {
|
|
|
52
53
|
layout: 'grid' | 'carousel';
|
|
53
54
|
/** Default text of each card's story link. */
|
|
54
55
|
linkLabel: string;
|
|
56
|
+
/**
|
|
57
|
+
* Accessible name of the carousel's scrolling region. Default: the `title`, or "Stories". Set it to
|
|
58
|
+
* what the items are (e.g. "Services" for a row of service cards).
|
|
59
|
+
*/
|
|
60
|
+
regionLabel: string;
|
|
61
|
+
/** `aria-roledescription` of the carousel's scrolling region. Default: "carousel". */
|
|
62
|
+
roleDescription: string;
|
|
55
63
|
/** Section-level link text, e.g. "Explore customer stories". */
|
|
56
64
|
actionLabel: string;
|
|
57
65
|
actionHref: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Testimonials
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-37KFBKPD.js";
|
|
4
4
|
import "../chunk-WTD2YIAA.js";
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
import "../chunk-KZ7PMFWS.js";
|
|
6
|
+
import "../chunk-NXUS2CH7.js";
|
|
7
7
|
import "../chunk-EUXUH3YW.js";
|
|
8
8
|
export {
|
|
9
9
|
Testimonials
|