@tomny-dev/uzi 0.7.1 → 0.8.0-pr.85.286.1.ccec3e4

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.
Files changed (51) hide show
  1. package/README.md +8 -0
  2. package/dist/components/ai-chat/AIChat.d.ts +164 -0
  3. package/dist/components/ai-chat/AIChat.d.ts.map +1 -0
  4. package/dist/components/ai-chat/AIChat.test.d.ts +2 -0
  5. package/dist/components/ai-chat/AIChat.test.d.ts.map +1 -0
  6. package/dist/components/ai-chat/AIChatDock.d.ts +33 -0
  7. package/dist/components/ai-chat/AIChatDock.d.ts.map +1 -0
  8. package/dist/components/floating-action-stack/FloatingActionStack.d.ts +19 -0
  9. package/dist/components/floating-action-stack/FloatingActionStack.d.ts.map +1 -0
  10. package/dist/components/floating-action-stack/FloatingActionStack.test.d.ts +2 -0
  11. package/dist/components/floating-action-stack/FloatingActionStack.test.d.ts.map +1 -0
  12. package/dist/components/multi-select/MultiSelect.d.ts +3 -0
  13. package/dist/components/multi-select/MultiSelect.d.ts.map +1 -1
  14. package/dist/index.cjs +9 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +4 -1
  18. package/dist/index26.js +6 -2
  19. package/dist/index26.js.map +1 -1
  20. package/dist/index27.cjs +7 -1
  21. package/dist/index27.cjs.map +1 -1
  22. package/dist/index27.js +40 -10
  23. package/dist/index27.js.map +1 -1
  24. package/dist/index28.cjs +40 -10
  25. package/dist/index28.cjs.map +1 -1
  26. package/dist/index75.js +91 -0
  27. package/dist/index75.js.map +1 -0
  28. package/dist/index76.cjs +133 -0
  29. package/dist/index76.cjs.map +1 -0
  30. package/dist/index76.js +667 -0
  31. package/dist/index76.js.map +1 -0
  32. package/dist/index77.cjs +669 -0
  33. package/dist/index77.cjs.map +1 -0
  34. package/dist/index77.js +35 -0
  35. package/dist/index77.js.map +1 -0
  36. package/dist/index78.cjs +49 -0
  37. package/dist/index78.cjs.map +1 -0
  38. package/dist/index78.js +231 -0
  39. package/dist/index78.js.map +1 -0
  40. package/dist/index79.cjs +231 -0
  41. package/dist/index79.cjs.map +1 -0
  42. package/dist/index79.js +19 -0
  43. package/dist/index79.js.map +1 -0
  44. package/dist/index80.cjs +25 -0
  45. package/dist/index80.cjs.map +1 -0
  46. package/dist/index80.js +36 -0
  47. package/dist/index80.js.map +1 -0
  48. package/dist/index81.cjs +37 -0
  49. package/dist/index81.cjs.map +1 -0
  50. package/dist/style.css +655 -0
  51. package/package.json +3 -1
package/README.md CHANGED
@@ -41,6 +41,8 @@ pnpm build-storybook
41
41
 
42
42
  The static output is written to `storybook-static/`. Story files live beside their components under `src/components/**` using the `*.stories.tsx` naming convention.
43
43
 
44
+ The **Components / AIChat** stories demonstrate streaming, custom renderers, scoped requests, message limits, error recovery, and an externally controlled runtime with mock approvals; no external AI credentials are needed.
45
+
44
46
  CI builds Storybook on every pull request and push to `main`. After changes land on `main`, the Storybook deployment workflow publishes `storybook-static/` to the `uzi-storybook` Cloudflare Pages project. The deployment workflow requires these repository secrets:
45
47
 
46
48
  - `CLOUDFLARE_API_TOKEN` — API token with Pages Write permission.
@@ -128,6 +130,9 @@ In practice, `uzi` should spend its complexity budget on reusable app scaffoldin
128
130
  | Component | Description |
129
131
  |---|---|
130
132
  | `Avatar` | Profile image with fallback states |
133
+ | `AIChat` | Plug-and-play AI SDK streaming chat with scoped context and customizable renderers |
134
+ | `AIChatView` | Controlled chat presentation for external runtimes, tool approvals, attachment adapters and persisted history |
135
+ | `AIChatDock` | Shared floating chat launcher, responsive panel and expand/close controls |
131
136
  | `Button` | Primary, secondary, outline, ghost variants |
132
137
  | `Card` | Discrete object container with tone/padding control |
133
138
  | `Surface` | Semantic visual grouping with base/subtle/raised/selected hierarchy |
@@ -169,6 +174,7 @@ In practice, `uzi` should spend its complexity budget on reusable app scaffoldin
169
174
  - [Application Scaffolding](docs/guides/application-scaffolding.md) — Page containers, headers, empty states, stats, and layout composition
170
175
  - [Visual Hierarchy](docs/guides/visual-hierarchy.md) — Surface levels, typography, borders, shadows, and toolbar conventions
171
176
  - [Form Patterns](docs/guides/form-patterns.md) — Input, Select, MultiSelect, SegmentedToggle patterns
177
+ - [AI Chat](docs/guides/ai-chat.md) — Streaming endpoint contract, authentication, scope authorization, renderers and local Storybook demos
172
178
 
173
179
  ## SSR Notes
174
180
 
@@ -201,3 +207,5 @@ calls made directly from Server Components.
201
207
  - No Tailwind — components use CSS modules internally
202
208
  - `"use client"` is handled by the bundle — no need to wrap imports
203
209
  - `react` and `react-dom` are peer dependencies, provided by your app
210
+
211
+ - `FloatingActionStack` and `FloatingActionButton` provide a single, accessible floating-action rail with mobile safe-area spacing. An `AIChatDock` can opt out of its built-in FAB via `showLauncher={false}`.
@@ -0,0 +1,164 @@
1
+ import type { CSSProperties, ComponentType, ReactNode } from 'react';
2
+ import { AISDKChat, AssistantChatTransport } from '@assistant-ui/ai-sdk';
3
+ type AIChatTransportOptions = NonNullable<ConstructorParameters<typeof AssistantChatTransport>[0]>;
4
+ export interface AIChatProps {
5
+ /** AI SDK UI-message stream endpoint. */
6
+ readonly api: string;
7
+ /** Opaque scope identifier sent to the API. Server must authorize it. */
8
+ readonly scope?: string;
9
+ /** Human-readable display text; never used as an access-control identifier. */
10
+ readonly scopeLabel?: string;
11
+ /** Fetch adapter for authentication, request instrumentation and local demos. */
12
+ readonly fetch?: typeof globalThis.fetch;
13
+ readonly headers?: Record<string, string>;
14
+ readonly credentials?: RequestCredentials;
15
+ /** Customize serialized requests for APIs with a strict request schema. */
16
+ readonly prepareSendMessagesRequest?: AIChatTransportOptions['prepareSendMessagesRequest'];
17
+ /** Change this when the authenticated identity changes to reset the transcript. */
18
+ readonly sessionKey?: string | number;
19
+ /** Maximum number of user turns (default: 8). */
20
+ readonly messageLimit?: number;
21
+ readonly inputPlaceholder?: string;
22
+ /** Accessible name for the message textarea. */
23
+ readonly inputAriaLabel?: string;
24
+ readonly inputMaxLength?: number;
25
+ readonly components?: AIChatComponents;
26
+ /** Opt-in files, restricted to images/text accepted by the application API. */
27
+ readonly attachments?: AIChatAttachmentOptions;
28
+ /** Optional persistence; implementations must scope storage by user AND resource. */
29
+ readonly history?: AIChatHistoryAdapter;
30
+ /** Native SDK continuation predicate for tool approvals. */
31
+ readonly sendAutomaticallyWhen?: NonNullable<Parameters<typeof AISDKChat>[0]>['sendAutomaticallyWhen'];
32
+ readonly onClose?: () => void;
33
+ readonly className?: string;
34
+ readonly style?: CSSProperties;
35
+ }
36
+ /**
37
+ * Framework-independent presentation contract. The parent owns the runtime,
38
+ * message identities, approvals, uploads, history and security boundaries.
39
+ * Uzi does not serialize, persist or reinterpret any messages supplied here.
40
+ */
41
+ export type AIChatMessage = AIChatMessageRendererProps['message'];
42
+ export interface AIChatAttachmentOptions {
43
+ readonly accept: string;
44
+ readonly maxFiles?: number;
45
+ readonly maxBytesPerFile?: number;
46
+ }
47
+ export interface AIChatSelectedAttachment {
48
+ readonly name: string;
49
+ readonly size: number;
50
+ /** Local thumbnail URL for supported image files. */
51
+ readonly previewUrl?: string;
52
+ }
53
+ export interface AIChatHistoryAdapter {
54
+ /** Load only validated UI messages from the authenticated principal's own storage. */
55
+ readonly load: () => Promise<readonly AIChatMessage[]> | readonly AIChatMessage[];
56
+ /** Save after complete turns; the consumer decides what metadata is safe. */
57
+ readonly save: (messages: readonly AIChatMessage[]) => Promise<void> | void;
58
+ readonly clear: () => Promise<void> | void;
59
+ /** Observability for failed history operations; never include message payloads in logs. */
60
+ readonly onError?: (operation: 'load' | 'save' | 'clear', error: unknown) => void;
61
+ }
62
+ export type AIChatToolApprovalHandler = (id: string, approved: boolean) => Promise<void> | void;
63
+ export interface AIChatViewProps {
64
+ readonly messages: readonly AIChatMessage[];
65
+ readonly status?: string;
66
+ readonly error?: Error | null;
67
+ readonly draft?: string;
68
+ readonly onDraftChange?: (draft: string) => void;
69
+ readonly onSend?: () => void;
70
+ readonly onStop?: () => void;
71
+ readonly onRetry?: () => void;
72
+ readonly onNewChat?: () => void;
73
+ /** No limit by default: specialized apps decide their own session policy. */
74
+ readonly messageLimit?: number;
75
+ readonly inputPlaceholder?: string;
76
+ readonly inputAriaLabel?: string;
77
+ readonly inputMaxLength?: number;
78
+ readonly components?: AIChatComponents;
79
+ readonly attachments?: readonly AIChatSelectedAttachment[];
80
+ readonly onSelectAttachments?: (files: FileList) => void;
81
+ readonly onRemoveAttachment?: (index: number) => void;
82
+ readonly attachmentAccept?: string;
83
+ readonly attachmentError?: string | null;
84
+ /** Only invoked from explicit user action on an approval-requested tool part. */
85
+ readonly onToolApproval?: AIChatToolApprovalHandler;
86
+ /** Custom message toolbar controls, e.g. a conversation selector. */
87
+ readonly toolbarActions?: ReactNode;
88
+ /** Context labels or other app-owned notices above the transcript. */
89
+ readonly header?: ReactNode;
90
+ /** Upload actions, attachment previews or context chips before the input. */
91
+ readonly composerLeading?: ReactNode;
92
+ /** Additional buttons beside the Send/Stop control. */
93
+ readonly composerTrailing?: ReactNode;
94
+ /** Completely replace the composer while retaining shared transcript chrome. */
95
+ readonly composer?: ReactNode;
96
+ readonly emptyState?: ReactNode;
97
+ readonly className?: string;
98
+ readonly style?: CSSProperties;
99
+ }
100
+ export interface AIChatComponents {
101
+ readonly MessageRenderer?: ComponentType<AIChatMessageRendererProps>;
102
+ readonly ReasoningRenderer?: ComponentType<AIChatReasoningRendererProps>;
103
+ readonly SourceRenderer?: ComponentType<AIChatSourceRendererProps>;
104
+ readonly DataRenderer?: ComponentType<AIChatDataRendererProps>;
105
+ readonly ToolRenderer?: ComponentType<AIChatToolRendererProps>;
106
+ readonly ErrorRenderer?: ComponentType<AIChatErrorRendererProps>;
107
+ }
108
+ export interface AIChatMessageRendererProps {
109
+ readonly message: {
110
+ readonly id: string;
111
+ readonly role: 'user' | 'assistant';
112
+ readonly parts: readonly unknown[];
113
+ readonly metadata?: Record<string, unknown>;
114
+ };
115
+ readonly renderMessagePart: (part: Record<string, unknown>, index: number) => ReactNode;
116
+ readonly onToolApproval?: AIChatToolApprovalHandler;
117
+ }
118
+ export interface AIChatReasoningRendererProps {
119
+ readonly children: string;
120
+ readonly title?: string;
121
+ }
122
+ export interface AIChatSource {
123
+ readonly id: string;
124
+ readonly title?: string;
125
+ readonly url?: string;
126
+ }
127
+ export interface AIChatSourceRendererProps {
128
+ readonly sources: readonly AIChatSource[];
129
+ readonly renderSource: (source: AIChatSource, index: number) => ReactNode;
130
+ }
131
+ export interface AIChatDataRendererProps {
132
+ readonly data: readonly Record<string, unknown>[];
133
+ readonly renderDataItem: (item: Record<string, unknown>, index: number) => ReactNode;
134
+ }
135
+ export interface AIChatToolRendererProps {
136
+ readonly part: Record<string, unknown>;
137
+ readonly name: string;
138
+ readonly approvalId?: string;
139
+ readonly onApprove?: () => void;
140
+ readonly onDeny?: () => void;
141
+ readonly approvalPending: boolean;
142
+ }
143
+ export interface AIChatErrorRendererProps {
144
+ readonly error: Error;
145
+ readonly onRetry: () => void;
146
+ readonly onClear: () => void;
147
+ }
148
+ /** Reusable role-aware message surface for domain renderers. */
149
+ export interface AIChatMessageBubbleProps {
150
+ readonly role: 'user' | 'assistant';
151
+ readonly label?: string;
152
+ readonly children: ReactNode;
153
+ readonly className?: string;
154
+ }
155
+ export declare function AIChatMessageBubble({ role, label, children, className }: AIChatMessageBubbleProps): import("react/jsx-runtime").JSX.Element;
156
+ export declare function AIChat({ api, scope, scopeLabel, fetch: requestFetch, headers, credentials, prepareSendMessagesRequest, sessionKey, messageLimit, inputPlaceholder, inputAriaLabel, inputMaxLength, components, attachments, history, sendAutomaticallyWhen, onClose, className, style, }: AIChatProps): import("react/jsx-runtime").JSX.Element;
157
+ /**
158
+ * Controlled chat presentation for apps with their own AI SDK/assistant-ui
159
+ * runtime. It does not create providers, transports or chat state. Callbacks
160
+ * are the only way messages/actions leave the view.
161
+ */
162
+ export declare function AIChatView({ messages, status, error, draft, onDraftChange, onSend, onStop, onRetry, onNewChat, messageLimit, inputPlaceholder, inputAriaLabel, inputMaxLength, components, attachments, onSelectAttachments, onRemoveAttachment, attachmentAccept, attachmentError, onToolApproval, toolbarActions, header, composerLeading, composerTrailing, composer, emptyState, className, style, }: AIChatViewProps): import("react/jsx-runtime").JSX.Element;
163
+ export {};
164
+ //# sourceMappingURL=AIChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIChat.d.ts","sourceRoot":"","sources":["../../../src/components/ai-chat/AIChat.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AIChat.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIChat.test.d.ts","sourceRoot":"","sources":["../../../src/components/ai-chat/AIChat.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface AIChatDockProps {
3
+ /** Visible assistant name, e.g. "Betty" or "Ask Tultr". */
4
+ readonly title: string;
5
+ readonly description?: string;
6
+ /** Accessible name for the floating action button. Defaults to "Open {title}". */
7
+ readonly launcherLabel?: string;
8
+ /** Turn off the built-in FAB when a parent FloatingActionStack owns the launcher. */
9
+ readonly showLauncher?: boolean;
10
+ /** Optional stable panel ID for an external button's aria-controls. */
11
+ readonly panelId?: string;
12
+ /** ID of the external launch button to restore keyboard focus after close. */
13
+ readonly externalLauncherId?: string;
14
+ readonly children: ReactNode;
15
+ /** Controlled visibility; when omitted, the dock manages its own state. */
16
+ readonly open?: boolean;
17
+ readonly defaultOpen?: boolean;
18
+ readonly onOpenChange?: (open: boolean) => void;
19
+ /** Controlled expansion; apps may synchronize this with a dedicated route. */
20
+ readonly expanded?: boolean;
21
+ readonly defaultExpanded?: boolean;
22
+ readonly onExpandedChange?: (expanded: boolean) => void;
23
+ readonly className?: string;
24
+ }
25
+ /**
26
+ * Shared chat navigation chrome. Children remain mounted while closed to retain
27
+ * the consumer's active AI SDK conversation, pending approvals and attachments.
28
+ * The dock never creates a second chat runtime or reads application messages.
29
+ * Desktop is deliberately non-modal: Tab can move back into the page.
30
+ * On mobile the full-screen modal sheet traps sequential keyboard focus.
31
+ */
32
+ export declare function AIChatDock({ title, description, launcherLabel, showLauncher, panelId: controlledPanelId, externalLauncherId, children, open, defaultOpen, onOpenChange, expanded, defaultExpanded, onExpandedChange, className, }: AIChatDockProps): import("react/jsx-runtime").JSX.Element;
33
+ //# sourceMappingURL=AIChatDock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIChatDock.d.ts","sourceRoot":"","sources":["../../../src/components/ai-chat/AIChatDock.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI3E,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,qFAAqF;IACrF,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,aAAa,EACb,YAAmB,EACnB,OAAO,EAAE,iBAAiB,EAC1B,kBAAkB,EAClB,QAAQ,EACR,IAAI,EACJ,WAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,eAAuB,EACvB,gBAAgB,EAChB,SAAS,GACV,EAAE,eAAe,2CAsJjB"}
@@ -0,0 +1,19 @@
1
+ import type { ButtonHTMLAttributes, ReactNode } from 'react';
2
+ /** A single screen-edge action rail shared by unrelated application features. */
3
+ export interface FloatingActionStackProps {
4
+ readonly children: ReactNode;
5
+ readonly className?: string;
6
+ readonly label?: string;
7
+ }
8
+ export declare function FloatingActionStack({ children, className, label }: FloatingActionStackProps): import("react/jsx-runtime").JSX.Element;
9
+ export interface FloatingActionButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
10
+ /** Stable accessible name, including when the mobile label is hidden. */
11
+ readonly label: string;
12
+ readonly icon: ReactNode;
13
+ readonly children?: ReactNode;
14
+ /** Use secondary styling for contextual actions above the primary launcher. */
15
+ readonly variant?: 'primary' | 'secondary';
16
+ }
17
+ /** A directly accessible action, not a speed-dial menu or nested overlay. */
18
+ export declare function FloatingActionButton({ label, icon, children, variant, className, ...buttonProps }: FloatingActionButtonProps): import("react/jsx-runtime").JSX.Element;
19
+ //# sourceMappingURL=FloatingActionStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingActionStack.d.ts","sourceRoot":"","sources":["../../../src/components/floating-action-stack/FloatingActionStack.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAI7D,iFAAiF;AACjF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAuB,EAAE,EAAE,wBAAwB,2CAS7G;AAED,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACtG,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CAC5C;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,OAAmB,EACnB,SAAS,EACT,GAAG,WAAW,EACf,EAAE,yBAAyB,2CAa3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FloatingActionStack.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingActionStack.test.d.ts","sourceRoot":"","sources":["../../../src/components/floating-action-stack/FloatingActionStack.test.tsx"],"names":[],"mappings":""}
@@ -17,6 +17,9 @@ export type MultiSelectProps = {
17
17
  formatValue?: (selected: MultiSelectOption[]) => string;
18
18
  /** Shows Select all and Clear all actions. Bulk actions modify enabled options only. */
19
19
  bulkActions?: boolean;
20
+ /** Stage changes until Apply. Cancel/dismiss discards the draft. */
21
+ draftMode?: boolean;
22
+ minSelected?: number;
20
23
  selectAllLabel?: string;
21
24
  /** Label for clearing all enabled selections. Disabled selected options remain selected. */
22
25
  clearAllLabel?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelect.d.ts","sourceRoot":"","sources":["../../../src/components/multi-select/MultiSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wFAAwF;IACxF,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+FAA+F;IAC/F,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,MAAM,CAAC;IACxD,wFAAwF;IACxF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,WAAW,4FAuNvB,CAAC"}
1
+ {"version":3,"file":"MultiSelect.d.ts","sourceRoot":"","sources":["../../../src/components/multi-select/MultiSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wFAAwF;IACxF,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+FAA+F;IAC/F,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,MAAM,CAAC;IACxD,wFAAwF;IACxF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,WAAW,4FA4OvB,CAAC"}
package/dist/index.cjs CHANGED
@@ -38,6 +38,13 @@ const require_DataTable = require("./index69.cjs");
38
38
  const require_SettingsPage = require("./index71.cjs");
39
39
  const require_ErrorPage = require("./index73.cjs");
40
40
  const require_EmptyStatePage = require("./index75.cjs");
41
+ const require_AIChat = require("./index77.cjs");
42
+ const require_AIChatDock = require("./index79.cjs");
43
+ const require_FloatingActionStack = require("./index81.cjs");
44
+ exports.AIChat = require_AIChat.AIChat;
45
+ exports.AIChatDock = require_AIChatDock.AIChatDock;
46
+ exports.AIChatMessageBubble = require_AIChat.AIChatMessageBubble;
47
+ exports.AIChatView = require_AIChat.AIChatView;
41
48
  exports.Alert = require_Alert.Alert;
42
49
  exports.AppShell = require_AppShell.AppShell;
43
50
  exports.AuthCard = require_AuthCard.AuthCard;
@@ -66,6 +73,8 @@ exports.DropdownMenuTrigger = require_DropdownMenu.DropdownMenuTrigger;
66
73
  exports.EmptyState = require_EmptyState.EmptyState;
67
74
  exports.EmptyStatePage = require_EmptyStatePage.EmptyStatePage;
68
75
  exports.ErrorPage = require_ErrorPage.ErrorPage;
76
+ exports.FloatingActionButton = require_FloatingActionStack.FloatingActionButton;
77
+ exports.FloatingActionStack = require_FloatingActionStack.FloatingActionStack;
69
78
  exports.ForgotPasswordPage = require_AuthPages.ForgotPasswordPage;
70
79
  exports.Inline = require_LayoutPrimitives.Inline;
71
80
  exports.Input = require_Input.Input;
package/dist/index.d.ts CHANGED
@@ -71,4 +71,11 @@ export type { ErrorPageProps } from "./components/error-page/ErrorPage";
71
71
  export { ErrorPage, NotFoundPage, MaintenancePage } from "./components/error-page/ErrorPage";
72
72
  export type { EmptyStatePageProps, EmptyStatePageVariant } from "./components/empty-state-page/EmptyStatePage";
73
73
  export { EmptyStatePage } from "./components/empty-state-page/EmptyStatePage";
74
+ export type { AIChatProps, AIChatMessage, AIChatViewProps, AIChatAttachmentOptions, AIChatSelectedAttachment, AIChatHistoryAdapter, AIChatToolApprovalHandler, AIChatToolRendererProps, AIChatComponents, AIChatMessageRendererProps, AIChatReasoningRendererProps, AIChatSource, AIChatSourceRendererProps, AIChatDataRendererProps, AIChatErrorRendererProps, } from "./components/ai-chat/AIChat";
75
+ export { AIChat, AIChatView, AIChatMessageBubble } from "./components/ai-chat/AIChat";
76
+ export type { AIChatMessageBubbleProps } from "./components/ai-chat/AIChat";
77
+ export { AIChatDock } from "./components/ai-chat/AIChatDock";
78
+ export type { AIChatDockProps } from "./components/ai-chat/AIChatDock";
79
+ export { FloatingActionStack, FloatingActionButton } from "./components/floating-action-stack/FloatingActionStack";
80
+ export type { FloatingActionStackProps, FloatingActionButtonProps } from "./components/floating-action-stack/FloatingActionStack";
74
81
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -37,4 +37,7 @@ import { DataTable } from "./index68.js";
37
37
  import { SettingsPage } from "./index70.js";
38
38
  import { ErrorPage, MaintenancePage, NotFoundPage } from "./index72.js";
39
39
  import { EmptyStatePage } from "./index74.js";
40
- export { Alert, AppShell, AuthCard, Avatar, AvatarFallback, AvatarImage, Button, Card, Checkbox, DataTable, Dropdown, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStatePage, ErrorPage, ForgotPasswordPage, Inline, Input, Label, MaintenancePage, Modal, ModalOverlay, MultiSelect, NotFoundPage, PageContainer, PageHeader, Pill, Progress, SectionHeader, SegmentedToggle, Select, SettingsPage, SidebarNav, SignInPage, SignUpPage, Skeleton, Stack, Stat, StatGroup, Surface, ThemeProvider, ThemeToggleButton, ToastProvider, Toolbar, ToolbarGroup, TopBar, cx, useTheme, useToast };
40
+ import { AIChat, AIChatMessageBubble, AIChatView } from "./index76.js";
41
+ import { AIChatDock } from "./index78.js";
42
+ import { FloatingActionButton, FloatingActionStack } from "./index80.js";
43
+ export { AIChat, AIChatDock, AIChatMessageBubble, AIChatView, Alert, AppShell, AuthCard, Avatar, AvatarFallback, AvatarImage, Button, Card, Checkbox, DataTable, Dropdown, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStatePage, ErrorPage, FloatingActionButton, FloatingActionStack, ForgotPasswordPage, Inline, Input, Label, MaintenancePage, Modal, ModalOverlay, MultiSelect, NotFoundPage, PageContainer, PageHeader, Pill, Progress, SectionHeader, SegmentedToggle, Select, SettingsPage, SidebarNav, SignInPage, SignUpPage, Skeleton, Stack, Stat, StatGroup, Surface, ThemeProvider, ThemeToggleButton, ToastProvider, Toolbar, ToolbarGroup, TopBar, cx, useTheme, useToast };
package/dist/index26.js CHANGED
@@ -20,6 +20,8 @@ var indicator = "uzi-multi-select-module__indicator__NO-WE";
20
20
  var indicatorSelected = "uzi-multi-select-module__indicatorSelected__9sEAy";
21
21
  var indicatorDisabled = "uzi-multi-select-module__indicatorDisabled__vqdiH";
22
22
  var optionIcon = "uzi-multi-select-module__optionIcon__TQddK";
23
+ var draftActions = "uzi-multi-select-module__draftActions__-R2g3";
24
+ var draftButton = "uzi-multi-select-module__draftButton__tO1zu";
23
25
  var multi_select_module_default = {
24
26
  wrapper,
25
27
  wrapperFullWidth,
@@ -41,9 +43,11 @@ var multi_select_module_default = {
41
43
  indicator,
42
44
  indicatorSelected,
43
45
  indicatorDisabled,
44
- optionIcon
46
+ optionIcon,
47
+ draftActions,
48
+ draftButton
45
49
  };
46
50
  //#endregion
47
- export { bulkAction, chevron, chip, chipSummary, multi_select_module_default as default, indicator, indicatorDisabled, indicatorSelected, menu, menuFadeIn, option, optionDisabled, optionIcon, optionLabel, optionSelected, placeholder, separator, summary, trigger, value, wrapper, wrapperFullWidth };
51
+ export { bulkAction, chevron, chip, chipSummary, multi_select_module_default as default, draftActions, draftButton, indicator, indicatorDisabled, indicatorSelected, menu, menuFadeIn, option, optionDisabled, optionIcon, optionLabel, optionSelected, placeholder, separator, summary, trigger, value, wrapper, wrapperFullWidth };
48
52
 
49
53
  //# sourceMappingURL=index26.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index26.js","names":[],"sources":["../src/components/multi-select/multi-select.module.css"],"sourcesContent":[".wrapper {\n position: relative;\n display: inline-flex;\n min-width: 0;\n max-width: 100%;\n}\n\n.wrapperFullWidth {\n width: 100%;\n}\n\n.trigger {\n width: 100%;\n min-width: 0;\n min-height: var(--uzi-control-min-height);\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.625rem;\n border-radius: var(--uzi-control-radius);\n border: 1px solid var(--ts-dropdown-border, var(--border));\n background: var(--ts-dropdown-bg, var(--uzi-surface-2, var(--secondary)));\n color: var(--ts-dropdown-text, var(--foreground));\n padding:\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x-compact)\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x);\n font-size: var(--uzi-control-font-size);\n line-height: var(--uzi-control-line-height);\n font-family: inherit;\n box-shadow: var(--uzi-control-shadow);\n transition:\n border-color 0.15s ease,\n background 0.15s ease,\n color 0.15s ease,\n box-shadow 0.15s ease;\n cursor: pointer;\n text-align: left;\n}\n\n.trigger:hover:not(:disabled) {\n border-color: var(--ts-dropdown-accent, var(--accent));\n box-shadow: var(--uzi-control-shadow-hover);\n}\n\n.trigger:focus-visible,\n.trigger[data-state=\"open\"] {\n border-color: var(--ts-dropdown-accent, var(--primary));\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--primary) 30%, transparent);\n}\n\n.trigger:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n box-shadow: none;\n}\n\n.value {\n min-width: 0;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n gap: 0.375rem;\n align-items: center;\n}\n\n.placeholder {\n color: var(--muted-foreground);\n}\n\n.summary {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--primary) 32%, transparent);\n background: color-mix(in srgb, var(--primary) 10%, transparent);\n color: var(--ts-dropdown-text, var(--foreground));\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1.2;\n white-space: nowrap;\n}\n\n.chipSummary {\n color: var(--primary);\n}\n\n.chevron {\n width: 10px;\n height: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--muted-foreground);\n flex-shrink: 0;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.trigger:hover:not(:disabled) .chevron,\n.trigger[data-state=\"open\"] .chevron {\n color: var(--ts-dropdown-text, var(--foreground));\n}\n\n.trigger[data-state=\"open\"] .chevron {\n transform: rotate(180deg);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: var(--uzi-popover-z-index, 1100);\n min-width: 100%;\n max-height: 16rem;\n overflow-y: auto;\n border: 1px solid var(--ts-menu-border, var(--border));\n border-radius: var(--uzi-menu-radius);\n background: var(--ts-menu-bg, var(--popover));\n color: var(--ts-menu-fg, var(--popover-foreground));\n padding: var(--uzi-menu-padding);\n box-shadow: var(--uzi-menu-shadow);\n animation: menuFadeIn 140ms ease;\n}\n\n.bulkAction {\n width: 100%;\n display: flex;\n align-items: center;\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n outline: none;\n}\n\n.bulkAction[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n}\n\n.bulkAction[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.separator {\n height: 1px;\n margin: var(--uzi-menu-padding) 0;\n background: var(--ts-menu-border, var(--border));\n}\n\n.option {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n cursor: pointer;\n text-align: left;\n transition: background 0.12s ease, color 0.12s ease;\n}\n\n.option:hover:not(:disabled),\n.option:focus-visible,\n.option[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n outline: none;\n}\n\n.optionDisabled,\n.option[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.optionSelected .optionLabel {\n color: var(--primary);\n}\n\n.indicator {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border-radius: 0.3125rem;\n border: 1px solid var(--border);\n color: transparent;\n background: transparent;\n transition: border-color 0.12s ease, background 0.12s ease, color 0.12s ease;\n}\n\n.indicatorSelected {\n border-color: color-mix(in srgb, var(--primary) 55%, transparent);\n background: color-mix(in srgb, var(--primary) 12%, transparent);\n color: var(--primary);\n}\n\n.indicatorDisabled {\n opacity: 0.65;\n}\n\n.optionLabel {\n min-width: 0;\n flex: 1;\n display: inline-flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n}\n\n.optionIcon {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.optionIcon > * {\n max-width: 100%;\n max-height: 100%;\n}\n\n@keyframes menuFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index26.js","names":[],"sources":["../src/components/multi-select/multi-select.module.css"],"sourcesContent":[".wrapper {\n position: relative;\n display: inline-flex;\n min-width: 0;\n max-width: 100%;\n}\n\n.wrapperFullWidth {\n width: 100%;\n}\n\n.trigger {\n width: 100%;\n min-width: 0;\n min-height: var(--uzi-control-min-height);\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.625rem;\n border-radius: var(--uzi-control-radius);\n border: 1px solid var(--ts-dropdown-border, var(--border));\n background: var(--ts-dropdown-bg, var(--uzi-surface-2, var(--secondary)));\n color: var(--ts-dropdown-text, var(--foreground));\n padding:\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x-compact)\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x);\n font-size: var(--uzi-control-font-size);\n line-height: var(--uzi-control-line-height);\n font-family: inherit;\n box-shadow: var(--uzi-control-shadow);\n transition:\n border-color 0.15s ease,\n background 0.15s ease,\n color 0.15s ease,\n box-shadow 0.15s ease;\n cursor: pointer;\n text-align: left;\n}\n\n.trigger:hover:not(:disabled) {\n border-color: var(--ts-dropdown-accent, var(--accent));\n box-shadow: var(--uzi-control-shadow-hover);\n}\n\n.trigger:focus-visible,\n.trigger[data-state=\"open\"] {\n border-color: var(--ts-dropdown-accent, var(--primary));\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--primary) 30%, transparent);\n}\n\n.trigger:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n box-shadow: none;\n}\n\n.value {\n min-width: 0;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n gap: 0.375rem;\n align-items: center;\n}\n\n.placeholder {\n color: var(--muted-foreground);\n}\n\n.summary {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--primary) 32%, transparent);\n background: color-mix(in srgb, var(--primary) 10%, transparent);\n color: var(--ts-dropdown-text, var(--foreground));\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1.2;\n white-space: nowrap;\n}\n\n.chipSummary {\n color: var(--primary);\n}\n\n.chevron {\n width: 10px;\n height: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--muted-foreground);\n flex-shrink: 0;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.trigger:hover:not(:disabled) .chevron,\n.trigger[data-state=\"open\"] .chevron {\n color: var(--ts-dropdown-text, var(--foreground));\n}\n\n.trigger[data-state=\"open\"] .chevron {\n transform: rotate(180deg);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: var(--uzi-popover-z-index, 1100);\n min-width: 100%;\n max-height: 16rem;\n overflow-y: auto;\n border: 1px solid var(--ts-menu-border, var(--border));\n border-radius: var(--uzi-menu-radius);\n background: var(--ts-menu-bg, var(--popover));\n color: var(--ts-menu-fg, var(--popover-foreground));\n padding: var(--uzi-menu-padding);\n box-shadow: var(--uzi-menu-shadow);\n animation: menuFadeIn 140ms ease;\n}\n\n.bulkAction {\n width: 100%;\n display: flex;\n align-items: center;\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n outline: none;\n}\n\n.bulkAction[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n}\n\n.bulkAction[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.separator {\n height: 1px;\n margin: var(--uzi-menu-padding) 0;\n background: var(--ts-menu-border, var(--border));\n}\n\n.option {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n cursor: pointer;\n text-align: left;\n transition: background 0.12s ease, color 0.12s ease;\n}\n\n.option:hover:not(:disabled),\n.option:focus-visible,\n.option[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n outline: none;\n}\n\n.optionDisabled,\n.option[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.optionSelected .optionLabel {\n color: var(--primary);\n}\n\n.indicator {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border-radius: 0.3125rem;\n border: 1px solid var(--border);\n color: transparent;\n background: transparent;\n transition: border-color 0.12s ease, background 0.12s ease, color 0.12s ease;\n}\n\n.indicatorSelected {\n border-color: color-mix(in srgb, var(--primary) 55%, transparent);\n background: color-mix(in srgb, var(--primary) 12%, transparent);\n color: var(--primary);\n}\n\n.indicatorDisabled {\n opacity: 0.65;\n}\n\n.optionLabel {\n min-width: 0;\n flex: 1;\n display: inline-flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n}\n\n.optionIcon {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.optionIcon > * {\n max-width: 100%;\n max-height: 100%;\n}\n\n@keyframes menuFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n.draftActions {\n display: flex;\n gap: 0.5rem;\n padding: 0.5rem 0.25rem 0.125rem;\n border-top: 1px solid var(--ts-menu-border, var(--border));\n}\n.draftButton {\n flex: 1;\n border: 1px solid var(--ts-menu-border, var(--border));\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: 0.4rem 0.75rem;\n font: inherit;\n cursor: pointer;\n}\n.draftButton:last-child {\n background: var(--primary);\n color: var(--primary-foreground);\n border-color: var(--primary);\n}\n.draftButton:focus-visible { outline: var(--focus-ring); outline-offset: var(--focus-ring-offset); }\n.draftButton:disabled { opacity: 0.5; cursor: not-allowed; }\n"],"mappings":""}
package/dist/index27.cjs CHANGED
@@ -20,6 +20,8 @@ var indicator = "uzi-multi-select-module__indicator__NO-WE";
20
20
  var indicatorSelected = "uzi-multi-select-module__indicatorSelected__9sEAy";
21
21
  var indicatorDisabled = "uzi-multi-select-module__indicatorDisabled__vqdiH";
22
22
  var optionIcon = "uzi-multi-select-module__optionIcon__TQddK";
23
+ var draftActions = "uzi-multi-select-module__draftActions__-R2g3";
24
+ var draftButton = "uzi-multi-select-module__draftButton__tO1zu";
23
25
  var multi_select_module_default = {
24
26
  wrapper,
25
27
  wrapperFullWidth,
@@ -41,7 +43,9 @@ var multi_select_module_default = {
41
43
  indicator,
42
44
  indicatorSelected,
43
45
  indicatorDisabled,
44
- optionIcon
46
+ optionIcon,
47
+ draftActions,
48
+ draftButton
45
49
  };
46
50
  //#endregion
47
51
  exports.bulkAction = bulkAction;
@@ -49,6 +53,8 @@ exports.chevron = chevron;
49
53
  exports.chip = chip;
50
54
  exports.chipSummary = chipSummary;
51
55
  exports.default = multi_select_module_default;
56
+ exports.draftActions = draftActions;
57
+ exports.draftButton = draftButton;
52
58
  exports.indicator = indicator;
53
59
  exports.indicatorDisabled = indicatorDisabled;
54
60
  exports.indicatorSelected = indicatorSelected;
@@ -1 +1 @@
1
- {"version":3,"file":"index27.cjs","names":[],"sources":["../src/components/multi-select/multi-select.module.css"],"sourcesContent":[".wrapper {\n position: relative;\n display: inline-flex;\n min-width: 0;\n max-width: 100%;\n}\n\n.wrapperFullWidth {\n width: 100%;\n}\n\n.trigger {\n width: 100%;\n min-width: 0;\n min-height: var(--uzi-control-min-height);\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.625rem;\n border-radius: var(--uzi-control-radius);\n border: 1px solid var(--ts-dropdown-border, var(--border));\n background: var(--ts-dropdown-bg, var(--uzi-surface-2, var(--secondary)));\n color: var(--ts-dropdown-text, var(--foreground));\n padding:\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x-compact)\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x);\n font-size: var(--uzi-control-font-size);\n line-height: var(--uzi-control-line-height);\n font-family: inherit;\n box-shadow: var(--uzi-control-shadow);\n transition:\n border-color 0.15s ease,\n background 0.15s ease,\n color 0.15s ease,\n box-shadow 0.15s ease;\n cursor: pointer;\n text-align: left;\n}\n\n.trigger:hover:not(:disabled) {\n border-color: var(--ts-dropdown-accent, var(--accent));\n box-shadow: var(--uzi-control-shadow-hover);\n}\n\n.trigger:focus-visible,\n.trigger[data-state=\"open\"] {\n border-color: var(--ts-dropdown-accent, var(--primary));\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--primary) 30%, transparent);\n}\n\n.trigger:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n box-shadow: none;\n}\n\n.value {\n min-width: 0;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n gap: 0.375rem;\n align-items: center;\n}\n\n.placeholder {\n color: var(--muted-foreground);\n}\n\n.summary {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--primary) 32%, transparent);\n background: color-mix(in srgb, var(--primary) 10%, transparent);\n color: var(--ts-dropdown-text, var(--foreground));\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1.2;\n white-space: nowrap;\n}\n\n.chipSummary {\n color: var(--primary);\n}\n\n.chevron {\n width: 10px;\n height: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--muted-foreground);\n flex-shrink: 0;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.trigger:hover:not(:disabled) .chevron,\n.trigger[data-state=\"open\"] .chevron {\n color: var(--ts-dropdown-text, var(--foreground));\n}\n\n.trigger[data-state=\"open\"] .chevron {\n transform: rotate(180deg);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: var(--uzi-popover-z-index, 1100);\n min-width: 100%;\n max-height: 16rem;\n overflow-y: auto;\n border: 1px solid var(--ts-menu-border, var(--border));\n border-radius: var(--uzi-menu-radius);\n background: var(--ts-menu-bg, var(--popover));\n color: var(--ts-menu-fg, var(--popover-foreground));\n padding: var(--uzi-menu-padding);\n box-shadow: var(--uzi-menu-shadow);\n animation: menuFadeIn 140ms ease;\n}\n\n.bulkAction {\n width: 100%;\n display: flex;\n align-items: center;\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n outline: none;\n}\n\n.bulkAction[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n}\n\n.bulkAction[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.separator {\n height: 1px;\n margin: var(--uzi-menu-padding) 0;\n background: var(--ts-menu-border, var(--border));\n}\n\n.option {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n cursor: pointer;\n text-align: left;\n transition: background 0.12s ease, color 0.12s ease;\n}\n\n.option:hover:not(:disabled),\n.option:focus-visible,\n.option[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n outline: none;\n}\n\n.optionDisabled,\n.option[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.optionSelected .optionLabel {\n color: var(--primary);\n}\n\n.indicator {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border-radius: 0.3125rem;\n border: 1px solid var(--border);\n color: transparent;\n background: transparent;\n transition: border-color 0.12s ease, background 0.12s ease, color 0.12s ease;\n}\n\n.indicatorSelected {\n border-color: color-mix(in srgb, var(--primary) 55%, transparent);\n background: color-mix(in srgb, var(--primary) 12%, transparent);\n color: var(--primary);\n}\n\n.indicatorDisabled {\n opacity: 0.65;\n}\n\n.optionLabel {\n min-width: 0;\n flex: 1;\n display: inline-flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n}\n\n.optionIcon {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.optionIcon > * {\n max-width: 100%;\n max-height: 100%;\n}\n\n@keyframes menuFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index27.cjs","names":[],"sources":["../src/components/multi-select/multi-select.module.css"],"sourcesContent":[".wrapper {\n position: relative;\n display: inline-flex;\n min-width: 0;\n max-width: 100%;\n}\n\n.wrapperFullWidth {\n width: 100%;\n}\n\n.trigger {\n width: 100%;\n min-width: 0;\n min-height: var(--uzi-control-min-height);\n display: inline-flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.625rem;\n border-radius: var(--uzi-control-radius);\n border: 1px solid var(--ts-dropdown-border, var(--border));\n background: var(--ts-dropdown-bg, var(--uzi-surface-2, var(--secondary)));\n color: var(--ts-dropdown-text, var(--foreground));\n padding:\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x-compact)\n var(--uzi-control-padding-y)\n var(--uzi-control-padding-x);\n font-size: var(--uzi-control-font-size);\n line-height: var(--uzi-control-line-height);\n font-family: inherit;\n box-shadow: var(--uzi-control-shadow);\n transition:\n border-color 0.15s ease,\n background 0.15s ease,\n color 0.15s ease,\n box-shadow 0.15s ease;\n cursor: pointer;\n text-align: left;\n}\n\n.trigger:hover:not(:disabled) {\n border-color: var(--ts-dropdown-accent, var(--accent));\n box-shadow: var(--uzi-control-shadow-hover);\n}\n\n.trigger:focus-visible,\n.trigger[data-state=\"open\"] {\n border-color: var(--ts-dropdown-accent, var(--primary));\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--primary) 30%, transparent);\n}\n\n.trigger:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n box-shadow: none;\n}\n\n.value {\n min-width: 0;\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n gap: 0.375rem;\n align-items: center;\n}\n\n.placeholder {\n color: var(--muted-foreground);\n}\n\n.summary {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--primary) 32%, transparent);\n background: color-mix(in srgb, var(--primary) 10%, transparent);\n color: var(--ts-dropdown-text, var(--foreground));\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1.2;\n white-space: nowrap;\n}\n\n.chipSummary {\n color: var(--primary);\n}\n\n.chevron {\n width: 10px;\n height: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--muted-foreground);\n flex-shrink: 0;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.trigger:hover:not(:disabled) .chevron,\n.trigger[data-state=\"open\"] .chevron {\n color: var(--ts-dropdown-text, var(--foreground));\n}\n\n.trigger[data-state=\"open\"] .chevron {\n transform: rotate(180deg);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: var(--uzi-popover-z-index, 1100);\n min-width: 100%;\n max-height: 16rem;\n overflow-y: auto;\n border: 1px solid var(--ts-menu-border, var(--border));\n border-radius: var(--uzi-menu-radius);\n background: var(--ts-menu-bg, var(--popover));\n color: var(--ts-menu-fg, var(--popover-foreground));\n padding: var(--uzi-menu-padding);\n box-shadow: var(--uzi-menu-shadow);\n animation: menuFadeIn 140ms ease;\n}\n\n.bulkAction {\n width: 100%;\n display: flex;\n align-items: center;\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n outline: none;\n}\n\n.bulkAction[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n}\n\n.bulkAction[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.separator {\n height: 1px;\n margin: var(--uzi-menu-padding) 0;\n background: var(--ts-menu-border, var(--border));\n}\n\n.option {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n border: none;\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: var(--uzi-menu-item-padding-y) var(--uzi-menu-item-padding-x);\n font: inherit;\n cursor: pointer;\n text-align: left;\n transition: background 0.12s ease, color 0.12s ease;\n}\n\n.option:hover:not(:disabled),\n.option:focus-visible,\n.option[data-highlighted] {\n background: var(--ts-menu-hover-bg, var(--accent));\n color: var(--ts-menu-hover-fg, var(--accent-foreground));\n outline: none;\n}\n\n.optionDisabled,\n.option[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.optionSelected .optionLabel {\n color: var(--primary);\n}\n\n.indicator {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border-radius: 0.3125rem;\n border: 1px solid var(--border);\n color: transparent;\n background: transparent;\n transition: border-color 0.12s ease, background 0.12s ease, color 0.12s ease;\n}\n\n.indicatorSelected {\n border-color: color-mix(in srgb, var(--primary) 55%, transparent);\n background: color-mix(in srgb, var(--primary) 12%, transparent);\n color: var(--primary);\n}\n\n.indicatorDisabled {\n opacity: 0.65;\n}\n\n.optionLabel {\n min-width: 0;\n flex: 1;\n display: inline-flex;\n align-items: center;\n gap: var(--uzi-menu-item-gap);\n}\n\n.optionIcon {\n width: 1rem;\n height: 1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.optionIcon > * {\n max-width: 100%;\n max-height: 100%;\n}\n\n@keyframes menuFadeIn {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n.draftActions {\n display: flex;\n gap: 0.5rem;\n padding: 0.5rem 0.25rem 0.125rem;\n border-top: 1px solid var(--ts-menu-border, var(--border));\n}\n.draftButton {\n flex: 1;\n border: 1px solid var(--ts-menu-border, var(--border));\n border-radius: var(--uzi-menu-item-radius);\n background: transparent;\n color: inherit;\n padding: 0.4rem 0.75rem;\n font: inherit;\n cursor: pointer;\n}\n.draftButton:last-child {\n background: var(--primary);\n color: var(--primary-foreground);\n border-color: var(--primary);\n}\n.draftButton:focus-visible { outline: var(--focus-ring); outline-offset: var(--focus-ring-offset); }\n.draftButton:disabled { opacity: 0.5; cursor: not-allowed; }\n"],"mappings":""}
package/dist/index27.js CHANGED
@@ -5,9 +5,16 @@ import * as React from "react";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
7
7
  //#region src/components/multi-select/MultiSelect.tsx
8
- var MultiSelect = React.forwardRef(({ options, value, onChange, placeholder = "Select options", fullWidth = true, maxVisibleValues = 2, formatValue, bulkActions = false, selectAllLabel = "Select all", clearAllLabel, className, disabled = false, name, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy }, ref) => {
9
- const selectedSet = React.useMemo(() => new Set(value), [value]);
10
- const selectedOptions = React.useMemo(() => options.filter((opt) => selectedSet.has(opt.value)), [options, selectedSet]);
8
+ var MultiSelect = React.forwardRef(({ options, value, onChange, placeholder = "Select options", fullWidth = true, maxVisibleValues = 2, formatValue, bulkActions = false, draftMode = false, minSelected = 0, selectAllLabel = "Select all", clearAllLabel, className, disabled = false, name, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy }, ref) => {
9
+ const [open, setOpen] = React.useState(false);
10
+ const [draft, setDraft] = React.useState(value);
11
+ const editValue = draftMode && open ? draft : value;
12
+ const updateSelection = (next) => {
13
+ if (draftMode) setDraft(next);
14
+ else if (next.length >= minSelected) onChange(next);
15
+ };
16
+ const selectedSet = React.useMemo(() => new Set(editValue), [editValue]);
17
+ const selectedOptions = React.useMemo(() => options.filter((opt) => value.includes(opt.value)), [options, value]);
11
18
  const enabledValues = React.useMemo(() => options.filter((option) => !option.disabled).map((option) => option.value), [options]);
12
19
  const allEnabledSelected = enabledValues.length > 0 && enabledValues.every((entry) => selectedSet.has(entry));
13
20
  const hasDisabledOptions = options.some((option) => option.disabled);
@@ -15,20 +22,25 @@ var MultiSelect = React.forwardRef(({ options, value, onChange, placeholder = "S
15
22
  const formattedValue = React.useMemo(() => formatValue?.(selectedOptions), [formatValue, selectedOptions]);
16
23
  const toggleValue = React.useCallback((nextValue) => {
17
24
  if (selectedSet.has(nextValue)) {
18
- onChange(value.filter((entry) => entry !== nextValue));
25
+ updateSelection(editValue.filter((entry) => entry !== nextValue));
19
26
  return;
20
27
  }
21
- onChange([...value, nextValue]);
28
+ updateSelection([...editValue, nextValue]);
22
29
  }, [
23
- onChange,
30
+ updateSelection,
24
31
  selectedSet,
25
- value
32
+ editValue
26
33
  ]);
27
34
  const visibleCount = Math.max(1, maxVisibleValues);
28
35
  const visibleOptions = selectedOptions.slice(0, visibleCount);
29
36
  const overflowCount = Math.max(0, selectedOptions.length - visibleOptions.length);
30
37
  return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, {
31
38
  modal: false,
39
+ open,
40
+ onOpenChange: (next) => {
41
+ if (next) setDraft([...value]);
42
+ setOpen(next);
43
+ },
32
44
  children: /* @__PURE__ */ jsxs("div", {
33
45
  className: cx(multi_select_module_default.wrapper, fullWidth && multi_select_module_default.wrapperFullWidth, className),
34
46
  children: [
@@ -95,7 +107,7 @@ var MultiSelect = React.forwardRef(({ options, value, onChange, placeholder = "S
95
107
  disabled: allEnabledSelected,
96
108
  onSelect: (event) => {
97
109
  event.preventDefault();
98
- onChange([...value, ...enabledValues.filter((entry) => !selectedSet.has(entry))]);
110
+ updateSelection([...editValue, ...enabledValues.filter((entry) => !selectedSet.has(entry))]);
99
111
  },
100
112
  children: selectAllLabel
101
113
  }), /* @__PURE__ */ jsx(DropdownMenuPrimitive.Item, {
@@ -104,7 +116,7 @@ var MultiSelect = React.forwardRef(({ options, value, onChange, placeholder = "S
104
116
  onSelect: (event) => {
105
117
  event.preventDefault();
106
118
  const enabledSet = new Set(enabledValues);
107
- onChange(value.filter((entry) => !enabledSet.has(entry)));
119
+ updateSelection(editValue.filter((entry) => !enabledSet.has(entry)));
108
120
  },
109
121
  children: resolvedClearAllLabel
110
122
  })] }) : null,
@@ -146,7 +158,25 @@ var MultiSelect = React.forwardRef(({ options, value, onChange, placeholder = "S
146
158
  }) : null, option.label]
147
159
  })]
148
160
  }, option.value);
149
- })
161
+ }),
162
+ draftMode ? /* @__PURE__ */ jsxs("div", {
163
+ className: multi_select_module_default.draftActions,
164
+ children: [/* @__PURE__ */ jsx("button", {
165
+ type: "button",
166
+ className: multi_select_module_default.draftButton,
167
+ onClick: () => setOpen(false),
168
+ children: "Cancel"
169
+ }), /* @__PURE__ */ jsx("button", {
170
+ type: "button",
171
+ className: multi_select_module_default.draftButton,
172
+ disabled: editValue.length < minSelected,
173
+ onClick: () => {
174
+ onChange(editValue);
175
+ setOpen(false);
176
+ },
177
+ children: "Apply"
178
+ })]
179
+ }) : null
150
180
  ]
151
181
  }) })
152
182
  ]