@risali/react 0.6.2 → 0.8.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/README.md CHANGED
@@ -141,9 +141,9 @@ export function HomePage({ content }: { content: RisaliContent | null }) {
141
141
 
142
142
  Helpers always validate the block type (a block typed `image` will return `defaultValue` from `getBlockValue`) and `getBlockRichText` always sanitises — including the fallback HTML — so a stored XSS payload can't reach the browser even if the block is missing.
143
143
 
144
- ### Builder pages (v0.6.0)
144
+ ### Builder pages (v0.7.0)
145
145
 
146
- A page with `render_mode='builder'` in the Risali dashboard is a DB-driven list of sections (hero, text + image, features, gallery, CTA, contact, plain). `<RisaliPage>` renders the whole page server-side; pages still in `code` mode return `notFound`, so a catch-all route coexists with your static routes:
146
+ A page with `render_mode='builder'` in the Risali dashboard is a DB-driven list of sections. Built-in section types: `hero`, `text_image`, `features`, `gallery`, `cta`, `contact`, `plain`, plus (v0.7.0) `testimonials`, `pricing`, `faq`, `stats`, `team` and `logo_cloud`. Every section is styled inline from the brand palette (gradients / shadows / radius derived via `color-mix()` from `--risali-color-*`) and is responsive without media queries, so it looks designed even without the host app's Tailwind theme. `<RisaliPage>` renders the whole page server-side; pages still in `code` mode return `notFound`, so a catch-all route coexists with your static routes:
147
147
 
148
148
  ```tsx
149
149
  // app/[[...rest]]/page.tsx
@@ -0,0 +1,13 @@
1
+ export declare const RISALI_FONT_FAMILIES: Record<string, string>;
2
+ /** CSS font stack for a catalog font id, or undefined if not in the catalog. */
3
+ export declare function fontStackForId(id: unknown): string | undefined;
4
+ /**
5
+ * Self-hosted stylesheet URL for a catalog font id. `base` (derived from a
6
+ * brand font's css_url so it follows the real dashboard origin) is used when it
7
+ * looks like a `…/fonts/` URL, else the production default.
8
+ */
9
+ export declare function fontCssUrlForId(id: string, base?: string): string | undefined;
10
+ /** Derive the `…/fonts/` base from a brand font's css_url (e.g.
11
+ * "https://app.risali.app/fonts/inter.css" → "https://app.risali.app/fonts/"). */
12
+ export declare function fontBaseFromCssUrl(cssUrl: unknown): string | undefined;
13
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBvD,CAAC;AASF,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7E;AAED;kFACkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAItE"}
package/dist/fonts.js ADDED
@@ -0,0 +1,57 @@
1
+ // Minimal mirror of the server FONT_CATALOG (src/lib/brand/fonts.ts) — catalog
2
+ // id → family — for per-element font overrides (full editor). The full editor
3
+ // stores a font as a catalog id in style_overrides.font_family; here we turn it
4
+ // into a CSS font stack + the self-hosted stylesheet URL on the platform
5
+ // origin. Kept in sync MANUALLY with the server catalog (curated + stable;
6
+ // adding a family = append here too). An unknown id resolves to undefined, so
7
+ // it simply renders nothing (falls through to the design font).
8
+ export const RISALI_FONT_FAMILIES = {
9
+ inter: "Inter",
10
+ poppins: "Poppins",
11
+ montserrat: "Montserrat",
12
+ "playfair-display": "Playfair Display",
13
+ lora: "Lora",
14
+ merriweather: "Merriweather",
15
+ "dm-sans": "DM Sans",
16
+ "work-sans": "Work Sans",
17
+ raleway: "Raleway",
18
+ nunito: "Nunito",
19
+ "open-sans": "Open Sans",
20
+ "source-sans-3": "Source Sans 3",
21
+ "cormorant-garamond": "Cormorant Garamond",
22
+ "libre-baskerville": "Libre Baskerville",
23
+ roboto: "Roboto",
24
+ karla: "Karla",
25
+ };
26
+ const ID_RE = /^[a-z0-9-]{1,40}$/;
27
+ // Self-hosted brand fonts live centrally on the dashboard origin (PR 40e,
28
+ // served with Access-Control-Allow-Origin:* for cross-origin client sites).
29
+ const DEFAULT_FONT_BASE = "https://app.risali.app/fonts/";
30
+ const SAFE_BASE_RE = /^https:\/\/[^\s"'<>\\]+\/fonts\/$/;
31
+ /** CSS font stack for a catalog font id, or undefined if not in the catalog. */
32
+ export function fontStackForId(id) {
33
+ if (typeof id !== "string" || !ID_RE.test(id))
34
+ return undefined;
35
+ const family = RISALI_FONT_FAMILIES[id];
36
+ return family ? `"${family}", system-ui, sans-serif` : undefined;
37
+ }
38
+ /**
39
+ * Self-hosted stylesheet URL for a catalog font id. `base` (derived from a
40
+ * brand font's css_url so it follows the real dashboard origin) is used when it
41
+ * looks like a `…/fonts/` URL, else the production default.
42
+ */
43
+ export function fontCssUrlForId(id, base) {
44
+ if (!RISALI_FONT_FAMILIES[id])
45
+ return undefined;
46
+ const b = typeof base === "string" && SAFE_BASE_RE.test(base) ? base : DEFAULT_FONT_BASE;
47
+ return `${b}${id}.css`;
48
+ }
49
+ /** Derive the `…/fonts/` base from a brand font's css_url (e.g.
50
+ * "https://app.risali.app/fonts/inter.css" → "https://app.risali.app/fonts/"). */
51
+ export function fontBaseFromCssUrl(cssUrl) {
52
+ if (typeof cssUrl !== "string")
53
+ return undefined;
54
+ const m = cssUrl.match(/^(https:\/\/[^\s"'<>\\]+\/fonts\/)[a-z0-9-]+\.css$/);
55
+ return m ? m[1] : undefined;
56
+ }
57
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,yEAAyE;AACzE,2EAA2E;AAC3E,8EAA8E;AAC9E,gEAAgE;AAEhE,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,kBAAkB,EAAE,kBAAkB;IACtC,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,WAAW;IACxB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,WAAW;IACxB,eAAe,EAAE,eAAe;IAChC,oBAAoB,EAAE,oBAAoB;IAC1C,mBAAmB,EAAE,mBAAmB;IACxC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,KAAK,GAAG,mBAAmB,CAAC;AAElC,0EAA0E;AAC1E,4EAA4E;AAC5E,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAC1D,MAAM,YAAY,GAAG,mCAAmC,CAAC;AAEzD,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,EAAW;IACxC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,0BAA0B,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,IAAa;IACvD,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACzF,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;AACzB,CAAC;AAED;kFACkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC7E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACxD,gEAAgE;IAChE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,+PA0CtD"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACxD,gEAAgE;IAChE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,+PAiEtD"}
package/dist/page.js CHANGED
@@ -14,6 +14,7 @@ import { createElement, Fragment } from "react";
14
14
  import { getRisaliContent } from "./content.js";
15
15
  import { RISALI_SECTION_COMPONENTS, sectionWrapperStyle, } from "./sections/index.js";
16
16
  import { sortByPosition } from "./sections/blocks.js";
17
+ import { fontCssUrlForId, fontBaseFromCssUrl } from "./fonts.js";
17
18
  export async function RisaliPage(props) {
18
19
  const { path, siteSlug, content: providedContent, customSections, notFound } = props;
19
20
  const content = providedContent !== undefined
@@ -25,7 +26,27 @@ export async function RisaliPage(props) {
25
26
  return notFound ?? null;
26
27
  }
27
28
  const sections = sortByPosition(content.sections ?? []);
28
- return createElement(Fragment, null, sections.map((section) => {
29
+ // Per-element fonts (full editor): collect the catalog ids used by any block
30
+ // on THIS page (so cross-page font sets never clash) and emit a stylesheet
31
+ // <link> for each, self-hosted on the platform origin. The base follows the
32
+ // brand fonts' css_url when present (real dashboard origin), else the prod
33
+ // default. The block render itself sets font-family from the same catalog.
34
+ const fonts = content.site?.brand?.fonts;
35
+ const fontBase = fontBaseFromCssUrl(fonts?.heading?.css_url) ??
36
+ fontBaseFromCssUrl(fonts?.body?.css_url);
37
+ const usedFontIds = new Set();
38
+ for (const b of content.blocks) {
39
+ const id = b.style_overrides?.font_family;
40
+ if (typeof id === "string")
41
+ usedFontIds.add(id);
42
+ }
43
+ const fontLinks = [];
44
+ for (const id of usedFontIds) {
45
+ const url = fontCssUrlForId(id, fontBase);
46
+ if (url && !fontLinks.includes(url))
47
+ fontLinks.push(url);
48
+ }
49
+ return createElement(Fragment, null, fontLinks.map((href) => createElement("link", { key: href, rel: "stylesheet", href })), sections.map((section) => {
29
50
  const Component = customSections?.[section.type] ?? RISALI_SECTION_COMPONENTS[section.type];
30
51
  // Unknown type (e.g. a signature section whose component is missing
31
52
  // from this deploy) — skip rather than crash the whole page.
package/dist/page.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,4CAA4C;AAC5C,EAAE;AACF,qDAAqD;AACrD,wDAAwD;AACxD,+DAA+D;AAC/D,MAAM;AACN,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AAGzE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAiBtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAErF,MAAM,OAAO,GACX,eAAe,KAAK,SAAS;QAC3B,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,2EAA2E;YAC3E,0EAA0E;YAC1E,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACxE,OAAO,QAAQ,IAAI,IAAI,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAExD,OAAO,aAAa,CAClB,QAAQ,EACR,IAAI,EACJ,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACvB,MAAM,SAAS,GACb,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5E,oEAAoE;QACpE,6DAA6D;QAC7D,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,MAAM,GAAG,cAAc,CAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CACxD,CAAC;QAEF,OAAO,aAAa,CAClB,SAAS,EACT;YACE,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,qBAAqB,EAAE,OAAO,CAAC,GAAG;YAClC,0BAA0B,EAAE,OAAO,CAAC,IAAI;YACxC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC;SACpC,EACD,aAAa,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAC9C,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,21 @@
1
- import type { ReactNode } from "react";
1
+ import type { CSSProperties, ReactNode } from "react";
2
2
  import type { RisaliBlock } from "../types.js";
3
3
  export declare function safeButtonHref(href: unknown): string | null;
4
4
  /** Sorts builder children by sparse position; blocks without one go last. */
5
5
  export declare function sortByPosition<T extends {
6
6
  position?: number | null;
7
7
  }>(items: readonly T[]): T[];
8
- export declare function renderBlock(block: RisaliBlock): ReactNode;
8
+ /** A text block rendered as a section heading (an <h2>). */
9
+ export declare function isHeadingBlock(block: RisaliBlock): boolean;
10
+ /** Per-call look tweaks a section can apply to a child it lays out. */
11
+ export type RenderBlockOpts = {
12
+ /** Merged under HEADING_STYLE for `text`/heading blocks. */
13
+ headingStyle?: CSSProperties;
14
+ /** Merged under TEXT_STYLE for plain `text` blocks. */
15
+ textStyle?: CSSProperties;
16
+ /** Merged under IMG_STYLE for `image` blocks (e.g. crop-to-fill a tile). */
17
+ imageStyle?: CSSProperties;
18
+ };
19
+ export declare function renderBlock(block: RisaliBlock, opts?: RenderBlockOpts): ReactNode;
9
20
  export declare function renderBlocks(blocks: readonly RisaliBlock[]): ReactNode;
10
21
  //# sourceMappingURL=blocks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/sections/blocks.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAItD,OAAO,KAAK,EAAE,WAAW,EAAuC,MAAM,aAAa,CAAC;AAUpF,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAK3D;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACnE,KAAK,EAAE,SAAS,CAAC,EAAE,GAClB,CAAC,EAAE,CAML;AAmDD,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CA6GzD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAMtE"}
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/sections/blocks.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAItD,OAAO,KAAK,EAAE,WAAW,EAAuC,MAAM,aAAa,CAAC;AAWpF,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAK3D;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACnE,KAAK,EAAE,SAAS,CAAC,EAAE,GAClB,CAAC,EAAE,CAML;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE1D;AAuDD,uEAAuE;AACvE,MAAM,MAAM,eAAe,GAAG;IAC5B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,uDAAuD;IACvD,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,SAAS,CAmHjF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAMtE"}
@@ -1,13 +1,21 @@
1
- // Child-block renderer shared by every builder section (PR 40b).
1
+ // Child-block renderer shared by every builder section (PR 40b; styling L5).
2
2
  //
3
3
  // Deliberately SYNC (plain createElement, no async components) so the tree
4
4
  // returned by an awaited <RisaliPage> can be rendered with
5
5
  // react-dom/server's renderToStaticMarkup in tests. Styles use only inline
6
6
  // CSS + the --risali-* CSS variables emitted by <RisaliBrand> — zero
7
7
  // dependency on the client site's Tailwind setup.
8
+ //
9
+ // renderBlock takes an optional `opts` so a section can tune the look of a
10
+ // child it owns (a hero headline rendered display-size, a stat number, a
11
+ // gallery image cropped to fill a tile) WITHOUT bypassing the single place
12
+ // where data-risali-key markers, href/src whitelisting and user
13
+ // style_overrides are applied. opts is merged UNDER style_overrides, so a
14
+ // client's per-block color / font-size always wins.
8
15
  import { createElement, Fragment } from "react";
9
16
  import { sanitiseRichText } from "../sanitize.js";
10
17
  import { applyStyleOverrides } from "../style.js";
18
+ import { BORDER } from "./tokens.js";
11
19
  const SAFE_SRC_RE = /^(https?:\/\/|\/)/;
12
20
  // Mirror of src/lib/editor/href.ts on the dashboard side — buttons accept
13
21
  // only https://, mailto:, tel: and root-relative paths (never "//", http:,
@@ -28,33 +36,41 @@ export function sortByPosition(items) {
28
36
  return [...items].sort((a, b) => (typeof a.position === "number" ? a.position : Number.MAX_SAFE_INTEGER) -
29
37
  (typeof b.position === "number" ? b.position : Number.MAX_SAFE_INTEGER));
30
38
  }
39
+ /** A text block rendered as a section heading (an <h2>). */
40
+ export function isHeadingBlock(block) {
41
+ return block.type === "text" && block.variant === "heading";
42
+ }
31
43
  const HEADING_STYLE = {
32
44
  fontFamily: "var(--risali-font-heading, inherit)",
33
- fontSize: "2em",
45
+ fontSize: "clamp(1.6rem, 1.1rem + 1.4vw, 2rem)",
34
46
  lineHeight: 1.2,
47
+ letterSpacing: "-0.02em",
48
+ fontWeight: 700,
35
49
  margin: "0 0 0.5em",
36
50
  };
37
51
  const TEXT_STYLE = {
52
+ lineHeight: 1.65,
38
53
  margin: "0 0 1em",
39
54
  };
40
55
  const IMG_STYLE = {
41
56
  maxWidth: "100%",
42
57
  height: "auto",
43
58
  display: "block",
44
- borderRadius: "8px",
59
+ borderRadius: "12px",
45
60
  };
46
61
  const HR_STYLE = {
47
62
  border: "none",
48
- borderTop: "1px solid var(--risali-color-secondary, #e5e7eb)",
63
+ borderTop: `1px solid ${BORDER}`,
49
64
  margin: "1.5em 0",
50
65
  };
51
66
  const BUTTON_BASE_STYLE = {
52
67
  display: "inline-block",
53
- padding: "0.75em 1.5em",
54
- borderRadius: "8px",
68
+ padding: "0.8em 1.6em",
69
+ borderRadius: "10px",
55
70
  textDecoration: "none",
56
71
  fontWeight: 600,
57
72
  cursor: "pointer",
73
+ transition: "opacity 200ms",
58
74
  };
59
75
  function buttonStyle(variant) {
60
76
  if (variant === "secondary") {
@@ -68,10 +84,10 @@ function buttonStyle(variant) {
68
84
  return {
69
85
  ...BUTTON_BASE_STYLE,
70
86
  background: "var(--risali-color-primary, #111827)",
71
- color: "#ffffff",
87
+ color: "var(--risali-on-primary, #ffffff)",
72
88
  };
73
89
  }
74
- export function renderBlock(block) {
90
+ export function renderBlock(block, opts) {
75
91
  const overrides = block.style_overrides;
76
92
  switch (block.type) {
77
93
  case "text": {
@@ -80,13 +96,13 @@ export function renderBlock(block) {
80
96
  return createElement("h2", {
81
97
  key: block.key,
82
98
  "data-risali-key": block.key,
83
- style: applyStyleOverrides(HEADING_STYLE, overrides),
99
+ style: applyStyleOverrides({ ...HEADING_STYLE, ...opts?.headingStyle }, overrides),
84
100
  }, value);
85
101
  }
86
102
  return createElement("p", {
87
103
  key: block.key,
88
104
  "data-risali-key": block.key,
89
- style: applyStyleOverrides(TEXT_STYLE, overrides),
105
+ style: applyStyleOverrides({ ...TEXT_STYLE, ...opts?.textStyle }, overrides),
90
106
  }, value);
91
107
  }
92
108
  case "rich_text": {
@@ -114,7 +130,7 @@ export function renderBlock(block) {
114
130
  src,
115
131
  alt: typeof value.alt === "string" ? value.alt : "",
116
132
  loading: "lazy",
117
- style: IMG_STYLE,
133
+ style: { ...IMG_STYLE, ...opts?.imageStyle },
118
134
  });
119
135
  }
120
136
  case "button": {
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/sections/blocks.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/sections/blocks.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sections/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,+CAA+C;IAC/C,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,SAAS,CAAC;AAoH9E,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAQ5E,CAAC;AAYF,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAWzE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sections/index.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AActD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkC9D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,+CAA+C;IAC/C,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,SAAS,CAAC;AAmiB9E,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAc5E,CAAC;AAgBF,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAqCzE"}
@@ -1,77 +1,358 @@
1
- // Builder section catalog v1 (PR 40b) — render side of
2
- // src/lib/sections/catalog.ts in the dashboard repo (gallery/defaults).
3
- // Keep the `type` keys of the two in sync.
1
+ // Builder section catalog v2 (PR 40b; styling + catalog expansion L5) — the
2
+ // render side of src/lib/sections/catalog.ts in the dashboard repo
3
+ // (gallery/defaults). Keep the `type` keys of the two in sync: a type present
4
+ // in one but not the other renders nothing / has no card.
4
5
  //
5
6
  // Every component is SYNC and content-driven: it lays out the ordered child
6
- // blocks it receives, nothing more. Signature sections a client repo ships
7
- // in code are passed to <RisaliPage customSections={{...}}> and take
8
- // precedence over this registry on a type-key collision.
7
+ // blocks it receives, nothing more. Signature sections a client repo ships in
8
+ // code are passed to <RisaliPage customSections={{...}}> and take precedence
9
+ // over this registry on a type-key collision.
10
+ //
11
+ // Styling is INLINE (see ./tokens.ts for why) + brand-derived, and responsive
12
+ // without media queries via responsiveGrid(). Decorative icons come from
13
+ // lucide-react (fixed per section type, or cycled by index where a per-item
14
+ // icon would otherwise need a data-model change).
9
15
  import { createElement } from "react";
10
- import { renderBlock, renderBlocks, sortByPosition } from "./blocks.js";
11
- const CONTAINER_STYLE = {
12
- maxWidth: "1100px",
13
- margin: "0 auto",
14
- };
15
- function gridStyle(columns) {
16
- const n = typeof columns === "number" && [2, 3, 4].includes(columns) ? columns : 3;
17
- return {
18
- display: "grid",
19
- gridTemplateColumns: `repeat(${n}, minmax(0, 1fr))`,
20
- gap: "24px",
21
- };
16
+ import { Gem, Heart, Quote, Rocket, ShieldCheck, Sparkles, Star, TrendingUp, Users, Zap, } from "lucide-react";
17
+ import { safeColorAlpha } from "../style.js";
18
+ import { isHeadingBlock, renderBlock, renderBlocks, sortByPosition, } from "./blocks.js";
19
+ import { BORDER, buttonRowStyle, cardStyle, CONTAINER_STYLE, C_PRIMARY, DISPLAY_HEADING_STYLE, FAQ_QUESTION_STYLE, LEAD_TEXT_STYLE, MUTED_FG, PRIMARY_CHIP_BG, PRIMARY_SOFT, RADIUS, RADIUS_FULL, RADIUS_XL, responsiveGrid, SECTION_TITLE_STYLE, SHADOW_CARD, STAT_LABEL_STYLE, STAT_NUMBER_STYLE, SURFACE_CARD, TEAM_NAME_STYLE, TEAM_ROLE_STYLE, TITLE_WRAP_STYLE, } from "./tokens.js";
20
+ // Fixed cycle for feature cards: distinct, friendly, brand-tintable icons. A
21
+ // per-feature icon would need a block-level data field — out of scope for L5,
22
+ // so we deterministically cycle (looks intentional, no model change).
23
+ const FEATURE_ICONS = [
24
+ Sparkles,
25
+ Zap,
26
+ ShieldCheck,
27
+ Heart,
28
+ Rocket,
29
+ Gem,
30
+ ];
31
+ const STAT_ICONS = [
32
+ TrendingUp,
33
+ Users,
34
+ Star,
35
+ Sparkles,
36
+ Heart,
37
+ ShieldCheck,
38
+ ];
39
+ function cycle(list, i) {
40
+ return list[i % list.length] ?? Sparkles;
41
+ }
42
+ /** Brand-tinted rounded chip holding an icon (feature cards). */
43
+ function iconChip(Icon) {
44
+ return createElement("div", {
45
+ key: "chip",
46
+ "aria-hidden": "true",
47
+ style: {
48
+ display: "inline-flex",
49
+ alignItems: "center",
50
+ justifyContent: "center",
51
+ width: "48px",
52
+ height: "48px",
53
+ borderRadius: RADIUS,
54
+ background: PRIMARY_CHIP_BG,
55
+ color: C_PRIMARY,
56
+ marginBottom: "16px",
57
+ },
58
+ }, createElement(Icon, { size: 24, strokeWidth: 1.75 }));
59
+ }
60
+ /** Centered title block above a grid (only when a leading heading exists). */
61
+ function titleBlock(heading) {
62
+ if (!heading)
63
+ return null;
64
+ return createElement("div", { key: "title", style: TITLE_WRAP_STYLE }, renderBlock(heading, { headingStyle: { ...SECTION_TITLE_STYLE, margin: 0 } }));
65
+ }
66
+ /** Splits children into a leading heading (section title) and the rest. */
67
+ function splitLeadingHeading(blocks) {
68
+ const sorted = sortByPosition(blocks);
69
+ const first = sorted[0];
70
+ if (first && isHeadingBlock(first)) {
71
+ return { heading: first, rest: sorted.slice(1) };
72
+ }
73
+ return { heading: null, rest: sorted };
74
+ }
75
+ /**
76
+ * Groups flat children into an optional section title + heading-led groups —
77
+ * the backbone of stats / faq / team, which need (label, value) or
78
+ * (question, answer) pairs without a nested data model.
79
+ *
80
+ * Rule: a LEADING heading is the section title ONLY when it stands alone (the
81
+ * next block is also a heading, or there is none). Otherwise every heading
82
+ * opens a group and the following non-heading blocks are its body. This stays
83
+ * sensible if the client deletes the title — the first value heading is not
84
+ * mistaken for a title because it is immediately followed by its body.
85
+ */
86
+ function groupByHeading(blocks) {
87
+ const sorted = sortByPosition(blocks);
88
+ let title = null;
89
+ let start = 0;
90
+ const first = sorted[0];
91
+ const second = sorted[1];
92
+ if (first && isHeadingBlock(first) && (!second || isHeadingBlock(second))) {
93
+ title = first;
94
+ start = 1;
95
+ }
96
+ const groups = [];
97
+ let current = null;
98
+ for (let i = start; i < sorted.length; i++) {
99
+ const b = sorted[i];
100
+ if (!b)
101
+ continue;
102
+ if (isHeadingBlock(b)) {
103
+ current = { head: b, body: [] };
104
+ groups.push(current);
105
+ }
106
+ else {
107
+ if (!current) {
108
+ current = { head: null, body: [] };
109
+ groups.push(current);
110
+ }
111
+ current.body.push(b);
112
+ }
113
+ }
114
+ return { title, groups };
22
115
  }
116
+ // ---------------- sections ----------------
23
117
  function HeroSection({ section, blocks }) {
24
118
  const centered = section.variant !== "left";
119
+ const sorted = sortByPosition(blocks);
120
+ const buttons = sorted.filter((b) => b.type === "button");
121
+ const rest = sorted.filter((b) => b.type !== "button");
122
+ let headingDone = false;
123
+ const restOut = rest.map((b) => {
124
+ if (!headingDone && isHeadingBlock(b)) {
125
+ headingDone = true;
126
+ return renderBlock(b, { headingStyle: DISPLAY_HEADING_STYLE });
127
+ }
128
+ if (b.type === "text") {
129
+ return renderBlock(b, {
130
+ textStyle: {
131
+ ...LEAD_TEXT_STYLE,
132
+ ...(centered ? { marginLeft: "auto", marginRight: "auto" } : {}),
133
+ maxWidth: "620px",
134
+ },
135
+ });
136
+ }
137
+ return renderBlock(b);
138
+ });
25
139
  return createElement("div", {
26
140
  style: {
27
141
  ...CONTAINER_STYLE,
142
+ maxWidth: "900px",
28
143
  textAlign: centered ? "center" : "left",
29
144
  },
30
- }, renderBlocks(blocks));
145
+ }, createElement("div", { key: "body" }, restOut), buttons.length
146
+ ? createElement("div", { key: "btns", style: buttonRowStyle(centered) }, buttons.map((b) => renderBlock(b)))
147
+ : null);
31
148
  }
32
149
  function TextImageSection({ section, blocks }) {
150
+ // Two-column layout: all images go in one column, everything else in the
151
+ // other — so for a section that mixes images with text, the rendered order
152
+ // follows the column layout, not strict block position (by design).
33
153
  const sorted = sortByPosition(blocks);
34
154
  const images = sorted.filter((b) => b.type === "image");
35
155
  const rest = sorted.filter((b) => b.type !== "image");
36
156
  const imageLeft = section.settings?.image_side === "left";
37
- const textCol = createElement("div", { key: "text" }, rest.map((b) => renderBlock(b)));
38
- const imageCol = createElement("div", { key: "image" }, images.map((b) => renderBlock(b)));
157
+ let headingDone = false;
158
+ const textCol = createElement("div", { key: "text" }, rest.map((b) => {
159
+ if (!headingDone && isHeadingBlock(b)) {
160
+ headingDone = true;
161
+ return renderBlock(b, { headingStyle: SECTION_TITLE_STYLE });
162
+ }
163
+ return renderBlock(b);
164
+ }));
165
+ const imageCol = createElement("div", {
166
+ key: "image",
167
+ style: {
168
+ borderRadius: RADIUS_XL,
169
+ overflow: "hidden",
170
+ boxShadow: SHADOW_CARD,
171
+ },
172
+ }, images.map((b) => renderBlock(b, { imageStyle: { width: "100%", borderRadius: 0 } })));
39
173
  return createElement("div", {
40
174
  style: {
41
175
  ...CONTAINER_STYLE,
42
176
  display: "grid",
43
- gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
177
+ gridTemplateColumns: "repeat(auto-fit, minmax(min(100%, 320px), 1fr))",
44
178
  gap: "48px",
45
179
  alignItems: "center",
46
180
  },
47
181
  }, imageLeft ? [imageCol, textCol] : [textCol, imageCol]);
48
182
  }
49
- // Flow model v1: the first heading spans the full width, every following
50
- // block is one grid cell. Grouped feature items (icon+title+text as a unit)
51
- // are a planned follow-up.
52
183
  function FeaturesSection({ section, blocks }) {
53
- const sorted = sortByPosition(blocks);
54
- const [first, ...rest] = sorted;
55
- const headingFirst = first && first.type === "text" && first.variant === "heading";
56
- const headOut = headingFirst ? renderBlock(first) : null;
57
- const cells = (headingFirst ? rest : sorted).map((b) => createElement("div", { key: b.key }, renderBlock(b)));
58
- return createElement("div", { style: CONTAINER_STYLE }, headOut, createElement("div", { style: gridStyle(section.settings?.columns) }, cells));
184
+ const { heading, rest } = splitLeadingHeading(blocks);
185
+ const cells = rest.map((b, i) => createElement("div", { key: b.key, style: cardStyle() }, iconChip(cycle(FEATURE_ICONS, i)), renderBlock(b)));
186
+ return createElement("div", { style: CONTAINER_STYLE }, titleBlock(heading), createElement("div", { style: responsiveGrid(section.settings?.columns) }, cells));
59
187
  }
60
188
  function GallerySection({ section, blocks }) {
61
- const sorted = sortByPosition(blocks);
62
- const images = sorted.filter((b) => b.type === "image");
63
- const rest = sorted.filter((b) => b.type !== "image");
64
- return createElement("div", { style: CONTAINER_STYLE }, rest.map((b) => renderBlock(b)), createElement("div", { style: gridStyle(section.settings?.columns) }, images.map((b) => createElement("div", { key: b.key }, renderBlock(b)))));
189
+ // Non-image children render above the image grid (markers preserved); the
190
+ // grid then collects the images. Mixed-type order follows this layout, not
191
+ // strict block position (by design).
192
+ const { heading, rest } = splitLeadingHeading(blocks);
193
+ const images = rest.filter((b) => b.type === "image");
194
+ const other = rest.filter((b) => b.type !== "image");
195
+ const tiles = images.map((b) => createElement("div", {
196
+ key: b.key,
197
+ style: {
198
+ aspectRatio: "4 / 3",
199
+ overflow: "hidden",
200
+ borderRadius: RADIUS,
201
+ boxShadow: SHADOW_CARD,
202
+ },
203
+ }, renderBlock(b, {
204
+ imageStyle: {
205
+ width: "100%",
206
+ height: "100%",
207
+ objectFit: "cover",
208
+ borderRadius: 0,
209
+ },
210
+ })));
211
+ return createElement("div", { style: CONTAINER_STYLE }, titleBlock(heading), other.map((b) => renderBlock(b)), createElement("div", { style: responsiveGrid(section.settings?.columns, "16px") }, tiles));
65
212
  }
66
213
  function CtaSection({ blocks }) {
67
- return createElement("div", { style: { ...CONTAINER_STYLE, textAlign: "center" } }, renderBlocks(blocks));
214
+ const sorted = sortByPosition(blocks);
215
+ const buttons = sorted.filter((b) => b.type === "button");
216
+ const rest = sorted.filter((b) => b.type !== "button");
217
+ let headingDone = false;
218
+ const restOut = rest.map((b) => {
219
+ if (!headingDone && isHeadingBlock(b)) {
220
+ headingDone = true;
221
+ return renderBlock(b, {
222
+ headingStyle: { ...SECTION_TITLE_STYLE, margin: "0 0 0.3em" },
223
+ });
224
+ }
225
+ return renderBlock(b);
226
+ });
227
+ return createElement("div", { style: CONTAINER_STYLE }, createElement("div", {
228
+ style: {
229
+ background: PRIMARY_SOFT,
230
+ border: `1px solid ${BORDER}`,
231
+ borderRadius: RADIUS_XL,
232
+ padding: "56px 32px",
233
+ textAlign: "center",
234
+ },
235
+ }, createElement("div", { key: "body" }, restOut), buttons.length
236
+ ? createElement("div", { key: "btns", style: buttonRowStyle(true) }, buttons.map((b) => renderBlock(b)))
237
+ : null));
68
238
  }
69
239
  function ContactSection({ blocks }) {
70
- return createElement("div", { style: { ...CONTAINER_STYLE, maxWidth: "720px" } }, renderBlocks(blocks));
240
+ return createElement("div", { style: { ...CONTAINER_STYLE, maxWidth: "720px" } }, createElement("div", { style: cardStyle({ padding: "36px" }) }, renderBlocks(blocks)));
71
241
  }
72
242
  function PlainSection({ blocks }) {
73
243
  return createElement("div", { style: CONTAINER_STYLE }, renderBlocks(blocks));
74
244
  }
245
+ function TestimonialsSection({ section, blocks }) {
246
+ const { heading, rest } = splitLeadingHeading(blocks);
247
+ const cells = rest.map((b) => createElement("div", {
248
+ key: b.key,
249
+ style: cardStyle({ display: "flex", flexDirection: "column", gap: "12px" }),
250
+ }, createElement("div", { key: "q", "aria-hidden": "true", style: { color: C_PRIMARY, opacity: 0.85 } }, createElement(Quote, { size: 30, strokeWidth: 1.5 })), renderBlock(b)));
251
+ return createElement("div", { style: CONTAINER_STYLE }, titleBlock(heading), createElement("div", { style: responsiveGrid(section.settings?.columns) }, cells));
252
+ }
253
+ function PricingSection({ section, blocks }) {
254
+ const { heading, rest } = splitLeadingHeading(blocks);
255
+ // Highlight the middle plan when there are 3+ (the common "recommended" tier).
256
+ const featuredIdx = rest.length >= 3 ? Math.floor(rest.length / 2) : -1;
257
+ const cells = rest.map((b, i) => createElement("div", {
258
+ key: b.key,
259
+ style: cardStyle(i === featuredIdx
260
+ ? { border: `2px solid ${C_PRIMARY}`, boxShadow: SHADOW_CARD }
261
+ : {}),
262
+ }, renderBlock(b)));
263
+ return createElement("div", { style: CONTAINER_STYLE }, titleBlock(heading), createElement("div", { style: responsiveGrid(section.settings?.columns) }, cells));
264
+ }
265
+ function FaqSection({ blocks }) {
266
+ const { title, groups } = groupByHeading(blocks);
267
+ const items = groups.map((g, i) => createElement("div", {
268
+ key: g.head?.key ?? `faq-${i}`,
269
+ style: {
270
+ background: SURFACE_CARD,
271
+ border: `1px solid ${BORDER}`,
272
+ borderRadius: RADIUS,
273
+ padding: "20px 24px",
274
+ },
275
+ }, g.head ? renderBlock(g.head, { headingStyle: FAQ_QUESTION_STYLE }) : null, ...g.body.map((b) => renderBlock(b))));
276
+ return createElement("div", { style: { ...CONTAINER_STYLE, maxWidth: "760px" } }, titleBlock(title), createElement("div", { style: { display: "flex", flexDirection: "column", gap: "12px" } }, items));
277
+ }
278
+ function StatsSection({ section, blocks }) {
279
+ const { title, groups } = groupByHeading(blocks);
280
+ const cells = groups.map((g, i) => createElement("div", { key: g.head?.key ?? `stat-${i}`, style: { textAlign: "center" } }, createElement("div", {
281
+ key: "icon",
282
+ "aria-hidden": "true",
283
+ style: { color: C_PRIMARY, marginBottom: "8px" },
284
+ }, createElement(cycle(STAT_ICONS, i), { size: 22, strokeWidth: 1.75 })), g.head ? renderBlock(g.head, { headingStyle: STAT_NUMBER_STYLE }) : null, ...g.body.map((b) => renderBlock(b, { textStyle: STAT_LABEL_STYLE }))));
285
+ return createElement("div", { style: CONTAINER_STYLE }, titleBlock(title), createElement("div", { style: responsiveGrid(section.settings?.columns, "32px") }, cells));
286
+ }
287
+ function TeamSection({ section, blocks }) {
288
+ const { title, groups } = groupByHeading(blocks);
289
+ const cells = groups.map((g, i) => {
290
+ const images = g.body.filter((b) => b.type === "image");
291
+ const texts = g.body.filter((b) => b.type !== "image");
292
+ return createElement("div", {
293
+ key: g.head?.key ?? `team-${i}`,
294
+ style: cardStyle({ textAlign: "center", padding: "24px" }),
295
+ }, images.map((b) => createElement("div", {
296
+ key: b.key,
297
+ style: {
298
+ width: "96px",
299
+ height: "96px",
300
+ borderRadius: RADIUS_FULL,
301
+ overflow: "hidden",
302
+ margin: "0 auto 16px",
303
+ border: `1px solid ${BORDER}`,
304
+ },
305
+ }, renderBlock(b, {
306
+ imageStyle: {
307
+ width: "100%",
308
+ height: "100%",
309
+ objectFit: "cover",
310
+ borderRadius: 0,
311
+ },
312
+ }))), g.head ? renderBlock(g.head, { headingStyle: TEAM_NAME_STYLE }) : null, ...texts.map((b) => renderBlock(b, { textStyle: TEAM_ROLE_STYLE })));
313
+ });
314
+ return createElement("div", { style: CONTAINER_STYLE }, titleBlock(title), createElement("div", { style: responsiveGrid(section.settings?.columns) }, cells));
315
+ }
316
+ function LogoCloudSection({ blocks }) {
317
+ const { heading, rest } = splitLeadingHeading(blocks);
318
+ const images = rest.filter((b) => b.type === "image");
319
+ // Any non-image child (a caption, divider, …) still renders below the heading
320
+ // so its data-risali-key marker is never lost — every section preserves all
321
+ // children; the logos row only collects the images.
322
+ const other = rest.filter((b) => b.type !== "image");
323
+ const logos = images.map((b) => createElement("div", { key: b.key, style: { display: "flex", alignItems: "center" } }, renderBlock(b, {
324
+ imageStyle: {
325
+ maxHeight: "44px",
326
+ width: "auto",
327
+ objectFit: "contain",
328
+ borderRadius: 0,
329
+ filter: "grayscale(1)",
330
+ opacity: 0.7,
331
+ },
332
+ })));
333
+ return createElement("div", { style: CONTAINER_STYLE }, heading
334
+ ? createElement("div", { key: "title", style: { textAlign: "center", marginBottom: "28px" } }, renderBlock(heading, {
335
+ headingStyle: {
336
+ fontSize: "0.8rem",
337
+ fontWeight: 600,
338
+ textTransform: "uppercase",
339
+ letterSpacing: "0.12em",
340
+ color: MUTED_FG,
341
+ margin: 0,
342
+ },
343
+ }))
344
+ : null, other.length
345
+ ? createElement("div", { key: "other", style: { textAlign: "center", marginBottom: "20px" } }, other.map((b) => renderBlock(b)))
346
+ : null, createElement("div", {
347
+ style: {
348
+ display: "flex",
349
+ flexWrap: "wrap",
350
+ alignItems: "center",
351
+ justifyContent: "center",
352
+ gap: "40px",
353
+ },
354
+ }, logos));
355
+ }
75
356
  export const RISALI_SECTION_COMPONENTS = {
76
357
  hero: HeroSection,
77
358
  text_image: TextImageSection,
@@ -80,10 +361,20 @@ export const RISALI_SECTION_COMPONENTS = {
80
361
  cta: CtaSection,
81
362
  contact: ContactSection,
82
363
  plain: PlainSection,
364
+ testimonials: TestimonialsSection,
365
+ pricing: PricingSection,
366
+ faq: FaqSection,
367
+ stats: StatsSection,
368
+ team: TeamSection,
369
+ logo_cloud: LogoCloudSection,
83
370
  };
84
371
  // Palette KEY shape — mirrors the content API + dashboard catalog guard.
85
372
  // Anything else would be a CSS-variable injection through settings.
86
373
  const PALETTE_KEY_RE = /^[a-z][a-z0-9_]{0,40}$/;
374
+ // Defense-in-depth mirror of the dashboard sanitizeImageSrc — https:// or
375
+ // root-relative only, no quotes/spaces/control chars that could break out of
376
+ // the inline url().
377
+ const SAFE_SRC_RE = /^(https:\/\/|\/)[^\s"'<>\\)]+$/;
87
378
  const SPACING_PADDING = {
88
379
  compact: "24px 16px",
89
380
  normal: "48px 16px",
@@ -91,13 +382,37 @@ const SPACING_PADDING = {
91
382
  };
92
383
  /** Wrapper style for the <section> element from whitelisted settings. */
93
384
  export function sectionWrapperStyle(section) {
385
+ const settings = section.settings ?? {};
94
386
  const style = {
95
- padding: SPACING_PADDING[section.settings?.spacing ?? ""] ?? SPACING_PADDING.normal,
387
+ padding: SPACING_PADDING[settings.spacing ?? ""] ?? SPACING_PADDING.normal,
96
388
  fontFamily: "var(--risali-font-body, inherit)",
97
389
  };
98
- const bg = section.settings?.background;
99
- if (typeof bg === "string" && PALETTE_KEY_RE.test(bg)) {
100
- style.backgroundColor = `var(--risali-color-${bg})`;
390
+ // Background colour: a custom value (full editor) takes precedence over the
391
+ // palette key; otherwise fall back to the palette CSS var.
392
+ const customBg = safeColorAlpha(settings.background_color);
393
+ const bgKey = settings.background;
394
+ if (customBg) {
395
+ style.backgroundColor = customBg;
396
+ }
397
+ else if (typeof bgKey === "string" && PALETTE_KEY_RE.test(bgKey)) {
398
+ style.backgroundColor = `var(--risali-color-${bgKey})`;
399
+ }
400
+ // Background image + optional dark overlay (full editor). The overlay is a
401
+ // gradient layered above the image so foreground text stays legible.
402
+ const img = settings.background_image;
403
+ if (typeof img === "string" && img.length <= 1000 && SAFE_SRC_RE.test(img)) {
404
+ const overlay = typeof settings.overlay === "number" && Number.isFinite(settings.overlay)
405
+ ? Math.min(1, Math.max(0, settings.overlay))
406
+ : 0;
407
+ const layers = [];
408
+ if (overlay > 0) {
409
+ const a = overlay.toFixed(2);
410
+ layers.push(`linear-gradient(rgba(0,0,0,${a}),rgba(0,0,0,${a}))`);
411
+ }
412
+ layers.push(`url("${img}")`);
413
+ style.backgroundImage = layers.join(",");
414
+ style.backgroundSize = "cover";
415
+ style.backgroundPosition = "center";
101
416
  }
102
417
  return style;
103
418
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sections/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sections/index.tsx"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,mEAAmE;AACnE,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,4EAA4E;AAC5E,kDAAkD;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EACL,GAAG,EACH,KAAK,EACL,KAAK,EACL,MAAM,EACN,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,KAAK,EACL,GAAG,GACJ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,MAAM,EACN,cAAc,EACd,SAAS,EACT,eAAe,EACf,SAAS,EACT,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,MAAM,EACN,WAAW,EACX,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAcrB,6EAA6E;AAC7E,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,aAAa,GAA0B;IAC3C,QAAQ;IACR,GAAG;IACH,WAAW;IACX,KAAK;IACL,MAAM;IACN,GAAG;CACJ,CAAC;AACF,MAAM,UAAU,GAA0B;IACxC,UAAU;IACV,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,KAAK;IACL,WAAW;CACZ,CAAC;AAEF,SAAS,KAAK,CAAC,IAA2B,EAAE,CAAS;IACnD,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC;AAC3C,CAAC;AAED,iEAAiE;AACjE,SAAS,QAAQ,CAAC,IAAgB;IAChC,OAAO,aAAa,CAClB,KAAK,EACL;QACE,GAAG,EAAE,MAAM;QACX,aAAa,EAAE,MAAM;QACrB,KAAK,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,YAAY,EAAE,MAAM;YACpB,UAAU,EAAE,eAAe;YAC3B,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,MAAM;SACG;KAC1B,EACD,aAAa,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,UAAU,CAAC,OAA2B;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,EACzC,WAAW,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,mBAAmB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9E,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,SAAS,mBAAmB,CAAC,MAAqB;IAIhD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAID;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,MAAqB;IAI3C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,GAAuB,IAAI,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC1E,KAAK,GAAG,KAAK,CAAC;QACd,KAAK,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,OAAO,GAAsB,IAAI,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,6CAA6C;AAE7C,SAAS,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAEvD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,WAAW,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,WAAW,CAAC,CAAC,EAAE;gBACpB,SAAS,EAAE;oBACT,GAAG,eAAe;oBAClB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,QAAQ,EAAE,OAAO;iBAClB;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAClB,KAAK,EACL;QACE,KAAK,EAAE;YACL,GAAG,eAAe;YAClB,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,MAAgB;SAC9D;KACF,EACD,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAC9C,OAAO,CAAC,MAAM;QACZ,CAAC,CAAC,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,EAChD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CACnC;QACH,CAAC,CAAC,IAAI,CACT,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAC/D,yEAAyE;IACzE,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,KAAK,MAAM,CAAC;IAE1D,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,aAAa,CAC3B,KAAK,EACL,EAAE,GAAG,EAAE,MAAM,EAAE,EACf,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,WAAW,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAG,aAAa,CAC5B,KAAK,EACL;QACE,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE;YACL,YAAY,EAAE,SAAS;YACvB,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,WAAW;SACvB;KACF,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACtF,CAAC;IAEF,OAAO,aAAa,CAClB,KAAK,EACL;QACE,KAAK,EAAE;YACL,GAAG,eAAe;YAClB,OAAO,EAAE,MAAM;YACf,mBAAmB,EAAE,iDAAiD;YACtE,GAAG,EAAE,MAAM;YACX,UAAU,EAAE,QAAQ;SACrB;KACF,EACD,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAC9D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9B,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAClC,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EACjC,WAAW,CAAC,CAAC,CAAC,CACf,CACF,CAAC;IACF,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,OAAO,CAAC,EACnB,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAC7D,0EAA0E;IAC1E,2EAA2E;IAC3E,qCAAqC;IACrC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,aAAa,CACX,KAAK,EACL;QACE,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE;YACL,WAAW,EAAE,OAAO;YACpB,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,MAAM;YACpB,SAAS,EAAE,WAAW;SACC;KAC1B,EACD,WAAW,CAAC,CAAC,EAAE;QACb,UAAU,EAAE;YACV,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,OAAO;YAClB,YAAY,EAAE,CAAC;SAChB;KACF,CAAC,CACH,CACF,CAAC;IACF,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,OAAO,CAAC,EACnB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAChC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,MAAM,EAAsB;IAChD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAEvD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,WAAW,CAAC,CAAC,EAAE;gBACpB,YAAY,EAAE,EAAE,GAAG,mBAAmB,EAAE,MAAM,EAAE,WAAW,EAAE;aAC9D,CAAC,CAAC;QACL,CAAC;QACD,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,aAAa,CACX,KAAK,EACL;QACE,KAAK,EAAE;YACL,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,aAAa,MAAM,EAAE;YAC7B,YAAY,EAAE,SAAS;YACvB,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,QAAiB;SAC7B;KACF,EACD,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAC9C,OAAO,CAAC,MAAM;QACZ,CAAC,CAAC,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,EAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CACnC;QACH,CAAC,CAAC,IAAI,CACT,CACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,MAAM,EAAsB;IACpD,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EACpD,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CACtF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,MAAM,EAAsB;IAClD,OAAO,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAClE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3B,aAAa,CACX,KAAK,EACL;QACE,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;KAC5E,EACD,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAC/E,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CACrD,EACD,WAAW,CAAC,CAAC,CAAC,CACf,CACF,CAAC;IACF,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,OAAO,CAAC,EACnB,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAC7D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtD,+EAA+E;IAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9B,aAAa,CACX,KAAK,EACL;QACE,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,SAAS,CACd,CAAC,KAAK,WAAW;YACf,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,SAAS,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;YAC9D,CAAC,CAAC,EAAE,CACP;KACF,EACD,WAAW,CAAC,CAAC,CAAC,CACf,CACF,CAAC;IACF,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,OAAO,CAAC,EACnB,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,MAAM,EAAsB;IAChD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAChC,aAAa,CACX,KAAK,EACL;QACE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE;QAC9B,KAAK,EAAE;YACL,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,aAAa,MAAM,EAAE;YAC7B,YAAY,EAAE,MAAM;YACpB,OAAO,EAAE,WAAW;SACG;KAC1B,EACD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EACzE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CACrC,CACF,CAAC;IACF,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EACpD,UAAU,CAAC,KAAK,CAAC,EACjB,aAAa,CACX,KAAK,EACL,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EACpE,KAAK,CACN,CACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAC3D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAChC,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,QAAiB,EAAE,EAAE,EAC5E,aAAa,CACX,KAAK,EACL;QACE,GAAG,EAAE,MAAM;QACX,aAAa,EAAE,MAAM;QACrB,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE;KACjD,EACD,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CACrE,EACD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EACxE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC,CACtE,CACF,CAAC;IACF,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,KAAK,CAAC,EACjB,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAsB;IAC1D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACvD,OAAO,aAAa,CAClB,KAAK,EACL;YACE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE;YAC/B,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC3D,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACf,aAAa,CACX,KAAK,EACL;YACE,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,KAAK,EAAE;gBACL,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,WAAW;gBACzB,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,aAAa;gBACrB,MAAM,EAAE,aAAa,MAAM,EAAE;aACN;SAC1B,EACD,WAAW,CAAC,CAAC,EAAE;YACb,UAAU,EAAE;gBACV,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,OAAO;gBAClB,YAAY,EAAE,CAAC;aAChB;SACF,CAAC,CACH,CACF,EACD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EACtE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CACpE,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,UAAU,CAAC,KAAK,CAAC,EACjB,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,MAAM,EAAsB;IACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACtD,8EAA8E;IAC9E,4EAA4E;IAC5E,oDAAoD;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAChE,WAAW,CAAC,CAAC,EAAE;QACb,UAAU,EAAE;YACV,SAAS,EAAE,MAAM;YACjB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,GAAG;SACb;KACF,CAAC,CACH,CACF,CAAC;IACF,OAAO,aAAa,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,eAAe,EAAE,EAC1B,OAAO;QACL,CAAC,CAAC,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,QAAiB,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAC/E,WAAW,CAAC,OAAO,EAAE;YACnB,YAAY,EAAE;gBACZ,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,WAAW;gBAC1B,aAAa,EAAE,QAAQ;gBACvB,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,CAAC;aACV;SACF,CAAC,CACH;QACH,CAAC,CAAC,IAAI,EACR,KAAK,CAAC,MAAM;QACV,CAAC,CAAC,aAAa,CACX,KAAK,EACL,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,QAAiB,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAC/E,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CACjC;QACH,CAAC,CAAC,IAAI,EACR,aAAa,CACX,KAAK,EACL;QACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,GAAG,EAAE,MAAM;SACZ;KACF,EACD,KAAK,CACN,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAA2C;IAC/E,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,gBAAgB;IAC5B,QAAQ,EAAE,eAAe;IACzB,OAAO,EAAE,cAAc;IACvB,GAAG,EAAE,UAAU;IACf,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,mBAAmB;IACjC,OAAO,EAAE,cAAc;IACvB,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,gBAAgB;CAC7B,CAAC;AAEF,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAChD,0EAA0E;AAC1E,6EAA6E;AAC7E,oBAAoB;AACpB,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAErD,MAAM,eAAe,GAA2B;IAC9C,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,WAAW;CACtB,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAkB;QAC3B,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,eAAe,CAAC,MAAM;QAC1E,UAAU,EAAE,kCAAkC;KAC/C,CAAC;IAEF,4EAA4E;IAC5E,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,KAAK,CAAC,eAAe,GAAG,sBAAsB,KAAK,GAAG,CAAC;IACzD,CAAC;IAED,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,GAAG,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,GACX,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;QAC7B,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC;QAC/B,KAAK,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACtC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { CSSProperties } from "react";
2
+ export declare const C_PRIMARY = "var(--risali-color-primary, #0f172a)";
3
+ export declare const C_BG = "var(--risali-color-background, #ffffff)";
4
+ export declare const C_FG = "var(--risali-color-text, #0f172a)";
5
+ export declare const C_ACCENT = "var(--risali-color-accent, var(--risali-color-primary, #0f172a))";
6
+ export declare const C_ON_PRIMARY = "var(--risali-on-primary, #ffffff)";
7
+ export declare const SURFACE_CARD = "var(--risali-color-background, #ffffff)";
8
+ export declare const SURFACE_MUTED: string;
9
+ export declare const SURFACE_SECONDARY: string;
10
+ export declare const BORDER: string;
11
+ export declare const MUTED_FG: string;
12
+ export declare const PRIMARY_GLOW: string;
13
+ export declare const PRIMARY_SOFT: string;
14
+ export declare const PRIMARY_CHIP_BG: string;
15
+ export declare const GRADIENT_PRIMARY: string;
16
+ export declare const GRADIENT_HERO: string;
17
+ export declare const SHADOW_SOFT: string;
18
+ export declare const SHADOW_CARD: string;
19
+ export declare const SHADOW_GLOW: string;
20
+ export declare const RADIUS = "0.75rem";
21
+ export declare const RADIUS_LG = "1rem";
22
+ export declare const RADIUS_XL = "1.25rem";
23
+ export declare const RADIUS_FULL = "9999px";
24
+ export declare const CONTAINER_STYLE: CSSProperties;
25
+ /**
26
+ * Intrinsically-responsive grid. `columns` (2|3|4 from section settings) sets
27
+ * the DESIRED density via a per-item min width; auto-fit then fits as many
28
+ * tracks as the viewport allows and wraps to fewer (down to 1) on narrow
29
+ * screens — no media query needed. `min(100%, …)` stops a single wide card
30
+ * from overflowing a phone.
31
+ */
32
+ export declare function responsiveGrid(columns: unknown, gap?: string): CSSProperties;
33
+ /** Surface card — quiet brand-tinted background, hairline border, soft shadow. */
34
+ export declare function cardStyle(extra?: CSSProperties): CSSProperties;
35
+ /** Flex row for a group of buttons (hero/cta). */
36
+ export declare function buttonRowStyle(centered: boolean): CSSProperties;
37
+ /** Large hero headline. */
38
+ export declare const DISPLAY_HEADING_STYLE: CSSProperties;
39
+ /** Section title (features/testimonials/… headings). */
40
+ export declare const SECTION_TITLE_STYLE: CSSProperties;
41
+ /** Lead paragraph under a hero headline. */
42
+ export declare const LEAD_TEXT_STYLE: CSSProperties;
43
+ /** Big number in a stats cell. */
44
+ export declare const STAT_NUMBER_STYLE: CSSProperties;
45
+ /** Label under a stat number. */
46
+ export declare const STAT_LABEL_STYLE: CSSProperties;
47
+ /** FAQ question. */
48
+ export declare const FAQ_QUESTION_STYLE: CSSProperties;
49
+ /** Team member name. */
50
+ export declare const TEAM_NAME_STYLE: CSSProperties;
51
+ /** Team member role. */
52
+ export declare const TEAM_ROLE_STYLE: CSSProperties;
53
+ /** Centered title block above a grid. */
54
+ export declare const TITLE_WRAP_STYLE: CSSProperties;
55
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/sections/tokens.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,eAAO,MAAM,SAAS,yCAAyC,CAAC;AAChE,eAAO,MAAM,IAAI,4CAA4C,CAAC;AAC9D,eAAO,MAAM,IAAI,sCAAsC,CAAC;AACxD,eAAO,MAAM,QAAQ,qEAC+C,CAAC;AACrE,eAAO,MAAM,YAAY,sCAAsC,CAAC;AAQhE,eAAO,MAAM,YAAY,4CAAO,CAAC;AACjC,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,iBAAiB,QAAqB,CAAC;AACpD,eAAO,MAAM,MAAM,QAAsB,CAAC;AAC1C,eAAO,MAAM,QAAQ,QAAsB,CAAC;AAG5C,eAAO,MAAM,YAAY,QAA8B,CAAC;AACxD,eAAO,MAAM,YAAY,QAA2B,CAAC;AACrD,eAAO,MAAM,eAAe,QAA2B,CAAC;AAGxD,eAAO,MAAM,gBAAgB,QAAmE,CAAC;AACjG,eAAO,MAAM,aAAa,QAA0E,CAAC;AAGrG,eAAO,MAAM,WAAW,QAA+F,CAAC;AACxH,eAAO,MAAM,WAAW,QAAsD,CAAC;AAC/E,eAAO,MAAM,WAAW,QAAwD,CAAC;AAGjF,eAAO,MAAM,MAAM,YAAY,CAAC;AAChC,eAAO,MAAM,SAAS,SAAS,CAAC;AAChC,eAAO,MAAM,SAAS,YAAY,CAAC;AACnC,eAAO,MAAM,WAAW,WAAW,CAAC;AAIpC,eAAO,MAAM,eAAe,EAAE,aAG7B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,aAAa,CAS5E;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,aAAa,CAS9D;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa,CAQ/D;AAID,2BAA2B;AAC3B,eAAO,MAAM,qBAAqB,EAAE,aAMnC,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,EAAE,aAMjC,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,eAAe,EAAE,aAK7B,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,EAAE,aAO/B,CAAC;AAEF,iCAAiC;AACjC,eAAO,MAAM,gBAAgB,EAAE,aAI9B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,kBAAkB,EAAE,aAKhC,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,eAAe,EAAE,aAI7B,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,eAAe,EAAE,aAI7B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,EAAE,aAI9B,CAAC"}
@@ -0,0 +1,159 @@
1
+ // Inline design tokens for builder sections (L5).
2
+ //
3
+ // These mirror the L1 design system (templates/.../globals.css) but are emitted
4
+ // as INLINE CSS strings derived straight from the --risali-color-* variables
5
+ // <RisaliBrand> sets — so a builder section looks branded and "designed" even
6
+ // where the client app's Tailwind / globals.css is not in scope (unit tests
7
+ // with renderToStaticMarkup, or a minimal host).
8
+ //
9
+ // WHY NOT L1 utility classes (bg-primary, shadow-elevated, …)? Tailwind v4 only
10
+ // generates the classes it finds while scanning the APP's source — never ones
11
+ // buried in node_modules/@risali/react — so those utilities would be purged on
12
+ // most client builds. Inline styles always apply, and color-mix() over the same
13
+ // brand vars reproduces the exact L1 look. Tests stay green because color-mix
14
+ // strings are inert text under renderToStaticMarkup.
15
+ //
16
+ // Responsiveness is achieved WITHOUT media queries (impossible inline): grids
17
+ // use `repeat(auto-fit, minmax(min(100%, …), 1fr))`, which collapses to fewer
18
+ // columns as the viewport narrows and never overflows on a phone.
19
+ // Brand color refs with the SAME light-theme fallbacks as globals.css :root,
20
+ // so an un-branded scaffold (or a payload before <RisaliBrand> resolves) still
21
+ // renders something clean instead of `unset`.
22
+ export const C_PRIMARY = "var(--risali-color-primary, #0f172a)";
23
+ export const C_BG = "var(--risali-color-background, #ffffff)";
24
+ export const C_FG = "var(--risali-color-text, #0f172a)";
25
+ export const C_ACCENT = "var(--risali-color-accent, var(--risali-color-primary, #0f172a))";
26
+ export const C_ON_PRIMARY = "var(--risali-on-primary, #ffffff)";
27
+ /** color-mix in oklab — same color space as globals.css. */
28
+ function mix(a, pct, b) {
29
+ return `color-mix(in oklab, ${a} ${pct}%, ${b})`;
30
+ }
31
+ // Derived surfaces (mirror globals.css --card / --secondary / --muted / --border).
32
+ export const SURFACE_CARD = C_BG;
33
+ export const SURFACE_MUTED = mix(C_FG, 4, C_BG);
34
+ export const SURFACE_SECONDARY = mix(C_FG, 6, C_BG);
35
+ export const BORDER = mix(C_FG, 12, C_BG);
36
+ export const MUTED_FG = mix(C_FG, 55, C_BG);
37
+ // Brand tints used for soft panels and icon chips.
38
+ export const PRIMARY_GLOW = mix(C_PRIMARY, 68, "white");
39
+ export const PRIMARY_SOFT = mix(C_PRIMARY, 10, C_BG); // faint brand wash (panels)
40
+ export const PRIMARY_CHIP_BG = mix(C_PRIMARY, 12, C_BG); // icon-chip background
41
+ // Gradients (mirror globals.css --gradient-primary / --gradient-hero).
42
+ export const GRADIENT_PRIMARY = `linear-gradient(135deg, ${C_PRIMARY} 0%, ${PRIMARY_GLOW} 100%)`;
43
+ export const GRADIENT_HERO = `linear-gradient(135deg, ${C_BG} 0%, ${mix(C_PRIMARY, 10, C_BG)} 100%)`;
44
+ // Shadows (mirror globals.css — soft + foreground/brand tinted, never harsh black).
45
+ export const SHADOW_SOFT = `0 1px 2px ${mix(C_FG, 6, "transparent")}, 0 8px 24px -12px ${mix(C_FG, 12, "transparent")}`;
46
+ export const SHADOW_CARD = `0 10px 40px -15px ${mix(C_FG, 16, "transparent")}`;
47
+ export const SHADOW_GLOW = `0 0 60px -10px ${mix(C_PRIMARY, 40, "transparent")}`;
48
+ // Radius scale (globals.css --radius = 0.75rem; here as static rems).
49
+ export const RADIUS = "0.75rem";
50
+ export const RADIUS_LG = "1rem";
51
+ export const RADIUS_XL = "1.25rem";
52
+ export const RADIUS_FULL = "9999px";
53
+ // ---------------- shared layout helpers ----------------
54
+ export const CONTAINER_STYLE = {
55
+ maxWidth: "1100px",
56
+ margin: "0 auto",
57
+ };
58
+ /**
59
+ * Intrinsically-responsive grid. `columns` (2|3|4 from section settings) sets
60
+ * the DESIRED density via a per-item min width; auto-fit then fits as many
61
+ * tracks as the viewport allows and wraps to fewer (down to 1) on narrow
62
+ * screens — no media query needed. `min(100%, …)` stops a single wide card
63
+ * from overflowing a phone.
64
+ */
65
+ export function responsiveGrid(columns, gap = "24px") {
66
+ const n = typeof columns === "number" && [2, 3, 4].includes(columns) ? columns : 3;
67
+ const min = n === 2 ? "320px" : n === 3 ? "240px" : "190px";
68
+ return {
69
+ display: "grid",
70
+ gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, ${min}), 1fr))`,
71
+ gap,
72
+ };
73
+ }
74
+ /** Surface card — quiet brand-tinted background, hairline border, soft shadow. */
75
+ export function cardStyle(extra) {
76
+ return {
77
+ background: SURFACE_CARD,
78
+ border: `1px solid ${BORDER}`,
79
+ borderRadius: RADIUS_LG,
80
+ padding: "28px",
81
+ boxShadow: SHADOW_SOFT,
82
+ ...extra,
83
+ };
84
+ }
85
+ /** Flex row for a group of buttons (hero/cta). */
86
+ export function buttonRowStyle(centered) {
87
+ return {
88
+ display: "flex",
89
+ flexWrap: "wrap",
90
+ gap: "12px",
91
+ justifyContent: centered ? "center" : "flex-start",
92
+ marginTop: "8px",
93
+ };
94
+ }
95
+ // ---------------- typography overrides (passed to renderBlock opts) ----------------
96
+ /** Large hero headline. */
97
+ export const DISPLAY_HEADING_STYLE = {
98
+ fontSize: "clamp(2.5rem, 1.5rem + 4vw, 4rem)",
99
+ lineHeight: 1.05,
100
+ letterSpacing: "-0.03em",
101
+ fontWeight: 800,
102
+ margin: "0 0 0.4em",
103
+ };
104
+ /** Section title (features/testimonials/… headings). */
105
+ export const SECTION_TITLE_STYLE = {
106
+ fontSize: "clamp(1.75rem, 1.2rem + 1.5vw, 2.5rem)",
107
+ lineHeight: 1.15,
108
+ letterSpacing: "-0.02em",
109
+ fontWeight: 700,
110
+ margin: "0 0 0.3em",
111
+ };
112
+ /** Lead paragraph under a hero headline. */
113
+ export const LEAD_TEXT_STYLE = {
114
+ fontSize: "1.2rem",
115
+ lineHeight: 1.6,
116
+ color: MUTED_FG,
117
+ margin: "0 0 1.5em",
118
+ };
119
+ /** Big number in a stats cell. */
120
+ export const STAT_NUMBER_STYLE = {
121
+ fontSize: "clamp(2.5rem, 1.5rem + 3vw, 3.5rem)",
122
+ lineHeight: 1,
123
+ letterSpacing: "-0.03em",
124
+ fontWeight: 800,
125
+ color: C_PRIMARY,
126
+ margin: "0 0 0.15em",
127
+ };
128
+ /** Label under a stat number. */
129
+ export const STAT_LABEL_STYLE = {
130
+ fontSize: "0.95rem",
131
+ color: MUTED_FG,
132
+ margin: 0,
133
+ };
134
+ /** FAQ question. */
135
+ export const FAQ_QUESTION_STYLE = {
136
+ fontSize: "1.1rem",
137
+ fontWeight: 600,
138
+ letterSpacing: "-0.01em",
139
+ margin: "0 0 8px",
140
+ };
141
+ /** Team member name. */
142
+ export const TEAM_NAME_STYLE = {
143
+ fontSize: "1.15rem",
144
+ fontWeight: 600,
145
+ margin: "0 0 2px",
146
+ };
147
+ /** Team member role. */
148
+ export const TEAM_ROLE_STYLE = {
149
+ fontSize: "0.9rem",
150
+ color: MUTED_FG,
151
+ margin: 0,
152
+ };
153
+ /** Centered title block above a grid. */
154
+ export const TITLE_WRAP_STYLE = {
155
+ textAlign: "center",
156
+ maxWidth: "640px",
157
+ margin: "0 auto 40px",
158
+ };
159
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/sections/tokens.ts"],"names":[],"mappings":"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"}
package/dist/style.d.ts CHANGED
@@ -1,6 +1,13 @@
1
1
  import type { CSSProperties } from "react";
2
2
  import type { RisaliStyleOverrides } from "./types.js";
3
3
  export declare function safeColor(value: unknown): string | undefined;
4
+ /**
5
+ * Like safeColor but also accepts an 8-digit hex (alpha) and the "transparent"
6
+ * keyword — the canonical output of the editor's normalizeColorAlpha (full
7
+ * editor custom colours). Defense-in-depth: the value was already validated
8
+ * server-side, but we never trust the API payload verbatim.
9
+ */
10
+ export declare function safeColorAlpha(value: unknown): string | undefined;
4
11
  /**
5
12
  * Picks a readable foreground (near-black or white) for a brand color using
6
13
  * WCAG relative luminance — so brand-tinted surfaces (a primary button, an
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIvD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAG5D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,IAAI,SAAY,EAChB,KAAK,SAAY,GAChB,MAAM,GAAG,SAAS,CAYpB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAKzE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,SAAS,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GACjD,aAAa,GAAG,SAAS,CAS3B"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMvD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAG5D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAKjE;AAYD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,IAAI,SAAY,EAChB,KAAK,SAAY,GAChB,MAAM,GAAG,SAAS,CAYpB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAKzE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,SAAS,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GACjD,aAAa,GAAG,SAAS,CA0B3B"}
package/dist/style.js CHANGED
@@ -1,9 +1,33 @@
1
+ import { fontStackForId } from "./fonts.js";
1
2
  const HEX_RE = /^#[0-9a-fA-F]{6}$/;
3
+ const HEX_ALPHA_RE = /^#[0-9a-fA-F]{6}(?:[0-9a-fA-F]{2})?$/;
2
4
  export function safeColor(value) {
3
5
  if (typeof value !== "string")
4
6
  return undefined;
5
7
  return HEX_RE.test(value) ? value : undefined;
6
8
  }
9
+ /**
10
+ * Like safeColor but also accepts an 8-digit hex (alpha) and the "transparent"
11
+ * keyword — the canonical output of the editor's normalizeColorAlpha (full
12
+ * editor custom colours). Defense-in-depth: the value was already validated
13
+ * server-side, but we never trust the API payload verbatim.
14
+ */
15
+ export function safeColorAlpha(value) {
16
+ if (typeof value !== "string")
17
+ return undefined;
18
+ const v = value.trim().toLowerCase();
19
+ if (v === "transparent")
20
+ return "transparent";
21
+ return HEX_ALPHA_RE.test(v) ? v : undefined;
22
+ }
23
+ // Block padding presets (full editor) → fixed px. Enum, never raw px.
24
+ const BLOCK_PADDING_PX = {
25
+ none: "0",
26
+ compact: "12px",
27
+ normal: "24px",
28
+ spacious: "48px",
29
+ };
30
+ const TEXT_ALIGNS = new Set(["left", "center", "right"]);
7
31
  /**
8
32
  * Picks a readable foreground (near-black or white) for a brand color using
9
33
  * WCAG relative luminance — so brand-tinted surfaces (a primary button, an
@@ -35,15 +59,32 @@ export function safeFontSizeMultiplier(value) {
35
59
  export function applyStyleOverrides(base, overrides) {
36
60
  if (!overrides)
37
61
  return base;
38
- const color = safeColor(overrides.color);
62
+ const color = safeColorAlpha(overrides.color);
63
+ const bg = safeColorAlpha(overrides.background_color);
39
64
  const mult = safeFontSizeMultiplier(overrides.font_size_multiplier);
40
- if (!color && !mult)
65
+ const fontStack = fontStackForId(overrides.font_family);
66
+ const align = typeof overrides.text_align === "string" && TEXT_ALIGNS.has(overrides.text_align)
67
+ ? overrides.text_align
68
+ : undefined;
69
+ const padding = typeof overrides.padding === "string"
70
+ ? BLOCK_PADDING_PX[overrides.padding]
71
+ : undefined;
72
+ if (!color && !bg && !mult && !fontStack && !align && padding === undefined) {
41
73
  return base;
74
+ }
42
75
  const next = { ...(base || {}) };
43
76
  if (color)
44
77
  next.color = color;
78
+ if (bg)
79
+ next.backgroundColor = bg;
45
80
  if (mult)
46
81
  next.fontSize = `${mult}em`;
82
+ if (fontStack)
83
+ next.fontFamily = fontStack;
84
+ if (align)
85
+ next.textAlign = align;
86
+ if (padding !== undefined)
87
+ next.padding = padding;
47
88
  return next;
48
89
  }
49
90
  //# sourceMappingURL=style.js.map
package/dist/style.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,GAAG,mBAAmB,CAAC;AAEnC,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,IAAI,GAAG,SAAS,EAChB,KAAK,GAAG,SAAS;IAEjB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE;QAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;QAClD,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,oEAAoE;IACpE,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxC,OAAO,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,4EAA4E;IAC5E,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAA+B,EAC/B,SAAkD;IAElD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAkB,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;IAChD,IAAI,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,IAAI,IAAI;QAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,7 +1,13 @@
1
1
  export type RisaliBlockType = "text" | "image" | "rich_text" | "html" | "button" | "divider";
2
2
  export type RisaliStyleOverrides = {
3
3
  color?: string;
4
+ /** Block background colour — custom hex/rgba incl. alpha, or "transparent". */
5
+ background_color?: string;
6
+ /** Per-element font — a font catalog id (e.g. "poppins"). */
7
+ font_family?: string;
4
8
  font_size_multiplier?: number;
9
+ text_align?: "left" | "center" | "right" | string;
10
+ padding?: "none" | "compact" | "normal" | "spacious" | string;
5
11
  };
6
12
  export type RisaliBlock = {
7
13
  key: string;
@@ -18,6 +24,9 @@ export type RisaliBlock = {
18
24
  };
19
25
  export type RisaliSectionSettings = {
20
26
  background?: string;
27
+ background_color?: string;
28
+ background_image?: string;
29
+ overlay?: number;
21
30
  spacing?: "compact" | "normal" | "spacious" | string;
22
31
  columns?: number;
23
32
  image_side?: "left" | "right" | string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@risali/react",
3
- "version": "0.6.2",
3
+ "version": "0.8.0",
4
4
  "description": "React server components for Risali.app — SSR-fetch editable text/image/rich-text blocks from a client's Risali site.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -23,6 +23,9 @@
23
23
  "clean": "rm -rf dist",
24
24
  "prepublishOnly": "npm run clean && npm run build"
25
25
  },
26
+ "dependencies": {
27
+ "lucide-react": "^1.16.0"
28
+ },
26
29
  "peerDependencies": {
27
30
  "react": ">=18.0.0",
28
31
  "react-dom": ">=18.0.0"