@cloudgrid-io/ui 0.11.0 → 0.12.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.
@@ -0,0 +1,140 @@
1
+ import * as React from "react";
2
+ import { Button } from "../ui/button.js";
3
+ /**
4
+ * The sign-in methods, in one place.
5
+ *
6
+ * ## Why this exists (#129)
7
+ *
8
+ * The console rendered its sign-in options in four separate places and they
9
+ * diverged: the invitation-accept screen offered ONLY Google, so an invitee
10
+ * without a Google account could not accept an invitation at all — no error, no
11
+ * fallback, on the one screen whose whole purpose is to let an invited person
12
+ * in. A fifth hand-written list would be the same mistake with a larger blast
13
+ * radius. So the list renders through one component, and adding a provider is
14
+ * one edit at the call site that owns the list rather than four that can
15
+ * silently disagree.
16
+ *
17
+ * ## Presentation only
18
+ *
19
+ * The same line #117 / #119 / #121 / #126 drew. This block holds no auth logic,
20
+ * no provider SDK, no redirect and no token; it renders the methods it is
21
+ * handed and never implies a provider that does not exist. Starting Google
22
+ * OAuth needs a session code the page mints — so that is a callback the page
23
+ * owns. The email option is a LINK, deliberately: middle-click and "open in new
24
+ * tab" work, and the target is visible in the status bar.
25
+ *
26
+ * ## The one thing it does own: `carry`
27
+ *
28
+ * Sign-in must not lose state that rides the URL — where to land afterwards
29
+ * (`return_to`), the onboarding path a NEW user should walk (`arrival`), and
30
+ * for the device flow the code being authorized (`code`) and the client that
31
+ * started it (`source`). Forgetting one is not a visual bug and shows up
32
+ * nowhere: sign-in succeeds and the person silently lands somewhere generic or
33
+ * walks the wrong flow. That has happened three times (`ai_tool`, `invite`,
34
+ * `watermark`).
35
+ *
36
+ * So the page declares what must survive ONCE, in `carry`, and the block
37
+ * applies it to every method uniformly: appended to each link method's `href`,
38
+ * handed to each action method's `onSelect`. The block never knows what the
39
+ * keys mean — the page wires, the block carries.
40
+ *
41
+ * One obligation stays with the caller, loudly: **validate `return_to` before
42
+ * handing it in.** The console keeps its `isSafePostAuthReturn` allowlist and
43
+ * this package cannot import it; an unvalidated `return_to` is an open
44
+ * redirect. Pass the value already validated with the same allowlist the
45
+ * post-auth resolver uses, so there is one thing to audit rather than two.
46
+ *
47
+ * ## Methods are groups
48
+ *
49
+ * `methods` is an array of GROUPS: buttons within a group stack tight, and the
50
+ * divider — "OR" unless `divider` says otherwise — renders between groups.
51
+ * `[[google], [email]]` is the console's current screen; a second OAuth
52
+ * provider joins the first group with no API change. The grouping is what lets
53
+ * the divider sit "between the providers and email" without the block knowing
54
+ * which method is which.
55
+ *
56
+ * ## Icons are handed in
57
+ *
58
+ * Every mark in this package is flattened to `currentColor` and the literal
59
+ * gate keeps it that way, so the four-colour Google G cannot live here without
60
+ * a brand decision. Consumers pass their own marks (`icon`), which the block
61
+ * hides from assistive tech: the accessible name is exactly `label`.
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * <SignInOptions
66
+ * methods={[
67
+ * [{ id: "google", label: "Continue with Google", icon: <GoogleIcon />, onSelect: startGoogle }],
68
+ * [{ id: "email", label: "Continue with Email", icon: <Mail />, href: "/auth/email" }],
69
+ * ]}
70
+ * carry={{ return_to: safeReturn, arrival, code, source }}
71
+ * renderLink={(p) => <Link {...p} />}
72
+ * />
73
+ * ```
74
+ */
75
+ interface SignInMethodBase {
76
+ /** Stable, never shown. Lands on the button as `data-method`. */
77
+ id: string;
78
+ /** The words on the button, and its exact accessible name. */
79
+ label: string;
80
+ /**
81
+ * The method's mark, ~20px inside a fixed 5-unit slot at the inline start.
82
+ * Hidden from assistive tech here, so any mark keeps the name = `label`.
83
+ */
84
+ icon?: React.ReactNode;
85
+ disabled?: boolean;
86
+ }
87
+ /**
88
+ * Exactly one of `href` (a link method: a real anchor, `carry` appended) or
89
+ * `onSelect` (an action method: the page owns what selecting it starts, and
90
+ * receives the carried entries). The union is enforced in the types because a
91
+ * method with both would hide which one wins, and a method with neither is a
92
+ * button that cannot sign anyone in — worse than an absent one.
93
+ */
94
+ export type SignInMethod = (SignInMethodBase & {
95
+ href: string;
96
+ onSelect?: never;
97
+ }) | (SignInMethodBase & {
98
+ href?: never;
99
+ onSelect: (carried: Readonly<Record<string, string>>) => void;
100
+ });
101
+ export interface SignInOptionsProps {
102
+ /** Groups of methods. The divider renders between groups, never inside one. */
103
+ methods: ReadonlyArray<readonly SignInMethod[]>;
104
+ /**
105
+ * What every method must carry through sign-in — `return_to`, `arrival`,
106
+ * device `code`, `source`, whatever the page cannot afford to lose. Entries
107
+ * that are `null`, `undefined` or empty are dropped, so query params can be
108
+ * passed straight through. Appended to link methods' `href`; handed to
109
+ * action methods' `onSelect`.
110
+ */
111
+ carry?: Readonly<Record<string, string | null | undefined>>;
112
+ /** Replaces the "OR" between groups. The rule itself stays. */
113
+ divider?: React.ReactNode;
114
+ /**
115
+ * Renders the anchor for link methods, for consumers with a framework link —
116
+ * `(p) => <Link {...p} />`. Defaults to a plain `<a>`, which works
117
+ * everywhere; the framework link is an optimisation, not a requirement.
118
+ */
119
+ renderLink?: (props: {
120
+ href: string;
121
+ }) => React.ReactElement;
122
+ className?: string;
123
+ }
124
+ /**
125
+ * One full-width method row: the library `Button` (`variant="outline"` — white
126
+ * fill, hairline border, ink label) sized up to the ~52px onboarding rhythm.
127
+ * The icon sits at the inline start, positioned absolute so the label stays
128
+ * centered rather than being pushed off-center.
129
+ *
130
+ * Exported so a surface composing its own screen (the console's styleguide
131
+ * pilot) renders the same row `SignInOptions` does, instead of keeping a
132
+ * private twin. Every remaining prop passes through to `Button`.
133
+ */
134
+ export declare function SignInMethodButton({ icon, label, className, ...props }: Omit<React.ComponentProps<typeof Button>, "children"> & {
135
+ icon?: React.ReactNode;
136
+ label: string;
137
+ }): React.JSX.Element;
138
+ export declare function SignInOptions({ methods, carry, divider, renderLink, className, }: SignInOptionsProps): React.JSX.Element;
139
+ export {};
140
+ //# sourceMappingURL=sign-in-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in-options.d.ts","sourceRoot":"","sources":["../../src/blocks/sign-in-options.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAI7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AAEH,UAAU,gBAAgB;IACxB,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAA;IACV,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GACpB,CAAC,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACvD,CAAC,gBAAgB,GAAG;IAClB,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAA;CAC9D,CAAC,CAAA;AAEN,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,OAAO,EAAE,aAAa,CAAC,SAAS,YAAY,EAAE,CAAC,CAAA;IAC/C;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAA;IAC3D,+DAA+D;IAC/D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,YAAY,CAAA;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAuBD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG;IACzD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd,qBAsBA;AAmBD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,KAAK,EACL,OAAO,EACP,UAAU,EACV,SAAS,GACV,EAAE,kBAAkB,qBAoDpB"}
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Button } from "../ui/button.js";
5
+ import { Separator } from "../ui/separator.js";
6
+ import { cn } from "../lib/cloudgrid-cn.js";
7
+ /** `carry` with the empty entries dropped, in declaration order. */
8
+ function carriedEntries(carry) {
9
+ if (!carry)
10
+ return [];
11
+ return Object.entries(carry).filter((entry) => typeof entry[1] === "string" && entry[1] !== "");
12
+ }
13
+ /** `href` with the carried entries appended, hash kept at the end. */
14
+ function withCarried(href, entries) {
15
+ if (entries.length === 0)
16
+ return href;
17
+ const hashAt = href.indexOf("#");
18
+ const base = hashAt === -1 ? href : href.slice(0, hashAt);
19
+ const hash = hashAt === -1 ? "" : href.slice(hashAt);
20
+ const joined = new URLSearchParams(entries).toString();
21
+ return `${base}${base.includes("?") ? "&" : "?"}${joined}${hash}`;
22
+ }
23
+ /**
24
+ * One full-width method row: the library `Button` (`variant="outline"` — white
25
+ * fill, hairline border, ink label) sized up to the ~52px onboarding rhythm.
26
+ * The icon sits at the inline start, positioned absolute so the label stays
27
+ * centered rather than being pushed off-center.
28
+ *
29
+ * Exported so a surface composing its own screen (the console's styleguide
30
+ * pilot) renders the same row `SignInOptions` does, instead of keeping a
31
+ * private twin. Every remaining prop passes through to `Button`.
32
+ */
33
+ export function SignInMethodButton({ icon, label, className, ...props }) {
34
+ return (_jsxs(Button, { variant: "outline", "data-slot": "sign-in-method", className: cn("relative h-[52px] w-full justify-center rounded-xl text-body-md font-medium", className), ...props, children: [icon == null ? null : (_jsx("span", { "aria-hidden": "true", className: "absolute left-4 flex size-5 items-center justify-center [&_svg]:size-5", children: icon })), label] }));
35
+ }
36
+ /** The "OR" rule between method groups. Decorative, and hidden as such. */
37
+ function SignInOptionsDivider({ children }) {
38
+ return (_jsxs("div", { "data-slot": "sign-in-options-divider", "aria-hidden": "true", className: "my-5 flex items-center gap-3", children: [_jsx(Separator, { className: "flex-1" }), _jsx("span", { className: "text-caption font-medium text-faint", children: children ?? "OR" }), _jsx(Separator, { className: "flex-1" })] }));
39
+ }
40
+ export function SignInOptions({ methods, carry, divider, renderLink, className, }) {
41
+ const entries = carriedEntries(carry);
42
+ const carried = Object.fromEntries(entries);
43
+ const groups = methods.filter((group) => group.length > 0);
44
+ return (_jsx("div", { "data-slot": "sign-in-options", className: className, children: groups.map((group, index) => (
45
+ // Groups have no identity of their own — position is what they mean.
46
+ // eslint-disable-next-line react/no-array-index-key
47
+ _jsxs(React.Fragment, { children: [index > 0 && _jsx(SignInOptionsDivider, { children: divider }), _jsx("div", { className: "grid gap-3", children: group.map((method) => method.href !== undefined ? (
48
+ /*
49
+ A real anchor rather than an onClick. Base UI's Button warns
50
+ when the rendered element is not a <button>, hence
51
+ `nativeButton={false}`, and it stamps `role="button"` on a
52
+ non-native target — put back to `link`, because this one
53
+ really does navigate.
54
+ */
55
+ _jsx(SignInMethodButton, { "data-method": method.id, render: renderLink?.({ href: withCarried(method.href, entries) }) ?? (_jsx("a", { href: withCarried(method.href, entries) })), nativeButton: false, role: "link", icon: method.icon, label: method.label, disabled: method.disabled }, method.id)) : (_jsx(SignInMethodButton, { "data-method": method.id, icon: method.icon, label: method.label, disabled: method.disabled, onClick: () => method.onSelect(carried) }, method.id))) })] }, index))) }));
56
+ }
57
+ //# sourceMappingURL=sign-in-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in-options.js","sourceRoot":"","sources":["../../src/blocks/sign-in-options.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -42,6 +42,7 @@ export * from "./blocks/pricing-tier-cards.js";
42
42
  export * from "./blocks/pricing-tiers.js";
43
43
  export * from "./blocks/quote.js";
44
44
  export * from "./blocks/rich-text.js";
45
+ export * from "./blocks/sign-in-options.js";
45
46
  export * from "./blocks/stage-panel.js";
46
47
  export * from "./blocks/step-item.js";
47
48
  export * from "./blocks/tool-logo.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAGtC,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAGtC,cAAc,uBAAuB,CAAA"}
package/dist/index.js CHANGED
@@ -59,6 +59,7 @@ export * from "./blocks/pricing-tier-cards.js";
59
59
  export * from "./blocks/pricing-tiers.js";
60
60
  export * from "./blocks/quote.js";
61
61
  export * from "./blocks/rich-text.js";
62
+ export * from "./blocks/sign-in-options.js";
62
63
  export * from "./blocks/stage-panel.js";
63
64
  export * from "./blocks/step-item.js";
64
65
  export * from "./blocks/tool-logo.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,oEAAoE;AACpE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,kEAAkE;AAClE,8EAA8E;AAC9E,uEAAuE;AAEvE,cAAc;AACd,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAE/B,mBAAmB;AACnB,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAEtC,0EAA0E;AAC1E,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,oEAAoE;AACpE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,kEAAkE;AAClE,8EAA8E;AAC9E,uEAAuE;AAEvE,cAAc;AACd,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAE/B,mBAAmB;AACnB,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAEtC,0EAA0E;AAC1E,cAAc,uBAAuB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudgrid-io/ui",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "CloudGrid design system: React components, brand design tokens, Tailwind theme, self-hosted fonts.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",