@domainkit/react 0.11.0 → 0.12.1

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/dist/index.d.mts CHANGED
@@ -1,9 +1,8 @@
1
1
  import { Approval, DnsRecord, DomainKit, Plan, Reason, Receipt, Storage } from "domainkit";
2
2
  import "effect/Effect";
3
- import { CSSProperties, ElementType, ReactElement, ReactNode, RefObject } from "react";
3
+ import { AriaAttributes, FocusEventHandler, FormEventHandler, KeyboardEventHandler, MouseEventHandler, ReactElement, ReactNode } from "react";
4
4
  import * as Data from "effect/Data";
5
5
  import { Transport } from "domainkit/client";
6
- import { useRender } from "@base-ui/react/use-render";
7
6
  import { Testing } from "domainkit/testing";
8
7
  //#region src/events.d.ts
9
8
  /** What a customer finished doing, for host notifications, analytics, and audit trails. */
@@ -240,7 +239,7 @@ declare const Event: {
240
239
  type Listener = (event: Event) => void;
241
240
  //#endregion
242
241
  //#region src/attempt.d.ts
243
- type State$3 = Data.TaggedEnum<{
242
+ type State$2 = Data.TaggedEnum<{
244
243
  Idle: {};
245
244
  Planning: {};
246
245
  Planned: {
@@ -268,7 +267,7 @@ type State$3 = Data.TaggedEnum<{
268
267
  readonly error: DomainKit.Error;
269
268
  };
270
269
  }>;
271
- declare const State$3: {
270
+ declare const State$2: {
272
271
  readonly $is: <Tag extends "Applied" | "Applying" | "Approving" | "Failure" | "Idle" | "Planned" | "Planning" | "Rejected" | "Rejecting">(tag: Tag) => (u: unknown) => u is Extract<{
273
272
  readonly _tag: "Applied";
274
273
  readonly plan: Plan.Model | null;
@@ -475,7 +474,7 @@ declare const State$3: {
475
474
  }, "_tag">;
476
475
  };
477
476
  interface Controller$2 {
478
- readonly state: State$3;
477
+ readonly state: State$2;
479
478
  /** Build a plan. The plan itself rides on the state, from `Planned` through `Applied`. */
480
479
  readonly plan: () => void;
481
480
  /** Authorize the digest and apply it. Pass `operationIds` to approve part of the plan. */
@@ -488,166 +487,386 @@ interface Controller$2 {
488
487
  readonly retry: () => void;
489
488
  readonly reset: () => void;
490
489
  }
491
- //#endregion
492
- //#region src/composition.d.ts
493
- type ClassName<State> = string | ((state: State) => string | undefined);
494
- type Style<State> = CSSProperties | ((state: State) => CSSProperties | undefined);
495
- /**
496
- * What every rendered part accepts: the element's own props, a state-aware `className` and
497
- * `style`, and Base UI's `render` for replacing the element outright.
498
- */
499
- type PartProps<Tag extends ElementType = "div", State extends Record<string, unknown> = Record<string, unknown>> = Omit<useRender.ElementProps<Tag>, "className" | "style"> & {
500
- readonly className?: ClassName<State>;
501
- readonly render?: useRender.RenderProp<State>;
502
- readonly style?: Style<State>;
503
- };
504
- declare namespace outcome_d_exports {
505
- export { Composition, Content, ContentProps, Description, DescriptionProps, Header$1 as Header, HeaderProps, Layout, Media, MediaProps, Provider, Root$7 as Root, RootProps$7 as RootProps, State$2 as State, Title, TitleProps, Tone, Value$1 as Value, useOutcome };
506
- }
507
- /** How the outcome reads: a problem, a caution, or a step that went through. */
508
- type Tone = "danger" | "success" | "warning";
509
- /** `card` is the panel a flow shows on its own; `inline` sits under a field or in a busy row. */
510
- type Layout = "card" | "inline";
511
- /** What a flow resolved for the outcome its parts render. */
512
- interface Value$1 {
513
- readonly tone: Tone;
514
- readonly layout: Layout;
515
- readonly title: string;
516
- readonly description: string;
517
- /** The retry the flow allows, or `null` when it allows none. */
518
- readonly retry: (() => void) | null;
519
- /** The part name the flow's retry carries, so a host's selectors keep working. */
520
- readonly retryPart: string;
521
- }
522
- /** What the surrounding flow resolved, for a part of your own inside `X.Outcome`. */
523
- declare function useOutcome(): Value$1;
524
- /** Binds a resolved outcome to the parts below it. Flows render this; hosts rarely do. */
525
- declare function Provider({ children, value }: {
526
- readonly children: ReactNode;
527
- readonly value: Value$1;
528
- }): ReactElement;
529
- interface State$2 extends Record<string, unknown> {
530
- readonly tone: Tone;
531
- readonly layout: Layout;
532
- }
533
- interface RootProps$7 extends PartProps<"div", State$2> {
534
- readonly tone?: Tone;
535
- readonly layout?: Layout;
536
- }
490
+ /** The plan an attempt holds, whatever step it is on; `null` before there is one. */
491
+ declare const planOf: (state: State$2) => Plan.Model | null;
537
492
  /**
538
- * The outcome itself. It announces, so a customer reading with assistive tech hears it. A `tone`
539
- * or `layout` of its own reaches every part below it, so the glyph and the words agree with the
540
- * root's own attributes.
493
+ * The plan still awaiting its apply, which is what a row of records reports; `null` once one has
494
+ * landed, because from then on an observation answers instead.
541
495
  */
542
- declare function Root$7({ layout, tone, ...props }: RootProps$7): ReactElement;
543
- interface HeaderProps extends PartProps<"div", State$2> {}
544
- /** Media, title, and description together, so the action below them can move on its own. */
545
- declare function Header$1(props: HeaderProps): ReactElement;
546
- interface MediaProps extends PartProps<"div", State$2> {
547
- /** `icon` frames the glyph the way shadcn's `EmptyMedia` does; `default` draws it bare. */
548
- readonly variant?: "default" | "icon";
549
- }
550
- /** The glyph for the tone. Children replace it; `icons` on `DomainKit.Root` replaces the set. */
551
- declare function Media({ variant, ...props }: MediaProps): ReactElement;
552
- interface TitleProps extends PartProps<"div", State$2> {}
553
- /** The heading from the catalog. Children win, for a host that words it itself. */
554
- declare function Title(props: TitleProps): ReactElement;
555
- interface DescriptionProps extends PartProps<"p", State$2> {}
556
- /** What to do about it, from the catalog. An outcome whose title says everything renders none. */
557
- declare function Description(props: DescriptionProps): ReactElement | null;
558
- interface ContentProps extends PartProps<"div", State$2> {}
559
- /**
560
- * The actions under the header. Without children it is the flow's retry, and a flow that allows
561
- * none renders nothing: read-only hides every control that would start a write again.
562
- */
563
- declare function Content(props: ContentProps): ReactElement | null;
564
- /** Media, title, and description in a header, then the action. What `X.Outcome` renders alone. */
565
- declare function Composition(): ReactElement;
566
- //#endregion
567
- //#region src/review.d.ts
568
- interface ReviewState extends Record<string, unknown> {
569
- readonly status: Controller$2["state"]["_tag"];
570
- }
571
- interface KindProps {
572
- readonly controller: Controller$2;
573
- readonly kind: Plan.Kind;
574
- }
575
- interface StatusProps$5 extends PartProps<"p", ReviewState>, KindProps {}
576
- interface OutcomeProps$4 extends RootProps$7, KindProps {}
577
- interface ActionsProps$2 extends PartProps<"div", ReviewState>, KindProps {}
578
- interface DialogProps$3 extends KindProps {
579
- readonly children?: ReactNode;
580
- readonly onOpenChange?: (open: boolean) => void;
581
- readonly open?: boolean;
582
- /** Replace the dialog surface entirely: a drawer, an inline panel, a host modal. */
583
- readonly render?: (props: {
584
- readonly open: boolean;
585
- readonly children: ReactNode;
586
- }) => ReactNode;
587
- readonly trigger?: ReactNode;
588
- }
496
+ declare const pendingPlan: (state: State$2) => Plan.Model | null;
589
497
  declare namespace cleanup_d_exports {
590
- export { Actions$1 as Actions, ActionsProps$1 as ActionsProps, Controller$2 as Controller, Dialog$2 as Dialog, DialogProps$2 as DialogProps, Flow$3 as Flow, FlowProps$3 as FlowProps, Options$3 as Options, Outcome$4 as Outcome, OutcomeProps$3 as OutcomeProps, Root$6 as Root, RootProps$6 as RootProps, RootState$4 as RootState, State$3 as State, Status$4 as Status, StatusProps$4 as StatusProps, useController$3 as useController };
498
+ export { Controller$2 as Controller, Options$3 as Options, State$2 as State, pendingPlan, planOf, useController$3 as useController };
591
499
  }
592
500
  interface Options$3 {
593
501
  readonly domain: string;
594
502
  /** Which apply to undo. Without it, the domain's latest provisioning receipt. */
595
503
  readonly receiptId?: Receipt.ReceiptId;
596
504
  readonly onCleaned?: (receipt: Receipt.Model) => void;
505
+ /** Refuse every step. Defaults to the surrounding `readOnly`. */
506
+ readonly readOnly?: boolean;
597
507
  }
598
508
  /**
599
509
  * Cleanup is bound to a receipt: it removes only what an apply proved DomainKit created. When the
600
510
  * host does not name one, the controller reads the domain's latest from the snapshot.
601
511
  */
602
- declare function useController$3({ domain, onCleaned, receiptId }: Options$3): Controller$2;
603
- interface RootState$4 extends Record<string, unknown> {
604
- readonly status: State$3["_tag"];
512
+ declare function useController$3({ domain, onCleaned, readOnly, receiptId }: Options$3): Controller$2;
513
+ //#endregion
514
+ //#region src/domain-field.d.ts
515
+ type Zone = Transport.Zone;
516
+ type Account = Transport.Zones["connections"][number];
517
+ type AuthMethod = Descriptor["methods"][number];
518
+ /** Where a domain's records would go: the connection that serves it, and in which zone. */
519
+ interface Placement {
520
+ readonly connectionId: string;
521
+ readonly zone: string;
522
+ }
523
+ type ZonesState = Data.TaggedEnum<{
524
+ Loading: {};
525
+ Ready: {
526
+ readonly zones: ReadonlyArray<Zone>;
527
+ readonly connections: ReadonlyArray<Account>;
528
+ readonly providers: ReadonlyArray<Descriptor>;
529
+ };
530
+ Failure: {
531
+ readonly error: DomainKit.Error;
532
+ };
533
+ }>;
534
+ declare const ZonesState: {
535
+ readonly $is: <Tag extends "Failure" | "Loading" | "Ready">(tag: Tag) => (u: unknown) => u is Extract<{
536
+ readonly _tag: "Failure";
537
+ readonly error: DomainKit.Error;
538
+ }, {
539
+ readonly _tag: Tag;
540
+ }> | Extract<{
541
+ readonly _tag: "Loading";
542
+ }, {
543
+ readonly _tag: Tag;
544
+ }> | Extract<{
545
+ readonly _tag: "Ready";
546
+ readonly zones: ReadonlyArray<Zone>;
547
+ readonly connections: ReadonlyArray<Account>;
548
+ readonly providers: ReadonlyArray<Descriptor>;
549
+ }, {
550
+ readonly _tag: Tag;
551
+ }>;
552
+ readonly $match: {
553
+ <Cases extends { readonly [Tag in "Failure" | "Loading" | "Ready"]: (args: Extract<{
554
+ readonly _tag: "Failure";
555
+ readonly error: DomainKit.Error;
556
+ } | {
557
+ readonly _tag: "Loading";
558
+ } | {
559
+ readonly _tag: "Ready";
560
+ readonly zones: ReadonlyArray<Zone>;
561
+ readonly connections: ReadonlyArray<Account>;
562
+ readonly providers: ReadonlyArray<Descriptor>;
563
+ }, {
564
+ readonly _tag: Tag;
565
+ }>) => any; }>(cases: Cases): (value: {
566
+ readonly _tag: "Failure";
567
+ readonly error: DomainKit.Error;
568
+ } | {
569
+ readonly _tag: "Loading";
570
+ } | {
571
+ readonly _tag: "Ready";
572
+ readonly zones: ReadonlyArray<Zone>;
573
+ readonly connections: ReadonlyArray<Account>;
574
+ readonly providers: ReadonlyArray<Descriptor>;
575
+ }) => import("effect/Unify").Unify<ReturnType<Cases["Failure" | "Loading" | "Ready"]>>;
576
+ <Cases extends { readonly [Tag in "Failure" | "Loading" | "Ready"]: (args: Extract<{
577
+ readonly _tag: "Failure";
578
+ readonly error: DomainKit.Error;
579
+ } | {
580
+ readonly _tag: "Loading";
581
+ } | {
582
+ readonly _tag: "Ready";
583
+ readonly zones: ReadonlyArray<Zone>;
584
+ readonly connections: ReadonlyArray<Account>;
585
+ readonly providers: ReadonlyArray<Descriptor>;
586
+ }, {
587
+ readonly _tag: Tag;
588
+ }>) => any; }>(value: {
589
+ readonly _tag: "Failure";
590
+ readonly error: DomainKit.Error;
591
+ } | {
592
+ readonly _tag: "Loading";
593
+ } | {
594
+ readonly _tag: "Ready";
595
+ readonly zones: ReadonlyArray<Zone>;
596
+ readonly connections: ReadonlyArray<Account>;
597
+ readonly providers: ReadonlyArray<Descriptor>;
598
+ }, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Failure" | "Loading" | "Ready"]>>;
599
+ };
600
+ readonly Failure: Data.TaggedEnum.ConstructorFrom<{
601
+ readonly _tag: "Failure";
602
+ readonly error: DomainKit.Error;
603
+ }, "_tag">;
604
+ readonly Loading: Data.TaggedEnum.ConstructorFrom<{
605
+ readonly _tag: "Loading";
606
+ }, "_tag">;
607
+ readonly Ready: Data.TaggedEnum.ConstructorFrom<{
608
+ readonly _tag: "Ready";
609
+ readonly zones: ReadonlyArray<Zone>;
610
+ readonly connections: ReadonlyArray<Account>;
611
+ readonly providers: ReadonlyArray<Descriptor>;
612
+ }, "_tag">;
613
+ };
614
+ interface ZonesController {
615
+ readonly state: ZonesState;
616
+ readonly zones: ReadonlyArray<Zone>;
617
+ readonly connections: ReadonlyArray<Account>;
618
+ readonly providers: ReadonlyArray<Descriptor>;
619
+ readonly refresh: () => void;
605
620
  }
606
- interface RootProps$6 extends PartProps<"div", RootState$4> {
607
- readonly controller: Controller$2;
621
+ interface ZonesOptions {
622
+ /** Only this provider's connections. Omit for every connection this owner holds. */
623
+ readonly provider?: string;
608
624
  }
609
- declare function Root$6({ controller, ...props }: RootProps$6): ReactElement;
610
- interface DialogProps$2 extends Omit<DialogProps$3, "kind"> {}
611
- declare function Dialog$2(props: DialogProps$2): ReactElement;
612
- interface ActionsProps$1 extends Omit<ActionsProps$2, "kind"> {}
613
- declare function Actions$1(props: ActionsProps$1): ReactElement | null;
614
- interface OutcomeProps$3 extends Omit<OutcomeProps$4, "kind"> {}
615
- declare function Outcome$4(props: OutcomeProps$3): ReactElement | null;
616
- interface StatusProps$4 extends Omit<StatusProps$5, "kind"> {}
617
- declare function Status$4(props: StatusProps$4): ReactElement;
618
- interface FlowProps$3 extends Omit<RootProps$6, "controller"> {
619
- readonly domain: string;
620
- readonly onCleaned?: (receipt: Receipt.Model) => void;
621
- readonly receiptId?: Receipt.ReceiptId;
622
- readonly trigger?: ReactNode;
625
+ /**
626
+ * Every zone this owner's connections reach. A connection whose credential the provider turned
627
+ * down is listed in `connections` as `reconnect` and contributes no zones, so one dead account
628
+ * never costs the customer the others.
629
+ */
630
+ declare function useZones({ provider }?: ZonesOptions): ZonesController;
631
+ interface ConnectAccountInput {
632
+ readonly provider: string;
633
+ readonly method: AuthMethod["kind"];
634
+ /** Keyed by the descriptor's field names. Ignored by the interactive methods. */
635
+ readonly values?: Readonly<Record<string, string>>;
623
636
  }
624
- /** Cleanup on its own: a trigger that plans the removal, then the same review dialog. */
625
- declare function Flow$3({ domain, onCleaned, receiptId, trigger, ...props }: FlowProps$3): import("react/jsx-runtime").JSX.Element;
626
- declare namespace provider_d_exports {
627
- export { Descriptor$1 as Descriptor, Mark, MarkProps, MarkState, Marks };
637
+ type AccountsState = Data.TaggedEnum<{
638
+ Loading: {};
639
+ Ready: {};
640
+ Submitting: {
641
+ readonly provider: string;
642
+ };
643
+ Redirecting: {
644
+ readonly url: string;
645
+ };
646
+ Failure: {
647
+ readonly error: DomainKit.Error;
648
+ };
649
+ }>;
650
+ declare const AccountsState: {
651
+ readonly $is: <Tag extends "Failure" | "Loading" | "Ready" | "Redirecting" | "Submitting">(tag: Tag) => (u: unknown) => u is Extract<{
652
+ readonly _tag: "Failure";
653
+ readonly error: DomainKit.Error;
654
+ }, {
655
+ readonly _tag: Tag;
656
+ }> | Extract<{
657
+ readonly _tag: "Loading";
658
+ }, {
659
+ readonly _tag: Tag;
660
+ }> | Extract<{
661
+ readonly _tag: "Ready";
662
+ }, {
663
+ readonly _tag: Tag;
664
+ }> | Extract<{
665
+ readonly _tag: "Redirecting";
666
+ readonly url: string;
667
+ }, {
668
+ readonly _tag: Tag;
669
+ }> | Extract<{
670
+ readonly _tag: "Submitting";
671
+ readonly provider: string;
672
+ }, {
673
+ readonly _tag: Tag;
674
+ }>;
675
+ readonly $match: {
676
+ <Cases extends { readonly [Tag in "Failure" | "Loading" | "Ready" | "Redirecting" | "Submitting"]: (args: Extract<{
677
+ readonly _tag: "Failure";
678
+ readonly error: DomainKit.Error;
679
+ } | {
680
+ readonly _tag: "Loading";
681
+ } | {
682
+ readonly _tag: "Ready";
683
+ } | {
684
+ readonly _tag: "Redirecting";
685
+ readonly url: string;
686
+ } | {
687
+ readonly _tag: "Submitting";
688
+ readonly provider: string;
689
+ }, {
690
+ readonly _tag: Tag;
691
+ }>) => any; }>(cases: Cases): (value: {
692
+ readonly _tag: "Failure";
693
+ readonly error: DomainKit.Error;
694
+ } | {
695
+ readonly _tag: "Loading";
696
+ } | {
697
+ readonly _tag: "Ready";
698
+ } | {
699
+ readonly _tag: "Redirecting";
700
+ readonly url: string;
701
+ } | {
702
+ readonly _tag: "Submitting";
703
+ readonly provider: string;
704
+ }) => import("effect/Unify").Unify<ReturnType<Cases["Failure" | "Loading" | "Ready" | "Redirecting" | "Submitting"]>>;
705
+ <Cases extends { readonly [Tag in "Failure" | "Loading" | "Ready" | "Redirecting" | "Submitting"]: (args: Extract<{
706
+ readonly _tag: "Failure";
707
+ readonly error: DomainKit.Error;
708
+ } | {
709
+ readonly _tag: "Loading";
710
+ } | {
711
+ readonly _tag: "Ready";
712
+ } | {
713
+ readonly _tag: "Redirecting";
714
+ readonly url: string;
715
+ } | {
716
+ readonly _tag: "Submitting";
717
+ readonly provider: string;
718
+ }, {
719
+ readonly _tag: Tag;
720
+ }>) => any; }>(value: {
721
+ readonly _tag: "Failure";
722
+ readonly error: DomainKit.Error;
723
+ } | {
724
+ readonly _tag: "Loading";
725
+ } | {
726
+ readonly _tag: "Ready";
727
+ } | {
728
+ readonly _tag: "Redirecting";
729
+ readonly url: string;
730
+ } | {
731
+ readonly _tag: "Submitting";
732
+ readonly provider: string;
733
+ }, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Failure" | "Loading" | "Ready" | "Redirecting" | "Submitting"]>>;
734
+ };
735
+ readonly Failure: Data.TaggedEnum.ConstructorFrom<{
736
+ readonly _tag: "Failure";
737
+ readonly error: DomainKit.Error;
738
+ }, "_tag">;
739
+ readonly Loading: Data.TaggedEnum.ConstructorFrom<{
740
+ readonly _tag: "Loading";
741
+ }, "_tag">;
742
+ readonly Ready: Data.TaggedEnum.ConstructorFrom<{
743
+ readonly _tag: "Ready";
744
+ }, "_tag">;
745
+ readonly Redirecting: Data.TaggedEnum.ConstructorFrom<{
746
+ readonly _tag: "Redirecting";
747
+ readonly url: string;
748
+ }, "_tag">;
749
+ readonly Submitting: Data.TaggedEnum.ConstructorFrom<{
750
+ readonly _tag: "Submitting";
751
+ readonly provider: string;
752
+ }, "_tag">;
753
+ };
754
+ interface AccountsController {
755
+ readonly state: AccountsState;
756
+ readonly zones: ReadonlyArray<Zone>;
757
+ readonly connections: ReadonlyArray<Account>;
758
+ readonly providers: ReadonlyArray<Descriptor>;
759
+ /** Connect a provider with no domain attached. The account is what the customer is granting. */
760
+ readonly connect: (input: ConnectAccountInput) => void;
761
+ /**
762
+ * Prove an account again for a connection the owner already holds. The connection and its
763
+ * domains stay; only the credential behind it is replaced.
764
+ */
765
+ readonly reconnect: (input: ConnectAccountInput & {
766
+ readonly connectionId: string;
767
+ }) => void;
768
+ readonly refresh: () => void;
628
769
  }
629
- /** A provider as the snapshot describes it: an id, a display name, and its auth methods. */
630
- type Descriptor$1 = Transport.Snapshot["providers"][number];
631
- /** Host-supplied artwork per provider id. A function receives the descriptor it renders for. */
632
- type Marks = Readonly<Record<string, ReactNode | ((provider: Descriptor$1) => ReactNode)>>;
633
- interface MarkState extends Record<string, unknown> {
634
- readonly providerId: string;
770
+ interface AccountsOptions {
771
+ /** Where an interactive method returns the customer. Defaults to the page they started from. */
772
+ readonly returnTo?: string | null;
773
+ /** Refuse the commands that grant an account. Defaults to the surrounding `readOnly`. */
774
+ readonly readOnly?: boolean;
635
775
  }
636
- interface MarkProps extends PartProps<"span", MarkState> {
637
- readonly provider: Descriptor$1;
776
+ /**
777
+ * The accounts this owner holds, and the one way to add another: connect a provider without naming
778
+ * a domain. A token method finishes in place; an interactive one redirects and comes back through
779
+ * the library's own callback, which lands on `returnTo`.
780
+ */
781
+ declare function useAccounts({ readOnly: refused, returnTo }?: AccountsOptions): AccountsController;
782
+ /**
783
+ * The zone a value already sits in: the longest listed zone the value is at or under. Two accounts
784
+ * can serve the same zone, so `preferred` names the one the customer picked and wins among equals;
785
+ * without it the first listed account answers.
786
+ */
787
+ declare const placementOf: (value: string, zones: ReadonlyArray<Zone>, preferred?: Placement | null) => {
788
+ readonly zone: Zone;
789
+ readonly placement: Placement;
790
+ } | null;
791
+ /** Zones the typed value is reaching for: a prefix of the zone, or a subdomain of one. */
792
+ declare const suggestionsFor: (value: string, zones: ReadonlyArray<Zone>) => ReadonlyArray<Zone>;
793
+ /** The value a suggestion completes to: whatever subdomain was typed, then the zone. */
794
+ declare const completionOf: (value: string, zone: Zone) => string;
795
+ interface DomainFieldOptions {
796
+ /** Every zone the surface offers, which `useZones` or `useAccounts` already holds. */
797
+ readonly zones: ReadonlyArray<Zone>;
798
+ readonly value: string;
799
+ readonly onChange: (value: string) => void;
800
+ /**
801
+ * Fires when the value or the account it resolves to changes, so a host holds the two together
802
+ * and submits them together. It reports the value as typed, not only the placement, because a
803
+ * form needs the name the customer is on as well as where its records would go.
804
+ */
805
+ readonly onResolve?: (input: {
806
+ readonly domain: string;
807
+ readonly connection: Placement | null;
808
+ }) => void;
809
+ /** The input's id. The listbox and its options are named from it; one is generated otherwise. */
810
+ readonly id?: string;
811
+ }
812
+ /** The props one suggestion carries, so the option is a listbox option to a screen reader. */
813
+ interface OptionProps {
814
+ readonly "aria-selected": boolean;
815
+ readonly id: string;
816
+ readonly onMouseDown: MouseEventHandler<Element>;
817
+ readonly role: "option";
818
+ }
819
+ interface DomainFieldController {
820
+ /** Whether the listbox is showing: the customer opened it and there is something in it. */
821
+ readonly open: boolean;
822
+ /** The zones the typed value is reaching for, in the order they were listed. */
823
+ readonly suggestions: ReadonlyArray<Zone>;
824
+ /** The suggestion Tab and Enter would complete, or `null` when the list is empty. */
825
+ readonly highlighted: Zone | null;
826
+ /** The zone the value already sits in, with the account its records would go to. */
827
+ readonly found: {
828
+ readonly zone: Zone;
829
+ readonly placement: Placement;
830
+ } | null;
831
+ /** Finish the name from one suggestion, keeping whatever subdomain was typed in front of it. */
832
+ readonly complete: (zone: Zone) => void;
833
+ readonly close: () => void;
834
+ readonly inputProps: {
835
+ readonly "aria-activedescendant": AriaAttributes["aria-activedescendant"];
836
+ readonly "aria-autocomplete": "list";
837
+ readonly "aria-controls": string;
838
+ readonly "aria-expanded": boolean;
839
+ readonly autoComplete: "off";
840
+ readonly id: string;
841
+ readonly onChange: FormEventHandler<HTMLInputElement>;
842
+ readonly onFocus: FocusEventHandler<HTMLInputElement>;
843
+ readonly onKeyDown: KeyboardEventHandler<HTMLInputElement>;
844
+ readonly role: "combobox";
845
+ readonly type: "text";
846
+ readonly value: string;
847
+ };
848
+ readonly listboxProps: {
849
+ readonly "aria-label": string;
850
+ readonly hidden: boolean;
851
+ readonly id: string;
852
+ readonly role: "listbox";
853
+ };
854
+ readonly optionProps: (zone: Zone) => OptionProps;
638
855
  }
639
856
  /**
640
- * A provider's artwork. `DomainKit.Root`'s `marks` decides what a provider looks like; without an
641
- * entry the mark is the provider's initial. Nothing is fetched at render time.
857
+ * One input over every zone the workspace's accounts reach, as props rather than markup. Arrow
858
+ * keys move the highlight, Tab or Enter completes it, Escape closes the list, and `found` says
859
+ * where the records will go.
642
860
  */
643
- declare function Mark({ provider, ...props }: MarkProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
861
+ declare function useDomainField({ id, onChange, onResolve, value, zones }: DomainFieldOptions): DomainFieldController;
644
862
  declare namespace connect_d_exports {
645
- export { Attempt, Candidate, Card$1 as Card, CardProps$1 as CardProps, ConnectInput, Controller$1 as Controller, Descriptor, Dialog$1 as Dialog, DialogProps$1 as DialogProps, DisconnectDialog, DisconnectDialogProps, Discovery, Field, Flow$2 as Flow, FlowProps$2 as FlowProps, Form, FormProps, Invitation, MethodDescriptor, Options$2 as Options, Outcome$3 as Outcome, OutcomeProps$2 as OutcomeProps, Prompt, PromptProps, Root$5 as Root, RootProps$5 as RootProps, RootState$3 as RootState, Snapshot, State$1 as State, Status$3 as Status, StatusProps$3 as StatusProps, answeredInPlace, holdsConnection, hostProvider, offering, useController$2 as useController };
863
+ export { Account, AccountsController, AccountsOptions, AccountsState, Attempt, Candidate, ConnectAccountInput, ConnectInput, Controller$1 as Controller, DescribedMethod, DescribedMethods, Descriptor, Discovery, DomainFieldController, DomainFieldOptions, Field, Invitation, MethodDescriptor, MethodFields, Options$2 as Options, Placement, Reusable, Snapshot, State$1 as State, Zone, ZonesController, ZonesOptions, ZonesState, answeredInPlace, attempted, completionOf, describeMethods, displayName, holdsConnection, hostProvider, offering, placementOf, providerOf, reconnect, rejectedField, reusableConnections, suggestionsFor, useAccounts, useController$2 as useController, useDomainField, useZones };
646
864
  }
647
865
  type Snapshot = Transport.Snapshot;
648
866
  type Discovery = Transport.Discovery;
649
867
  type Candidate = Transport.Candidate;
650
- type Descriptor = Descriptor$1;
868
+ /** A provider as the snapshot describes it: an id, a display name, and its auth methods. */
869
+ type Descriptor = Transport.Snapshot["providers"][number];
651
870
  type MethodDescriptor = Descriptor["methods"][number];
652
871
  type Field = NonNullable<MethodDescriptor["fields"]>[number];
653
872
  /**
@@ -925,6 +1144,11 @@ interface ConnectInput {
925
1144
  }
926
1145
  interface Controller$1 {
927
1146
  readonly domain: string;
1147
+ /**
1148
+ * What this domain's last apply landed, read once per receipt id and held here. `null` until
1149
+ * the snapshot names a receipt, or when the transport carries no provisioning group.
1150
+ */
1151
+ readonly receipt: Receipt.Model | null;
928
1152
  /**
929
1153
  * How many times a connection has been established for this domain on this surface: a token
930
1154
  * connect that landed, or a load that followed this library's own redirect back. It only ever
@@ -957,74 +1181,44 @@ interface Options$2 {
957
1181
  * pass `null` to send none and let the server's `defaultReturnTo` decide.
958
1182
  */
959
1183
  readonly returnTo?: string | null;
1184
+ /**
1185
+ * Refuse every command that changes the connection. Defaults to the surrounding `readOnly`,
1186
+ * which is `DomainKit.Root`'s unless a `DomainKit.ReadOnly` narrows it.
1187
+ */
1188
+ readonly readOnly?: boolean;
960
1189
  }
961
1190
  /**
962
1191
  * The domain's connection, and the four ways to change it. Discovery runs on mount whenever the
963
1192
  * transport declares it and the domain has no connection yet; a discovery failure is not the
964
1193
  * customer's problem, so the provider list still renders.
965
1194
  */
966
- declare function useController$2({ domain, returnTo }: Options$2): Controller$1;
967
- interface RootState$3 extends Record<string, unknown> {
968
- readonly status: State$1["_tag"];
969
- }
970
- interface RootProps$5 extends PartProps<"div", RootState$3> {
971
- readonly controller: Controller$1;
972
- }
973
- declare function Root$5({ controller, ...props }: RootProps$5): ReactElement;
1195
+ declare function useController$2({ domain, readOnly: refused, returnTo }: Options$2): Controller$1;
974
1196
  /**
975
1197
  * Whether a failure is already answered where it was raised: beside the method the customer used.
976
- * A flow rendering its own `Outcome` beside the dialog skips it, so the failure announces once.
1198
+ * A surface rendering one outcome for the whole flow skips it, so the failure announces once.
977
1199
  */
978
1200
  declare const answeredInPlace: (controller: Controller$1) => boolean;
979
1201
  /**
980
1202
  * Whether the surface should read as connected: it is, or a command it started is in flight over a
981
- * connection that was. The card and the dialog it opened stay on screen for the length of the
982
- * command rather than vanishing under the customer half way through it.
1203
+ * connection that was. The provider row and the dialog it opened stay on screen for the length of
1204
+ * the command rather than vanishing under the customer half way through it.
983
1205
  */
984
1206
  declare const holdsConnection: (controller: Controller$1) => boolean;
1207
+ /**
1208
+ * Whether the provider turned the credential down, so the customer must prove the account again.
1209
+ * Proving it re-credits the connection the workspace already holds and leaves its domains where
1210
+ * they are, which is why the surface offers a reconnect rather than a second account.
1211
+ */
1212
+ declare const reconnect: (controller: Controller$1) => boolean;
985
1213
  /**
986
1214
  * The provider whose nameservers serve this domain, as the snapshot describes it. Discovery names
987
1215
  * it by id; without a descriptor there is nothing to draw, so there is no host.
988
1216
  */
989
1217
  declare const hostProvider: (controller: Controller$1) => Descriptor | null;
990
- interface OutcomeProps$2 extends RootProps$7 {
991
- readonly controller: Controller$1;
992
- }
993
- /**
994
- * The last failure as a card: media, the catalog's title and description, and the retry the flow
995
- * allows. Children replace the composition and keep the binding.
996
- */
997
- declare function Outcome$3({ children, controller, ...props }: OutcomeProps$2): ReactElement | null;
998
- interface StatusProps$3 extends PartProps<"p", RootState$3> {
999
- readonly controller: Controller$1;
1000
- }
1001
- declare function Status$3({ controller, ...props }: StatusProps$3): ReactElement;
1002
- interface FormProps extends PartProps<"div", RootState$3> {
1003
- readonly controller: Controller$1;
1004
- /**
1005
- * Narrow to this provider whatever discovery found. The dialog's header menu sets it, so a
1006
- * customer who picks another provider gets the same one-decision surface for it.
1007
- */
1008
- readonly provider?: string;
1009
- }
1010
- /**
1011
- * Everything a disconnected domain can do: a connection discovery already found, the connections
1012
- * this owner already has, then each provider's declared methods.
1013
- */
1014
- declare function Form({ controller, provider: narrowed, ...props }: FormProps): ReactElement;
1015
- interface DialogProps$1 {
1016
- readonly controller: Controller$1;
1017
- readonly children?: ReactNode;
1018
- /** Replace the dialog surface: a drawer, a panel, whatever the host already has. */
1019
- readonly render?: (props: {
1020
- readonly open: boolean;
1021
- readonly children: ReactNode;
1022
- }) => ReactNode;
1023
- readonly title?: ReactNode;
1024
- readonly trigger?: ReactNode;
1025
- }
1026
- /** The connect surface. Without `render` it is a Base UI dialog behind `trigger`. */
1027
- declare function Dialog$1({ children, controller, render, title, trigger }: DialogProps$1): ReactElement;
1218
+ /** The descriptor for one provider id, or `null` when the snapshot describes no such provider. */
1219
+ declare const providerOf: (controller: Controller$1, providerId: string | null | undefined) => Descriptor | null;
1220
+ /** The provider as the customer knows it, falling back to the id when the snapshot has no name. */
1221
+ declare const displayName: (controller: Controller$1, providerId: string) => string;
1028
1222
  /**
1029
1223
  * Whether the flow offers a connect surface: only when discovery names a host, always, or never.
1030
1224
  * `never` is a host that decides for itself, such as a domain already ready without DomainKit; a
@@ -1034,101 +1228,83 @@ type Invitation = "always" | "detected" | "never";
1034
1228
  /**
1035
1229
  * Whether the connect surface has anything to offer for this domain: a provider that serves the
1036
1230
  * zone, a connection discovery already found, one the owner already holds, or a command already
1037
- * running. Never while a connection is held, which is what `holdsConnection` answers. `Prompt`
1038
- * renders on this, and `Domain.Flow` reports it so a host can order its own offers beside
1039
- * DomainKit's rather than competing with them.
1231
+ * running. Never while a connection is held, which is what `holdsConnection` answers. A host reads
1232
+ * it to order its own offers beside DomainKit's rather than competing with them.
1040
1233
  */
1041
1234
  declare const offering: (controller: Controller$1, connect?: Invitation) => boolean;
1042
- interface PromptProps extends PartProps<"div", RootState$3> {
1043
- readonly controller: Controller$1;
1044
- /**
1045
- * `detected` offers nothing when discovery names no host, which is the honest answer for a
1046
- * domain DomainKit cannot write to. `always` offers the all-providers dialog anyway, and
1047
- * `never` offers none.
1048
- */
1049
- readonly connect?: Invitation;
1050
- }
1051
- /**
1052
- * The disconnected offer: the provider whose nameservers serve the domain, what that means, and
1053
- * the trigger that connects it. With no host detected there is nothing to offer, so nothing
1054
- * renders unless the host application asks for the dialog anyway.
1055
- */
1056
- declare function Prompt({ connect, controller, ...props }: PromptProps): ReactElement | null;
1057
- interface DisconnectDialogProps {
1058
- readonly controller: Controller$1;
1059
- /** The receipt the cleanup this dialog ran produced, for a host that tracks its own state. */
1060
- readonly onCleaned?: (receipt: Receipt.Model) => void;
1061
- readonly trigger?: ReactNode;
1235
+ /** A connection this owner already holds that would serve the domain, as one list to offer. */
1236
+ interface Reusable {
1237
+ readonly connectionId: string;
1238
+ /** The zone the connection would attach, when discovery named one. */
1239
+ readonly zone: string | undefined;
1240
+ readonly label: string;
1062
1241
  }
1063
1242
  /**
1064
- * Letting a provider go, with the records DomainKit added as one decision rather than two.
1065
- * Confirming removes what the domain's apply receipt proves DomainKit created, then releases the
1066
- * connection; a plan with nothing in it is not a failure, so it goes straight to the release.
1067
- *
1068
- * The cleanup is this dialog's own, so nothing re-reads the snapshot in between: the disconnect
1069
- * needs the connection the cleanup just used.
1243
+ * Every connection the customer can attach without proving anything: the one discovery resolved,
1244
+ * the candidates a zone choice is between, and the connections the snapshot lists as reusable.
1070
1245
  */
1071
- declare function DisconnectDialog({ controller, onCleaned, trigger }: DisconnectDialogProps): ReactElement;
1072
- interface CardProps$1 extends PartProps<"div", RootState$3> {
1073
- readonly controller: Controller$1;
1074
- /** The receipt a cleanup run from the disconnect dialog produced. */
1075
- readonly onCleaned?: (receipt: Receipt.Model) => void;
1246
+ declare const reusableConnections: (controller: Controller$1) => ReadonlyArray<Reusable>;
1247
+ /** The fields one token method declares, split into what the surface asks for and what it hides. */
1248
+ interface MethodFields {
1249
+ readonly required: ReadonlyArray<Field>;
1250
+ /** The fields a provider does not need, which the surface keeps behind a disclosure. */
1251
+ readonly optional: ReadonlyArray<Field>;
1252
+ /** The field the provider's documentation link explains: the first secret, else the first field. */
1253
+ readonly explains: string | null;
1254
+ }
1255
+ /** One declared auth method, with the fields it asks for already arranged. */
1256
+ interface DescribedMethod {
1257
+ readonly kind: Storage.AuthMethod;
1258
+ readonly descriptor: MethodDescriptor;
1259
+ /** `null` for a method the customer clicks through, which asks for nothing on the page. */
1260
+ readonly fields: MethodFields | null;
1261
+ }
1262
+ /** What one provider offers, in the order the descriptor declares it. */
1263
+ interface DescribedMethods {
1264
+ /** The methods the customer clicks through: OAuth and the provider's own integration. */
1265
+ readonly interactive: ReadonlyArray<DescribedMethod>;
1266
+ /** The methods that ask for credentials on the page. */
1267
+ readonly typed: ReadonlyArray<DescribedMethod>;
1268
+ /**
1269
+ * Both kinds are on offer, so the surface shows the interactive one and a control that opens the
1270
+ * token form in its place: one decision at a time rather than a wall of alternatives.
1271
+ */
1272
+ readonly alternate: boolean;
1076
1273
  }
1274
+ /** One provider's auth methods, arranged for a surface that asks for one decision at a time. */
1275
+ declare const describeMethods: (provider: Descriptor) => DescribedMethods;
1077
1276
  /**
1078
- * A connected domain, with the prompt card's anatomy: the provider's mark, the name the customer
1079
- * knows it by, where the connection stands, and the one action that ends it.
1277
+ * The one field a rejected command was about, if any. A provider that turns down credentials is
1278
+ * answering the secret it was given, and it names no field, so the first secret carries the
1279
+ * answer; anything else is about the request rather than one input.
1080
1280
  */
1081
- declare function Card$1({ controller, onCleaned, ...props }: CardProps$1): ReactElement;
1082
- interface FlowProps$2 extends Omit<RootProps$5, "controller"> {
1083
- readonly domain: string;
1084
- readonly returnTo?: string | null;
1085
- /** Offer the connect dialog even when discovery names no host. Defaults to `detected`. */
1086
- readonly connect?: Invitation;
1087
- /** The receipt a cleanup run from the disconnect dialog produced. */
1088
- readonly onCleaned?: (receipt: Receipt.Model) => void;
1089
- }
1090
- /** Connection on its own: the card once connected, the prompt until then. */
1091
- declare function Flow$2({ connect, domain, onCleaned, returnTo, ...props }: FlowProps$2): ReactElement;
1281
+ declare const rejectedField: (error: DomainKit.Error | null, fields: ReadonlyArray<Field>) => string | null;
1282
+ /** Whether a failure was raised by this provider's method, so the form answers beside it. */
1283
+ declare const attempted: (controller: Controller$1, provider: string, method: Storage.AuthMethod) => DomainKit.Error | null;
1092
1284
  declare namespace provision_d_exports {
1093
- export { Actions, ActionsProps, Controller$2 as Controller, Dialog, DialogProps, Flow$1 as Flow, FlowProps$1 as FlowProps, Options$1 as Options, Outcome$2 as Outcome, OutcomeProps$1 as OutcomeProps, Root$4 as Root, RootProps$4 as RootProps, RootState$2 as RootState, State$3 as State, Status$2 as Status, StatusProps$2 as StatusProps, useController$1 as useController };
1285
+ export { Controller$2 as Controller, Options$1 as Options, State$2 as State, pendingPlan, planOf, useController$1 as useController };
1094
1286
  }
1095
1287
  interface Options$1 {
1096
1288
  readonly domain: string;
1097
1289
  readonly requirements: ReadonlyArray<DnsRecord.Model>;
1098
1290
  readonly onApplied?: (receipt: Receipt.Model) => void;
1291
+ /** Refuse every step. Defaults to the surrounding `readOnly`. */
1292
+ readonly readOnly?: boolean;
1099
1293
  }
1100
- declare function useController$1({ domain, onApplied, requirements }: Options$1): Controller$2;
1101
- interface RootState$2 extends Record<string, unknown> {
1102
- readonly status: State$3["_tag"];
1103
- }
1104
- interface RootProps$4 extends PartProps<"div", RootState$2> {
1105
- readonly controller: Controller$2;
1106
- }
1107
- declare function Root$4({ controller, ...props }: RootProps$4): ReactElement;
1108
- interface DialogProps extends Omit<DialogProps$3, "kind"> {}
1109
- declare function Dialog(props: DialogProps): ReactElement;
1110
- interface ActionsProps extends Omit<ActionsProps$2, "kind"> {}
1111
- /** Approve and Decline for a plan already under review. */
1112
- declare function Actions(props: ActionsProps): ReactElement | null;
1113
- interface OutcomeProps$1 extends Omit<OutcomeProps$4, "kind"> {}
1114
- declare function Outcome$2(props: OutcomeProps$1): ReactElement | null;
1115
- interface StatusProps$2 extends Omit<StatusProps$5, "kind"> {}
1116
- declare function Status$2(props: StatusProps$2): ReactElement;
1117
- interface FlowProps$1 extends Omit<RootProps$4, "controller"> {
1118
- readonly domain: string;
1119
- readonly onApplied?: (receipt: Receipt.Model) => void;
1120
- readonly requirements: ReadonlyArray<DnsRecord.Model>;
1121
- readonly trigger?: ReactNode;
1122
- }
1123
- /** Provisioning on its own: a trigger that plans, then the review dialog. */
1124
- declare function Flow$1({ domain, onApplied, requirements, trigger, ...props }: FlowProps$1): import("react/jsx-runtime").JSX.Element;
1294
+ declare function useController$1({ domain, onApplied, readOnly, requirements }: Options$1): Controller$2;
1125
1295
  declare namespace verify_d_exports {
1126
- export { Controller, Evidence, EvidenceProps, HostEvidence, ObserveAction, ObserveActionProps, Options, Outcome$1 as Outcome, OutcomeProps, Readiness$1 as Readiness, Requirement, Root$3 as Root, RootProps$3 as RootProps, RootState$1 as RootState, State, Status$1 as Status, StatusProps$1 as StatusProps, useController };
1296
+ export { Controller, Evidence, HostEvidence, Options, Readiness$1 as Readiness, Requirement, State, useController, valuesOf };
1127
1297
  }
1128
1298
  type Readiness$1 = Transport.Readiness;
1129
1299
  type HostEvidence = Readiness$1["host"][number];
1130
1300
  type Requirement = Readiness$1["requirements"][number];
1131
1301
  type Evidence = Requirement["evidence"][number];
1302
+ /**
1303
+ * What the observer read back for the requirement's name, or `null` when it read nothing back at
1304
+ * all. Host evidence reports a status the host reached rather than values read off a name, and an
1305
+ * `unknown` observation is a lookup that never answered, which is not the same as finding nothing.
1306
+ */
1307
+ declare const valuesOf: (evidence: Evidence) => ReadonlyArray<string> | null;
1132
1308
  /**
1133
1309
  * Readiness rides on the state rather than a ref, so it can never outlive the render that
1134
1310
  * produced it: a controller pointed at a new domain has no readiness in the very first frame.
@@ -1263,90 +1439,17 @@ interface Options {
1263
1439
  }
1264
1440
  /** Observe once on mount, then follow the readiness's own `nextCheckAt` while polling is on. */
1265
1441
  declare function useController({ domain, polling, requirements }: Options): Controller;
1266
- interface RootState$1 extends Record<string, unknown> {
1267
- readonly status: State["_tag"];
1268
- }
1269
- interface RootProps$3 extends PartProps<"div", RootState$1> {
1270
- readonly controller: Controller;
1271
- }
1272
- declare function Root$3({ controller, ...props }: RootProps$3): ReactElement;
1273
- interface ObserveActionProps extends PartProps<"button", RootState$1> {
1274
- readonly controller: Controller;
1275
- }
1276
- declare function ObserveAction({ controller, ...props }: ObserveActionProps): ReactElement;
1277
- interface EvidenceProps {
1278
- readonly readiness: Readiness$1;
1279
- }
1280
- /**
1281
- * Per-requirement readiness and, below it, the host's own evidence: an SES identity, a certificate,
1282
- * anything DomainKit cannot observe but the host feeds in.
1283
- */
1284
- declare function Evidence({ readiness }: EvidenceProps): ReactElement;
1285
- interface OutcomeProps extends RootProps$7 {
1286
- readonly controller: Controller;
1287
- }
1288
- /**
1289
- * The last observation that failed. Observing reads the world rather than changing the domain, so
1290
- * the retry stays even in read-only.
1291
- */
1292
- declare function Outcome$1({ children, controller, ...props }: OutcomeProps): ReactElement | null;
1293
- interface StatusProps$1 extends Omit<RootProps$3, "render"> {
1294
- /** Replace the popover surface with a panel of the host's own. */
1295
- readonly render?: (props: {
1296
- readonly open: boolean;
1297
- readonly children: ReactNode;
1298
- }) => ReactNode;
1299
- }
1300
- /** The default verification slot: a button that observes, with the evidence behind it. */
1301
- declare function Status$1({ controller, render, ...props }: StatusProps$1): ReactElement;
1302
1442
  declare namespace domain_d_exports {
1303
- export { ActionsSlotProps, ConnectionSlotProps, Flow, FlowProps, FlowState, RecordsSlotProps, Review, Slots, VerificationSlotProps };
1304
- }
1305
- interface RecordsSlotProps {
1306
- readonly records: ReadonlyArray<DnsRecord.Model>;
1307
- readonly readiness: Readiness$1 | null;
1308
- readonly controller: Controller;
1309
- readonly domain: string;
1310
- }
1311
- interface VerificationSlotProps {
1312
- readonly controller: Controller;
1313
- readonly domain: string;
1314
- }
1315
- interface ActionsSlotProps {
1316
- readonly connection: Controller$1;
1317
- readonly provisioning: Controller$2;
1318
- readonly cleanup: Controller$2;
1319
- readonly domain: string;
1320
- }
1321
- interface ConnectionSlotProps {
1322
- readonly controller: Controller$1;
1323
- readonly domain: string;
1324
- /** What the flow was told to offer when discovery names no host. */
1325
- readonly connect: Invitation;
1443
+ export { Flow, FlowOptions, FlowState, useFlow };
1326
1444
  }
1327
1445
  /**
1328
- * Each slot replaces one part of the flow and keeps the rest. Every slot has a default, so
1329
- * `<Domain.Flow domain requirements />` is complete on its own.
1330
- */
1331
- interface Slots {
1332
- /** The requirements table. Defaults to `Records.Table` with readiness when there is any. */
1333
- readonly records?: (props: RecordsSlotProps) => ReactNode;
1334
- /** Defaults to `Verify.Status`. Rendered only when the transport declares `verification`. */
1335
- readonly verification?: (props: VerificationSlotProps) => ReactNode;
1336
- /** Defaults to Approve and Decline, plus cleanup when the transport declares it. */
1337
- readonly actions?: (props: ActionsSlotProps) => ReactNode;
1338
- /** Defaults to `Connect.Card` once connected and `Connect.Prompt` until then. */
1339
- readonly connection?: (props: ConnectionSlotProps) => ReactNode;
1340
- }
1341
- /**
1342
- * What DomainKit has to say about this domain, on the part's data attributes, in `className` and
1343
- * `style` callbacks, and through `onState`. A host reads `connected` and `offering` to order its
1344
- * own offers beside DomainKit's: an offer of its own competes while `offering` is true, and a
1446
+ * What DomainKit has to say about this domain. A host reads `connected` and `offering` to order
1447
+ * its own offers beside DomainKit's: an offer of its own competes while `offering` is true, and a
1345
1448
  * domain DomainKit holds needs none.
1346
1449
  */
1347
- interface FlowState extends Record<string, unknown> {
1450
+ interface FlowState {
1348
1451
  readonly connection: State$1["_tag"];
1349
- readonly provisioning: State$3["_tag"];
1452
+ readonly provisioning: State$2["_tag"];
1350
1453
  /**
1351
1454
  * DomainKit holds a connection for this domain, including while a command it started over that
1352
1455
  * connection is still running. `offering` is never true at the same time.
@@ -1356,6 +1459,11 @@ interface FlowState extends Record<string, unknown> {
1356
1459
  readonly offering: boolean;
1357
1460
  /** Who holds the connection, or whose nameservers serve the zone. */
1358
1461
  readonly provider: string | null;
1462
+ /**
1463
+ * The account the records go to, as the provider labelled the zone when the domain was attached.
1464
+ * `null` until there is an attachment.
1465
+ */
1466
+ readonly label: string | null;
1359
1467
  /**
1360
1468
  * The apply receipt this domain's latest provisioning attempt produced, which is what cleanup
1361
1469
  * plans from. A host's own "remove this domain" surface offers cleanup only when there is one.
@@ -1363,11 +1471,21 @@ interface FlowState extends Record<string, unknown> {
1363
1471
  readonly receiptId: Receipt.ReceiptId | null;
1364
1472
  /** `receiptId !== null`: DomainKit applied records here and can prove which. */
1365
1473
  readonly applied: boolean;
1474
+ /**
1475
+ * The surface may read this domain but not write to it, so a host can say why rather than
1476
+ * leaving a customer in front of a page with nothing on it.
1477
+ */
1478
+ readonly readOnly: boolean;
1366
1479
  }
1367
- interface FlowProps extends Omit<PartProps<"div", FlowState>, "children"> {
1480
+ interface FlowOptions {
1368
1481
  readonly domain: string;
1369
1482
  readonly requirements: ReadonlyArray<DnsRecord.Model>;
1370
- readonly slots?: Slots;
1483
+ /**
1484
+ * Offer the connect surface even when discovery names no host, for a host application that lets
1485
+ * a customer connect a provider the domain's nameservers do not point at, or `never` for a
1486
+ * domain the host has already settled another way. Defaults to `detected`.
1487
+ */
1488
+ readonly connect?: Invitation;
1371
1489
  readonly onApplied?: (receipt: Receipt.Model) => void;
1372
1490
  readonly onCleaned?: (receipt: Receipt.Model) => void;
1373
1491
  /**
@@ -1375,62 +1493,28 @@ interface FlowProps extends Omit<PartProps<"div", FlowState>, "children"> {
1375
1493
  * from; pass `null` to let the server's `defaultReturnTo` decide.
1376
1494
  */
1377
1495
  readonly returnTo?: string | null;
1378
- /** Render this domain's state without the controls that change it. Defaults to the root's. */
1496
+ /** Report this domain's state without the controls that change it. Defaults to the root's. */
1379
1497
  readonly readOnly?: boolean;
1380
- /**
1381
- * Offer the connect dialog even when discovery names no host, for a host application that lets
1382
- * a customer connect a provider the domain's nameservers do not point at, or `never` for a
1383
- * domain the host has already settled another way. Defaults to `detected`.
1384
- */
1385
- readonly connect?: Invitation;
1386
- /** Fires whenever what DomainKit has to say about this domain changes, and once on mount. */
1387
- readonly onState?: (state: FlowState) => void;
1388
- /**
1389
- * `auto` plans and opens the review the moment a connection lands, so connecting and adding the
1390
- * records is one pass rather than three. `manual` waits for the trigger.
1391
- */
1392
- readonly review?: Review;
1393
1498
  }
1394
- /** Whether the flow opens the plan itself once a connection lands, or waits to be asked. */
1395
- type Review = "auto" | "manual";
1396
- /**
1397
- * The whole lifecycle for one domain: connect, review, apply, observe, clean up. The flow renders
1398
- * only what the transport declares, and every part of it is a slot with a default. It adds no
1399
- * layout containers of its own, so a host's grid can place the slot output directly.
1400
- */
1401
- declare function Flow({ connect, domain, onApplied, onCleaned, onState, readOnly, requirements, returnTo, review, slots, ...props }: FlowProps): ReactElement;
1402
- //#endregion
1403
- //#region src/icons.d.ts
1404
- /**
1405
- * Every glyph the package draws, in one place. Parts read them from context; none of them takes
1406
- * an icon prop of its own, so a host swaps the whole set once on `DomainKit.Root`.
1407
- */
1408
- interface Icons {
1409
- /** Points at what a control opens: the provider menu's own marker. */
1410
- readonly chevron: ReactNode;
1411
- readonly close: ReactNode;
1412
- readonly copied: ReactNode;
1413
- readonly copy: ReactNode;
1414
- readonly download: ReactNode;
1415
- readonly external: ReactNode;
1416
- readonly failure: ReactNode;
1417
- readonly pending: ReactNode;
1418
- readonly success: ReactNode;
1419
- readonly warning: ReactNode;
1499
+ interface Flow {
1500
+ readonly domain: string;
1501
+ /** What the host asked for, as the surface renders it row by row. */
1502
+ readonly requirements: ReadonlyArray<DnsRecord.Model>;
1503
+ readonly state: FlowState;
1504
+ readonly connection: Controller$1;
1505
+ readonly provisioning: Controller$2;
1506
+ /** Bound to the domain's latest apply receipt, which is the only thing cleanup may undo. */
1507
+ readonly cleanup: Controller$2;
1508
+ readonly verification: Controller;
1509
+ /** The plan the rows report, which is one still awaiting its apply. */
1510
+ readonly plan: Plan.Model | null;
1511
+ readonly readiness: Readiness$1 | null;
1512
+ /** Which capability groups the transport declares, so a surface renders only what it can run. */
1513
+ readonly capabilities: ReadonlyArray<Transport.Capability>;
1514
+ /** What the flow was told to offer when discovery names no host. */
1515
+ readonly invitation: Invitation;
1420
1516
  }
1421
- declare const defaultIcons: {
1422
- readonly chevron: import("react/jsx-runtime").JSX.Element;
1423
- readonly close: import("react/jsx-runtime").JSX.Element;
1424
- readonly copied: import("react/jsx-runtime").JSX.Element;
1425
- readonly copy: import("react/jsx-runtime").JSX.Element;
1426
- readonly download: import("react/jsx-runtime").JSX.Element;
1427
- readonly external: import("react/jsx-runtime").JSX.Element;
1428
- readonly failure: import("react/jsx-runtime").JSX.Element;
1429
- readonly pending: import("react/jsx-runtime").JSX.Element;
1430
- readonly success: import("react/jsx-runtime").JSX.Element;
1431
- readonly warning: import("react/jsx-runtime").JSX.Element;
1432
- };
1433
- declare function useIcons(): Icons;
1517
+ declare function useFlow({ connect, domain, onApplied, onCleaned, readOnly, requirements, returnTo }: FlowOptions): Flow;
1434
1518
  declare namespace messages_d_exports {
1435
1519
  export { Catalog, EvidenceLike, Outcome, OutcomeContext, english, failure, merge, outcome };
1436
1520
  }
@@ -1464,8 +1548,10 @@ interface Catalog {
1464
1548
  readonly useTokenInstead: string;
1465
1549
  /** Returns from one method's form to the provider's methods. */
1466
1550
  readonly back: string;
1467
- /** The connected card's own line, beside the provider's name. */
1468
- readonly connected: string;
1551
+ /** The connected card's identity: who holds the connection and which account it reaches. */
1552
+ readonly connectedAccount: (provider: string, account: string) => string;
1553
+ /** How many records this domain's apply receipt proves DomainKit added. */
1554
+ readonly recordsAdded: (count: number) => string;
1469
1555
  readonly needsReconnect: string;
1470
1556
  /** The disconnect dialog's scope question, when the connection serves other domains too. */
1471
1557
  readonly disconnectScope: string;
@@ -1477,6 +1563,14 @@ interface Catalog {
1477
1563
  readonly download: string;
1478
1564
  readonly useConnection: (label: string) => string;
1479
1565
  readonly chooseZone: string;
1566
+ /** The domain field's listbox, named for a customer reading it with assistive technology. */
1567
+ readonly zoneSuggestions: string;
1568
+ /** Which account a typed domain's records will go to. */
1569
+ readonly recordsGoTo: (provider: string, account: string) => string;
1570
+ /** A typed domain no connected account reaches; the customer adds the records by hand. */
1571
+ readonly notInConnectedAccount: string;
1572
+ /** A held connection whose credential the provider turned down. */
1573
+ readonly reconnectAccount: (account: string) => string;
1480
1574
  readonly getToken: string;
1481
1575
  readonly loading: string;
1482
1576
  readonly connecting: string;
@@ -1494,11 +1588,16 @@ interface Catalog {
1494
1588
  /** The dialog heading, and the trigger, when no provider is named yet. */
1495
1589
  readonly connectAnyTitle: string;
1496
1590
  /** What the disconnected prompt says about the provider whose nameservers serve the domain. */
1497
- readonly hostOwnsZone: string;
1591
+ readonly hostDetected: (provider: string) => string;
1498
1592
  readonly connectDescription: (domain: string) => string;
1499
1593
  readonly connectedTo: (provider: string) => string;
1500
1594
  /** Shown where a connect control would be when the customer may not connect. */
1501
1595
  readonly notConnected: string;
1596
+ /**
1597
+ * What a customer who may read the domain but not write to it is told in place of the connect
1598
+ * control, so the surface explains the gap rather than leaving an empty row.
1599
+ */
1600
+ readonly administratorConnects: (provider: string) => string;
1502
1601
  readonly reconnectRequired: (provider: string) => string;
1503
1602
  readonly disconnectTitle: (provider: string) => string;
1504
1603
  /**
@@ -1533,6 +1632,10 @@ interface Catalog {
1533
1632
  readonly declineReason: (reason: string) => string;
1534
1633
  readonly operation: (operation: Plan.Operation) => string;
1535
1634
  readonly conflictReason: (reason: Plan.Conflict["reason"]) => string;
1635
+ /** What to do about a conflict, in the row that reports it. */
1636
+ readonly conflictAdvice: (reason: Plan.Conflict["reason"]) => string;
1637
+ /** What a pending plan holds for one row: a write, a record already there, or a blocker. */
1638
+ readonly planStatus: (operation: Plan.Operation) => string;
1536
1639
  readonly attemptStatus: (status: Storage.AttemptStatus) => string;
1537
1640
  readonly recordsCaption: (domain: string) => string;
1538
1641
  readonly headingType: string;
@@ -1614,74 +1717,49 @@ declare const merge: (overrides?: Partial<Catalog>) => Catalog;
1614
1717
  declare const outcome: (error: DomainKit.Error, catalog: Catalog, context?: OutcomeContext) => Outcome;
1615
1718
  /** The same failure as one sentence, for a host that renders text rather than a card. */
1616
1719
  declare const failure: (error: DomainKit.Error, catalog: Catalog, context?: OutcomeContext) => string;
1617
- declare namespace theme_d_exports {
1618
- export { Theme, toStyle };
1619
- }
1620
- interface Theme {
1621
- readonly accent?: string;
1622
- readonly accentContrast?: string;
1623
- readonly backdrop?: string;
1624
- readonly background?: string;
1625
- readonly border?: string;
1626
- readonly danger?: string;
1627
- readonly dangerContrast?: string;
1628
- readonly fill?: string;
1629
- readonly fontFamily?: string;
1630
- readonly muted?: string;
1631
- readonly radius?: string;
1632
- readonly shadow?: string;
1633
- readonly success?: string;
1634
- readonly text?: string;
1635
- readonly warning?: string;
1636
- }
1637
- declare function toStyle(theme?: Theme): CSSProperties;
1638
1720
  declare namespace domain_kit_d_exports {
1639
- export { ReadOnly, Root$2 as Root, RootProps$2 as RootProps, RootState, StableTransport, useCapabilities, useDomainKit, useReadOnly, useTransport };
1640
- }
1641
- interface RootState extends Record<string, unknown> {
1642
- readonly colorScheme: "dark" | "inherit" | "light";
1721
+ export { ReadOnly, Root, RootProps, StableTransport, useCapabilities, useDomainKit, useMessages, useReadOnly, useTransport };
1643
1722
  }
1644
- interface RootProps$2 extends Omit<PartProps<"div", RootState>, "children"> {
1723
+ interface RootProps {
1645
1724
  readonly children: ReactNode;
1646
- readonly colorScheme?: RootState["colorScheme"];
1647
- readonly icons?: Partial<Icons>;
1648
- readonly marks?: Marks;
1649
1725
  readonly messages?: Partial<Catalog>;
1650
1726
  /** Where an interactive provider flow sends the customer. Defaults to `window.location`. */
1651
1727
  readonly navigate?: (url: string) => void;
1652
1728
  readonly onEvent?: Listener;
1653
- readonly portalContainer?: HTMLElement | null;
1654
1729
  /**
1655
- * Render the state without the controls that change it, for a customer who may read the domain
1656
- * but not write to it. Capability gating already hides a group the transport does not declare;
1657
- * this covers authorization the transport cannot express, such as a member of an organisation.
1730
+ * Report the domain's state without the controls that change it, for a customer who may read
1731
+ * the domain but not write to it. Capability gating already hides a group the transport does
1732
+ * not declare; this covers authorization the transport cannot express, such as a member of an
1733
+ * organisation. Every flow carries it on `FlowState.readOnly`, so a surface can explain it.
1658
1734
  */
1659
1735
  readonly readOnly?: boolean;
1660
1736
  /** Bump to re-inspect every mounted domain after a change the UI did not make. */
1661
1737
  readonly revision?: number;
1662
- readonly theme?: Theme;
1663
1738
  /** The transport, by value. Rebuilding it inline on every render does not restart controllers. */
1664
1739
  readonly transport: Transport.Interface;
1665
1740
  }
1666
1741
  interface ContextValue {
1667
1742
  readonly capabilities: ReadonlyArray<Transport.Capability>;
1668
- readonly colorScheme: RootState["colorScheme"];
1669
1743
  readonly emit: Listener;
1670
- readonly marks: Marks;
1671
1744
  readonly messages: Catalog;
1672
1745
  readonly navigate: (url: string) => void;
1673
- readonly portalContainer: RefObject<HTMLElement | null>;
1674
1746
  readonly readOnly: boolean;
1675
1747
  readonly revision: number;
1676
- readonly themeStyle: ReturnType<typeof toStyle>;
1677
1748
  readonly transport: Transport.Interface;
1678
1749
  }
1679
1750
  interface StableTransport {
1680
1751
  readonly transport: Transport.Interface;
1681
1752
  readonly capabilities: ReadonlyArray<Transport.Capability>;
1682
1753
  }
1683
- declare function Root$2({ children, colorScheme, icons, marks, messages, navigate, onEvent, portalContainer, readOnly, revision, theme, transport, ...props }: RootProps$2): import("react/jsx-runtime").JSX.Element;
1754
+ /**
1755
+ * The transport, the catalog, and the two host callbacks every hook below reads. It renders no
1756
+ * element of its own: `@domainkit/react` supplies behaviour, state, copy, and accessibility, and
1757
+ * the host application supplies the markup.
1758
+ */
1759
+ declare function Root({ children, messages, navigate, onEvent, readOnly, revision, transport }: RootProps): ReactElement;
1684
1760
  declare function useDomainKit(): ContextValue;
1761
+ /** The catalog `DomainKit.Root` holds, with the host's overrides already merged in. */
1762
+ declare function useMessages(): Catalog;
1685
1763
  /** The transport `DomainKit.Root` holds, with the identity it keeps for the whole mount. */
1686
1764
  declare function useTransport(): Transport.Interface;
1687
1765
  /** Narrow one subtree to read-only without touching the rest of the page. */
@@ -1689,39 +1767,22 @@ declare function ReadOnly({ children, value }: {
1689
1767
  readonly children: ReactNode;
1690
1768
  readonly value: boolean;
1691
1769
  }): import("react/jsx-runtime").JSX.Element;
1692
- /** Whether this part may offer controls that change the domain. */
1770
+ /** Whether this surface may offer controls that change the domain. */
1693
1771
  declare function useReadOnly(): boolean;
1694
- /** Which capability groups the host's transport declares, for gating a custom part. */
1772
+ /** Which capability groups the host's transport declares, for gating a surface of your own. */
1695
1773
  declare function useCapabilities(): ReadonlyArray<Transport.Capability>;
1696
- declare namespace operations_d_exports {
1697
- export { Item, ItemProps, Kind, List, ListProps, Name, Reason$1 as Reason, Record$1 as Record, Root$1 as Root, RootProps$1 as RootProps, Type };
1698
- }
1699
- declare const Kind: (props: PartProps<"span", Record$1<string, unknown>>) => ReactElement;
1700
- declare const Type: (props: PartProps<"strong", Record$1<string, unknown>>) => ReactElement;
1701
- declare const Record$1: (props: PartProps<"span", Record$1<string, unknown>>) => ReactElement;
1702
- declare const Name: (props: PartProps<"span", Record$1<string, unknown>>) => ReactElement;
1703
- declare const Reason$1: (props: PartProps<"span", Record$1<string, unknown>>) => ReactElement;
1704
- interface ItemProps extends PartProps<"li", {
1705
- readonly operation: Plan.Operation["_tag"];
1706
- }> {
1707
- readonly operation: Plan.Operation;
1708
- }
1709
- declare function Item({ operation, ...props }: ItemProps): ReactElement;
1710
- interface RootProps$1 extends PartProps<"ul", {
1711
- readonly count: number;
1712
- readonly kind: Plan.Kind;
1713
- }> {
1714
- readonly count?: number;
1715
- readonly kind: Plan.Kind;
1716
- }
1717
- declare function Root$1({ count, kind, ...props }: RootProps$1): ReactElement;
1718
- interface ListProps extends Omit<RootProps$1, "children" | "count" | "kind"> {
1719
- readonly plan: Plan.Model;
1774
+ declare namespace outcome_d_exports {
1775
+ export { Outcome, OutcomeContext, describe, useDescribe };
1720
1776
  }
1721
- /** Every operation the plan holds, in plan order, so a customer reviews exactly what will run. */
1722
- declare function List({ plan, ...props }: ListProps): ReactElement;
1777
+ /** The catalog's title and description for one failure. */
1778
+ declare const describe: (error: DomainKit.Error, catalog: Catalog, context?: OutcomeContext) => Outcome;
1779
+ /**
1780
+ * `describe` bound to the catalog `DomainKit.Root` holds. The reason alone cannot name the
1781
+ * provider a customer typed a token for, so the surface supplies it in the context.
1782
+ */
1783
+ declare function useDescribe(): (error: DomainKit.Error, context?: OutcomeContext) => Outcome;
1723
1784
  declare namespace records_d_exports {
1724
- export { Body, Caption, Card, CardContent, CardHeader, CardProps, CardTitle, Cell, CopyController, CopyValue, CopyValueProps, Footer, Head, Header, Purpose, Readiness, RequirementStatus, Root, RootProps, Row, Status, StatusProps, Table, TableProps, Value, ZoneFile, ZoneFileProps, copyText, downloadZoneFile, identity, requirementsKey, statusOf, toZoneFile, useCopy };
1785
+ export { CopyController, Readiness, RequirementStatus, Sources, Standing, copyText, downloadZoneFile, identity, requirementsKey, statusOf, toZoneFile, useCopy };
1725
1786
  }
1726
1787
  type Readiness = Transport.Readiness;
1727
1788
  type RequirementStatus = Readiness["requirements"][number]["status"];
@@ -1733,45 +1794,24 @@ interface CopyController {
1733
1794
  readonly copy: () => void;
1734
1795
  }
1735
1796
  declare function useCopy(value: string, resetAfter?: number): CopyController;
1736
- interface CopyValueProps extends PartProps<"span", {
1737
- readonly copied: boolean;
1738
- }> {
1739
- readonly value: string;
1740
- }
1741
- declare function CopyValue({ value, ...props }: CopyValueProps): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
1742
- interface ZoneFileProps extends PartProps<"div", {
1743
- readonly count: number;
1744
- }> {
1745
- readonly domain: string;
1746
- readonly records: ReadonlyArray<DnsRecord.Model>;
1747
- }
1748
- declare function ZoneFile({ domain, records, ...props }: ZoneFileProps): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
1749
- /** The readiness this record reached, or `null` when nothing has observed it. */
1750
- declare const statusOf: (record: DnsRecord.Model, readiness: Readiness | null | undefined) => RequirementStatus | null;
1751
- interface StatusProps extends PartProps<"span", {
1752
- readonly status: RequirementStatus;
1753
- }> {
1797
+ /**
1798
+ * What a row has to say about one record: while a plan is pending it is what the plan will do to
1799
+ * it, and otherwise what the last observation read back.
1800
+ */
1801
+ type Standing = {
1802
+ readonly _tag: "Operation";
1803
+ readonly operation: Plan.Operation;
1804
+ } | {
1805
+ readonly _tag: "Readiness";
1754
1806
  readonly status: RequirementStatus;
1807
+ };
1808
+ interface Sources {
1809
+ /** A plan still awaiting its apply. Pass `null` once one has landed; readiness answers then. */
1810
+ readonly plan?: Plan.Model | null | undefined;
1811
+ readonly readiness?: Readiness | null | undefined;
1755
1812
  }
1756
- declare function Status({ status, ...props }: StatusProps): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
1757
- declare const Header: (props: PartProps<"thead", Record<string, unknown>>) => ReactElement;
1758
- declare const Body: (props: PartProps<"tbody", Record<string, unknown>>) => ReactElement;
1759
- declare const Footer: (props: PartProps<"tfoot", Record<string, unknown>>) => ReactElement;
1760
- declare const Row: (props: PartProps<"tr", Record<string, unknown>>) => ReactElement;
1761
- declare const Head: (props: PartProps<"th", Record<string, unknown>>) => ReactElement;
1762
- declare const Cell: (props: PartProps<"td", Record<string, unknown>>) => ReactElement;
1763
- declare const Caption: (props: PartProps<"caption", Record<string, unknown>>) => ReactElement;
1764
- declare const Value: (props: PartProps<"span", Record<string, unknown>>) => ReactElement;
1765
- declare const Purpose: (props: PartProps<"span", Record<string, unknown>>) => ReactElement;
1766
- declare const CardHeader: (props: PartProps<"div", Record<string, unknown>>) => ReactElement;
1767
- declare const CardTitle: (props: PartProps<"strong", Record<string, unknown>>) => ReactElement;
1768
- declare const CardContent: (props: PartProps<"dl", Record<string, unknown>>) => ReactElement;
1769
- interface RootProps extends PartProps<"table", {
1770
- readonly count: number;
1771
- }> {
1772
- readonly count?: number;
1773
- }
1774
- declare function Root({ count, ...props }: RootProps): import("react/jsx-runtime").JSX.Element;
1813
+ /** The row's standing, or `null` when neither a plan nor an observation covers the record. */
1814
+ declare const statusOf: (record: DnsRecord.Model, sources: Sources) => Standing | null;
1775
1815
  /** A stable React key for a requirement: type, name, and data identify a record. */
1776
1816
  declare const identity: (record: DnsRecord.Model) => string;
1777
1817
  /**
@@ -1781,22 +1821,6 @@ declare const identity: (record: DnsRecord.Model) => string;
1781
1821
  * particular decides whether a name may hold anything else, so readiness turns on it.
1782
1822
  */
1783
1823
  declare const requirementsKey: (records: ReadonlyArray<DnsRecord.Model>) => string;
1784
- interface CardProps extends PartProps<"section", {
1785
- readonly record: string;
1786
- }> {
1787
- readonly readiness?: Readiness | null;
1788
- readonly record: DnsRecord.Model;
1789
- }
1790
- declare function Card({ readiness, record, ...props }: CardProps): ReactElement;
1791
- interface TableProps extends PartProps<"table", {
1792
- readonly count: number;
1793
- }> {
1794
- readonly caption?: string;
1795
- readonly readiness?: Readiness | null;
1796
- readonly records: ReadonlyArray<DnsRecord.Model>;
1797
- }
1798
- /** The default records presentation: one row per requirement, with readiness when there is any. */
1799
- declare function Table({ caption, readiness, records, ...props }: TableProps): ReactElement;
1800
1824
  declare namespace testing_d_exports {
1801
1825
  export { RecordedCall, RecordingTransport, TransportOptions, transport$1 as transport };
1802
1826
  }
@@ -1848,5 +1872,5 @@ declare const Failure: {
1848
1872
  }, "_tag">;
1849
1873
  };
1850
1874
  //#endregion
1851
- export { type ClassName, cleanup_d_exports as Cleanup, connect_d_exports as Connect, domain_d_exports as Domain, domain_kit_d_exports as DomainKit, Event, Failure, type Icons, type Listener, messages_d_exports as Messages, operations_d_exports as Operations, outcome_d_exports as Outcome, type PartProps, provider_d_exports as Provider, provision_d_exports as Provision, records_d_exports as Records, type Style, testing_d_exports as Testing, theme_d_exports as Theme, verify_d_exports as Verify, defaultIcons, useIcons };
1875
+ export { cleanup_d_exports as Cleanup, connect_d_exports as Connect, domain_d_exports as Domain, domain_kit_d_exports as DomainKit, Event, Failure, type Listener, messages_d_exports as Messages, outcome_d_exports as Outcome, provision_d_exports as Provision, records_d_exports as Records, testing_d_exports as Testing, verify_d_exports as Verify };
1852
1876
  //# sourceMappingURL=index.d.mts.map