import { CSSProperties, ComponentType, ReactNode } from "react";
import * as react_jsx_runtime0 from "react/jsx-runtime";

//#region ../core/dist/index.d.ts
type PolicyCategory = "privacy" | "cookie";
type Jurisdiction = "us" | "eu" | "ca" | "au" | "nz" | "other";
type UserRight = "access" | "rectification" | "erasure" | "portability" | "restriction" | "objection" | "opt_out_sale" | "non_discrimination";
type LegalBasis = "consent" | "contract" | "legal_obligation" | "vital_interests" | "public_task" | "legitimate_interests";
type CompanyConfig = {
  name: string;
  legalName: string;
  address: string;
  contact: string;
};
type EffectiveDate = `${number}-${number}-${number}`;
type DataCollection = Record<string, string[]>;
type Retention = Record<string, string>;
type ThirdParty = {
  name: string;
  purpose: string;
  policyUrl?: string;
};
type ChildrenConfig = {
  underAge: number;
  noticeUrl?: string;
};
type CookiePolicyCookies = {
  essential: boolean;
  [key: string]: boolean;
};
type TrackingTechnology = string;
type ConsentMechanism = {
  hasBanner: boolean;
  hasPreferencePanel: boolean;
  canWithdraw: boolean;
};
type PrivacyPolicyConfig = {
  effectiveDate: EffectiveDate;
  company: CompanyConfig;
  dataCollected: DataCollection;
  legalBasis: LegalBasis | LegalBasis[];
  retention: Retention;
  cookies: CookiePolicyCookies;
  thirdParties: ThirdParty[];
  userRights: UserRight[];
  jurisdictions: Jurisdiction[];
  children?: ChildrenConfig;
};
type CookiePolicyConfig = {
  effectiveDate: EffectiveDate;
  company: CompanyConfig;
  cookies: CookiePolicyCookies;
  thirdParties: ThirdParty[];
  trackingTechnologies?: TrackingTechnology[];
  consentMechanism?: ConsentMechanism;
  jurisdictions: Jurisdiction[];
};
type OpenPolicyConfig = {
  company: CompanyConfig;
  effectiveDate: EffectiveDate;
  jurisdictions: Jurisdiction[];
  dataCollected?: DataCollection;
  legalBasis?: LegalBasis | LegalBasis[];
  retention?: Retention;
  children?: ChildrenConfig;
  thirdParties?: ThirdParty[];
  cookies?: CookiePolicyCookies;
  trackingTechnologies?: TrackingTechnology[];
  consentMechanism?: ConsentMechanism;
  policies?: PolicyCategory[];
};
//#endregion
//#region src/consent.d.ts
type CookieConsent = {
  essential: true;
  [key: string]: boolean;
};
type CookieConsentStatus = "undecided" | "completed";
//#endregion
//#region src/documents/types.d.ts
type NodeContext = {
  reason?: string;
};
type TextNode = {
  type: "text";
  value: string;
  context?: NodeContext;
};
type BoldNode = {
  type: "bold";
  value: string;
  context?: NodeContext;
};
type ItalicNode = {
  type: "italic";
  value: string;
  context?: NodeContext;
};
type LinkNode = {
  type: "link";
  href: string;
  value: string;
  context?: NodeContext;
};
type InlineNode = TextNode | BoldNode | ItalicNode | LinkNode;
type HeadingNode = {
  type: "heading";
  level?: 1 | 2 | 3 | 4 | 5 | 6;
  value: string;
  context?: NodeContext;
};
type ParagraphNode = {
  type: "paragraph";
  children: InlineNode[];
  context?: NodeContext;
};
type ListItemNode = {
  type: "listItem";
  children: (InlineNode | ListNode)[];
  context?: NodeContext;
};
type ListNode = {
  type: "list";
  ordered?: boolean;
  items: ListItemNode[];
  context?: NodeContext;
};
type ContentNode = HeadingNode | ParagraphNode | ListNode;
type DocumentSection = {
  type: "section";
  id: string;
  content: ContentNode[];
  context?: NodeContext;
};
type PolicyType = "privacy" | "cookie";
type Document = {
  type: "document";
  policyType: PolicyType;
  sections: DocumentSection[];
  context?: NodeContext;
};
type Node = Document | DocumentSection | ContentNode | ListItemNode | InlineNode; //#endregion
//#region src/documents/helpers.d.ts
//#endregion
//#region src/context.d.ts
type CookieRoute = "cookie" | "preferences" | "closed";
type CookieCategory = {
  key: string;
  label: string;
  enabled: boolean;
  locked: boolean;
};
type HasExpression = string | {
  and: HasExpression[];
} | {
  or: HasExpression[];
} | {
  not: HasExpression;
};
type OpenPolicyProviderProps = {
  config: OpenPolicyConfig;
  shouldShow?: () => Promise<boolean>;
  children?: ReactNode;
};
declare function OpenPolicyProvider({
  config,
  shouldShow,
  children
}: OpenPolicyProviderProps): react_jsx_runtime0.JSX.Element;
//#endregion
//#region src/components/ConsentGate.d.ts
interface ConsentGateProps {
  requires: HasExpression;
  fallback?: ReactNode;
  children: ReactNode;
}
declare function ConsentGate({
  requires,
  fallback,
  children
}: ConsentGateProps): ReactNode;
//#endregion
//#region src/types.d.ts
type PolicyTheme = Partial<Record<"--op-heading-color" | "--op-body-color" | "--op-section-gap" | "--op-font-family" | "--op-font-size-heading" | "--op-font-weight-heading" | "--op-font-size-body" | "--op-line-height" | "--op-link-color" | "--op-link-color-hover" | "--op-border-color" | "--op-border-radius", string>>;
interface PolicyComponents {
  Section?: ComponentType<{
    section: DocumentSection;
    children: ReactNode;
  }>;
  Heading?: ComponentType<{
    node: HeadingNode;
  }>;
  Paragraph?: ComponentType<{
    node: ParagraphNode;
    children: ReactNode;
  }>;
  List?: ComponentType<{
    node: ListNode;
    children: ReactNode;
  }>;
  Text?: ComponentType<{
    node: TextNode;
  }>;
  Bold?: ComponentType<{
    node: BoldNode;
  }>;
  Italic?: ComponentType<{
    node: ItalicNode;
  }>;
  Link?: ComponentType<{
    node: LinkNode;
  }>;
}
//#endregion
//#region src/components/CookiePolicy.d.ts
interface CookiePolicyProps {
  config?: OpenPolicyConfig | CookiePolicyConfig;
  components?: PolicyComponents;
  style?: CSSProperties;
}
declare function CookiePolicy({
  config: configProp,
  components,
  style
}: CookiePolicyProps): react_jsx_runtime0.JSX.Element | null;
//#endregion
//#region src/components/defaults.d.ts
declare function DefaultHeading({
  node
}: {
  node: HeadingNode;
}): react_jsx_runtime0.JSX.Element;
declare function DefaultText({
  node
}: {
  node: TextNode;
}): react_jsx_runtime0.JSX.Element;
declare function DefaultBold({
  node
}: {
  node: BoldNode;
}): react_jsx_runtime0.JSX.Element;
declare function DefaultLink({
  node
}: {
  node: LinkNode;
}): react_jsx_runtime0.JSX.Element;
declare function DefaultSection({
  section,
  children
}: {
  section: DocumentSection;
  children: ReactNode;
}): react_jsx_runtime0.JSX.Element;
declare function DefaultParagraph({
  node: _node,
  children
}: {
  node: ParagraphNode;
  children: ReactNode;
}): react_jsx_runtime0.JSX.Element;
declare function DefaultList({
  node,
  children
}: {
  node: ListNode;
  children: ReactNode;
}): react_jsx_runtime0.JSX.Element;
declare function renderNode(node: Node, components: PolicyComponents, key?: number): ReactNode;
//#endregion
//#region src/components/PrivacyPolicy.d.ts
interface PrivacyPolicyProps {
  config?: OpenPolicyConfig | PrivacyPolicyConfig;
  components?: PolicyComponents;
  style?: CSSProperties;
}
declare function PrivacyPolicy({
  config: configProp,
  components,
  style
}: PrivacyPolicyProps): react_jsx_runtime0.JSX.Element | null;
//#endregion
//#region src/hooks/useCookies.d.ts
declare function useCookies(): {
  readonly status: CookieConsentStatus;
  readonly consent: CookieConsent | null;
  readonly categories: CookieCategory[];
  readonly route: CookieRoute;
  readonly has: (expr: HasExpression) => boolean;
  readonly acceptAll: () => void;
  readonly acceptNecessary: () => void;
  readonly toggle: (key: string) => void;
  readonly save: (onSave?: (consent: CookieConsent) => void) => void;
  readonly reset: () => void;
  readonly setRoute: (route: CookieRoute) => void;
};
//#endregion
//#region src/hooks/useShouldShowCookieBanner.d.ts
declare function useShouldShowCookieBanner(status: CookieConsentStatus, shouldShow?: () => Promise<boolean>): boolean;
//#endregion
//#region src/render.d.ts
declare function renderDocument(doc: Document, components?: PolicyComponents): ReactNode;
//#endregion
//#region src/styles.d.ts
declare const defaultStyles = "\n.op-policy {\n  --op-font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n  --op-font-size-body: 1rem;\n  --op-font-size-heading: 1.125rem;\n  --op-font-weight-heading: 600;\n  --op-line-height: 1.7;\n  --op-body-color: #374151;\n  --op-heading-color: #111827;\n  --op-link-color: #2563eb;\n  --op-link-color-hover: #1d4ed8;\n  --op-section-gap: 2rem;\n  --op-border-color: #e5e7eb;\n  --op-border-radius: 0.375rem;\n\n  font-family: var(--op-font-family);\n  font-size: var(--op-font-size-body);\n  color: var(--op-body-color);\n  line-height: var(--op-line-height);\n  max-width: 65ch;\n}\n\n.op-section {\n  margin-bottom: var(--op-section-gap);\n  padding-bottom: var(--op-section-gap);\n  border-bottom: 1px solid var(--op-border-color);\n}\n.op-section:last-child {\n  border-bottom: none;\n  margin-bottom: 0;\n  padding-bottom: 0;\n}\n\n.op-heading {\n  font-size: var(--op-font-size-heading);\n  font-weight: var(--op-font-weight-heading);\n  color: var(--op-heading-color);\n  line-height: 1.3;\n  margin: 0 0 0.75rem;\n}\n\n.op-paragraph {\n  margin: 0 0 0.75rem;\n}\n.op-paragraph:last-child { margin-bottom: 0; }\n\n.op-list {\n  margin: 0 0 0.75rem;\n  padding-left: 1.5rem;\n  list-style-type: disc;\n}\n.op-list:last-child { margin-bottom: 0; }\n.op-list .op-list {\n  margin-top: 0.375rem;\n  margin-bottom: 0;\n  list-style-type: circle;\n}\n\n.op-list-item {\n  margin-bottom: 0.375rem;\n}\n.op-list-item:last-child { margin-bottom: 0; }\n\n.op-bold {\n  font-weight: 600;\n  color: var(--op-heading-color);\n}\n\n.op-link {\n  color: var(--op-link-color);\n  text-decoration: underline;\n  text-underline-offset: 2px;\n  transition: color 0.15s ease;\n}\n.op-link:hover { color: var(--op-link-color-hover); }\n";
//#endregion
export { ConsentGate, type CookieCategory, CookiePolicy, type CookieRoute, DefaultBold, DefaultHeading, DefaultLink, DefaultList, DefaultParagraph, DefaultSection, DefaultText, type HasExpression, OpenPolicyProvider as OpenPolicy, type PolicyComponents, type PolicyTheme, PrivacyPolicy, defaultStyles, renderDocument, renderNode, useCookies, useShouldShowCookieBanner };
//# sourceMappingURL=index.d.ts.map