@astryxdesign/core 0.2.0-canary.ebed74f → 0.2.0-canary.ef91556

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,108 @@
1
+ /**
2
+ * @file ComplexSelector.tsx
3
+ * @input Uses React, StyleX, Field, usePopover
4
+ * @output Exports ComplexSelector component for custom selector surfaces
5
+ * @position Core implementation; consumed by index.ts
6
+ *
7
+ * SYNC: When modified, update:
8
+ * - /packages/core/src/ComplexSelector/ComplexSelector.doc.mjs
9
+ * - /packages/core/src/ComplexSelector/ComplexSelector.test.tsx
10
+ * - /packages/core/src/ComplexSelector/index.ts
11
+ * - /apps/storybook/stories/ComplexSelector.stories.tsx
12
+ */
13
+ import React, { type ReactNode } from 'react';
14
+ import type { StyleXStyles } from '@stylexjs/stylex';
15
+ import type { BaseProps } from '../BaseProps';
16
+ import { type FieldStatusVariant } from '../Field';
17
+ import type { SizeValue } from '../utils/types';
18
+ export type ComplexSelectorSize = 'sm' | 'md' | 'lg';
19
+ export interface ComplexSelectorRenderState {
20
+ /** Whether the selector surface is open. */
21
+ isOpen: boolean;
22
+ /** Whether changeAction/isLoading is pending. */
23
+ isBusy: boolean;
24
+ /** ID of the trigger button. */
25
+ triggerId: string;
26
+ /** ID of the popup content container. */
27
+ contentId: string;
28
+ }
29
+ export interface ComplexSelectorStatus {
30
+ type: 'warning' | 'error' | 'success';
31
+ message?: string;
32
+ }
33
+ export interface ComplexSelectorProps<Value> extends Omit<BaseProps<HTMLDivElement>, 'children' | 'onChange'> {
34
+ /** Label text for accessibility and the field label. */
35
+ label: string;
36
+ /** Current controlled value. */
37
+ value: Value;
38
+ /** Called when custom content commits a new value. */
39
+ onChange?: (value: Value) => void;
40
+ /** Optional async action after onChange; drives optimistic UI. */
41
+ changeAction?: (value: Value) => void | Promise<void>;
42
+ /** Custom selector surface content rendered inside a dialog popover. */
43
+ children: (value: Value, onChange: (value: Value) => void, close: () => void, state: ComplexSelectorRenderState) => ReactNode;
44
+ /** Label/content shown in the closed trigger. */
45
+ triggerLabel?: ReactNode;
46
+ /** Placeholder shown when triggerLabel is omitted. */
47
+ placeholder?: ReactNode;
48
+ /** Whether to visually hide the field label. */
49
+ isLabelHidden?: boolean;
50
+ /** Helper text displayed below the label. */
51
+ description?: string;
52
+ /** Marks the field optional. */
53
+ isOptional?: boolean;
54
+ /** Marks the field required. */
55
+ isRequired?: boolean;
56
+ /** Disables the selector. */
57
+ isDisabled?: boolean;
58
+ /** Shows loading state on the trigger. */
59
+ isLoading?: boolean;
60
+ /** Validation status. */
61
+ status?: ComplexSelectorStatus;
62
+ /** Status placement. */
63
+ statusVariant?: FieldStatusVariant;
64
+ /** Tooltip text displayed next to the label. */
65
+ labelTooltip?: string;
66
+ /** Trigger and field size. */
67
+ size?: ComplexSelectorSize;
68
+ /** Width of the field. */
69
+ width?: SizeValue;
70
+ /** Popup placement. */
71
+ placement?: 'above' | 'below' | 'start' | 'end';
72
+ /** StyleX styles for the popup content container. */
73
+ contentXstyle?: StyleXStyles;
74
+ /** Test ID for the trigger container. */
75
+ 'data-testid'?: string;
76
+ }
77
+ /**
78
+ * A selector shell for rich, custom selection surfaces.
79
+ *
80
+ * ComplexSelector owns the field, trigger, popover, focus restore, and async
81
+ * change action flow. Consumers provide the dialog content as a render function,
82
+ * using the supplied `value`, `onChange`, and `close` helpers to compose the
83
+ * right accessible structure for the custom selector.
84
+ *
85
+ * @example
86
+ * ```
87
+ * <ComplexSelector
88
+ * label="Fruit"
89
+ * value={value}
90
+ * onChange={setValue}
91
+ * triggerLabel={`${value.fruit} ${value.ripeness}`}>
92
+ * {(value, onChange, close) => (
93
+ * <FruitGrid
94
+ * value={value}
95
+ * onChange={nextValue => {
96
+ * onChange(nextValue);
97
+ * close();
98
+ * }}
99
+ * />
100
+ * )}
101
+ * </ComplexSelector>
102
+ * ```
103
+ */
104
+ export declare function ComplexSelector<Value>({ label, value, onChange, changeAction, children, triggerLabel, placeholder: placeholderFromProps, isLabelHidden, description, isOptional, isRequired, isDisabled, isLoading, status, statusVariant, labelTooltip, size, width, placement, contentXstyle, xstyle, className, style, 'data-testid': testId, ...props }: ComplexSelectorProps<Value>): React.JSX.Element;
105
+ export declare namespace ComplexSelector {
106
+ var displayName: string;
107
+ }
108
+ //# sourceMappingURL=ComplexSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComplexSelector.d.ts","sourceRoot":"","sources":["../../src/ComplexSelector/ComplexSelector.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,316 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file ComplexSelector.tsx
7
+ * @input Uses React, StyleX, Field, usePopover
8
+ * @output Exports ComplexSelector component for custom selector surfaces
9
+ * @position Core implementation; consumed by index.ts
10
+ *
11
+ * SYNC: When modified, update:
12
+ * - /packages/core/src/ComplexSelector/ComplexSelector.doc.mjs
13
+ * - /packages/core/src/ComplexSelector/ComplexSelector.test.tsx
14
+ * - /packages/core/src/ComplexSelector/index.ts
15
+ * - /apps/storybook/stories/ComplexSelector.stories.tsx
16
+ */
17
+ import React, { useCallback, useId, useOptimistic, useTransition } from 'react';
18
+ import * as stylex from '@stylexjs/stylex';
19
+ import { Field, inputWrapperStyles } from "../Field/index.js";
20
+ import { Icon } from "../Icon/index.js";
21
+ import { Spinner } from "../Spinner/index.js";
22
+ import { useTranslator } from "../i18n/index.js";
23
+ import { layerAnimations } from "../Layer/layerAnimations.stylex.js";
24
+ import { usePopover } from "../Popover/usePopover.js";
25
+ import "../theme/tokens.stylex.js";
26
+ import { colorVars, durationVars, easeVars, radiusVars, sizeVars, spacingVars, typographyVars, typeScaleVars } from "../theme/tokens.stylex.js";
27
+ import { mergeProps } from "../utils/index.js";
28
+ import { themeProps } from "../utils/themeProps.js";
29
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
30
+ const styles = {
31
+ triggerContainer: {
32
+ kVAEAm: "x1n2onr6",
33
+ k1xSpc: "x78zum5",
34
+ kGNEyG: "x6s0dn4",
35
+ kjj79g: "x1qughib",
36
+ kOIVth: "x1txdalj",
37
+ kzqmXN: "xh8yej3",
38
+ k8WAf4: "xce4md1",
39
+ kg3NbH: "xrrkdod",
40
+ kMv6JI: "x9ynric",
41
+ kGuDYH: "xcr08ib xdk3u5w",
42
+ kLWn49: "x1kq96og",
43
+ kMwMTN: "x1tgivj0",
44
+ kkrTdU: "x1ypdohk",
45
+ $$css: true
46
+ },
47
+ trigger: {
48
+ k1xSpc: "x78zum5",
49
+ kGNEyG: "x6s0dn4",
50
+ kjj79g: "x1qughib",
51
+ kOIVth: "x1txdalj",
52
+ kzQI83: "x1iyjqo2",
53
+ kmuXW: "xs83m0k",
54
+ kCS8Yb: "x1r8uery",
55
+ k7Eaqz: "xeuugli",
56
+ kmVPX3: "x1717udv",
57
+ kogj98: "x1ghz6dp",
58
+ kMzoRj: "xc342km",
59
+ ksu8eU: "xng3xce",
60
+ kWkggS: "xjbqb8w",
61
+ kMv6JI: "xjb2p0i",
62
+ kGuDYH: "x1qlqyl8",
63
+ kLWn49: "x15bjb6t",
64
+ kMwMTN: "x1heor9g",
65
+ kkrTdU: "x1ypdohk",
66
+ kI3sdo: "x1a2a7pz",
67
+ kaIpWk: "xh6dtrn",
68
+ $$css: true
69
+ },
70
+ triggerText: {
71
+ kzQI83: "x1iyjqo2",
72
+ k7Eaqz: "xeuugli",
73
+ kVQacm: "xb3r6kr",
74
+ kg5iWk: "xlyipyv",
75
+ khDVqt: "xuxw1ft",
76
+ k9WMMc: "x1yc453h",
77
+ $$css: true
78
+ },
79
+ placeholder: {
80
+ kMwMTN: "xv1l7n4",
81
+ $$css: true
82
+ },
83
+ triggerIcon: {
84
+ kmuXW: "x2lah0s",
85
+ k1xSpc: "x78zum5",
86
+ kGNEyG: "x6s0dn4",
87
+ kjj79g: "xl56j7k",
88
+ kzqmXN: "x1kky2od",
89
+ kZKoxP: "xlup9mm",
90
+ k1ekBW: "x11xpdln",
91
+ kIyJzY: "xuedmi6",
92
+ kAMwcw: "xlr8y92",
93
+ k3nNDw: "x1g0ag68",
94
+ kMwMTN: "xv9yike",
95
+ $$css: true
96
+ },
97
+ triggerIconOpen: {
98
+ k3aq6I: "x19jd1h0",
99
+ $$css: true
100
+ },
101
+ popover: {
102
+ k7Eaqz: "xrzjruh",
103
+ keoZOQ: "xcsaf9d",
104
+ $$css: true
105
+ },
106
+ content: {
107
+ kB7OPa: "x9f619",
108
+ kskxy: "xpnbb6b",
109
+ kVQacm: "xysyzu8",
110
+ kmVPX3: "x1b2ylru",
111
+ $$css: true
112
+ },
113
+ sm: {
114
+ kAzted: "x1gdqauq",
115
+ $$css: true
116
+ },
117
+ md: {
118
+ kAzted: "x1uogy3y",
119
+ $$css: true
120
+ },
121
+ lg: {
122
+ kAzted: "x1xf4nls",
123
+ $$css: true
124
+ },
125
+ disabled: {
126
+ kkrTdU: "x1h6gzvc",
127
+ $$css: true
128
+ },
129
+ focusRing: {
130
+ k8PahR: "x1oqel4m",
131
+ kfQpEX: "x1fanpfn",
132
+ $$css: true
133
+ }
134
+ };
135
+ /**
136
+ * A selector shell for rich, custom selection surfaces.
137
+ *
138
+ * ComplexSelector owns the field, trigger, popover, focus restore, and async
139
+ * change action flow. Consumers provide the dialog content as a render function,
140
+ * using the supplied `value`, `onChange`, and `close` helpers to compose the
141
+ * right accessible structure for the custom selector.
142
+ *
143
+ * @example
144
+ * ```
145
+ * <ComplexSelector
146
+ * label="Fruit"
147
+ * value={value}
148
+ * onChange={setValue}
149
+ * triggerLabel={`${value.fruit} ${value.ripeness}`}>
150
+ * {(value, onChange, close) => (
151
+ * <FruitGrid
152
+ * value={value}
153
+ * onChange={nextValue => {
154
+ * onChange(nextValue);
155
+ * close();
156
+ * }}
157
+ * />
158
+ * )}
159
+ * </ComplexSelector>
160
+ * ```
161
+ */
162
+ export function ComplexSelector({
163
+ label,
164
+ value,
165
+ onChange,
166
+ changeAction,
167
+ children,
168
+ triggerLabel,
169
+ placeholder: placeholderFromProps,
170
+ isLabelHidden = false,
171
+ description,
172
+ isOptional = false,
173
+ isRequired = false,
174
+ isDisabled = false,
175
+ isLoading = false,
176
+ status,
177
+ statusVariant = 'attached',
178
+ labelTooltip,
179
+ size = 'md',
180
+ width,
181
+ placement = 'below',
182
+ contentXstyle,
183
+ xstyle,
184
+ className,
185
+ style,
186
+ 'data-testid': testId,
187
+ ...props
188
+ }) {
189
+ const t = useTranslator();
190
+ const placeholder = placeholderFromProps ?? t('@astryx.selector.placeholder');
191
+ const triggerId = useId();
192
+ const labelId = useId();
193
+ const contentId = useId();
194
+ const descriptionId = useId();
195
+ const statusMessageId = useId();
196
+ const ariaDescribedBy = [description ? descriptionId : null, status?.message ? statusMessageId : null].filter(id => id != null).join(' ') || undefined;
197
+ const [isPending, startTransition] = useTransition();
198
+ const [optimisticValue, setOptimisticValue] = useOptimistic(value);
199
+ const isBusy = isLoading || isPending;
200
+ const popover = usePopover({
201
+ dialogLabel: label,
202
+ hasCloseButton: false,
203
+ hasAutoFocus: true,
204
+ onHide: () => {
205
+ document.getElementById(triggerId)?.focus();
206
+ }
207
+ });
208
+ const commitValue = useCallback(nextValue => {
209
+ onChange?.(nextValue);
210
+ if (changeAction) {
211
+ startTransition(async () => {
212
+ setOptimisticValue(nextValue);
213
+ await changeAction(nextValue);
214
+ });
215
+ }
216
+ }, [changeAction, onChange, setOptimisticValue, startTransition]);
217
+ const triggerContent = triggerLabel ?? placeholder;
218
+ const content = /*#__PURE__*/_jsx("div", {
219
+ id: contentId,
220
+ ...stylex.props(styles.content, contentXstyle),
221
+ children: children(optimisticValue, commitValue, popover.hide, {
222
+ isOpen: popover.isOpen,
223
+ isBusy,
224
+ triggerId,
225
+ contentId
226
+ })
227
+ });
228
+ const selectorContent = /*#__PURE__*/_jsxs(_Fragment, {
229
+ children: [/*#__PURE__*/_jsxs("div", {
230
+ ref: popover.triggerRef,
231
+ "data-testid": testId,
232
+ ...props,
233
+ onClick: () => {
234
+ if (!isDisabled) {
235
+ popover.toggle();
236
+ }
237
+ },
238
+ ...mergeProps(themeProps('complex-selector', {
239
+ size,
240
+ status: status?.type ?? null
241
+ }), stylex.props(inputWrapperStyles.base, styles.triggerContainer, styles[size], styles.focusRing, isDisabled && inputWrapperStyles.disabled, isDisabled && styles.disabled, triggerLabel == null && styles.placeholder, xstyle), className, style),
242
+ children: [/*#__PURE__*/_jsx("button", {
243
+ id: triggerId,
244
+ type: "button",
245
+ "aria-haspopup": "dialog",
246
+ "aria-expanded": popover.isOpen,
247
+ "aria-controls": contentId,
248
+ "aria-describedby": ariaDescribedBy,
249
+ "aria-labelledby": labelId,
250
+ "aria-required": isRequired ? 'true' : undefined,
251
+ "aria-invalid": status?.type === 'error' ? 'true' : undefined,
252
+ "aria-busy": isBusy || undefined,
253
+ disabled: isDisabled,
254
+ onKeyDown: event => {
255
+ if (event.key === 'ArrowDown' && !popover.isOpen && !isDisabled) {
256
+ event.preventDefault();
257
+ popover.show();
258
+ }
259
+ },
260
+ ...{
261
+ className: "x78zum5 x6s0dn4 x1qughib x1txdalj x1iyjqo2 xs83m0k x1r8uery xeuugli x1717udv x1ghz6dp xc342km xng3xce xjbqb8w xjb2p0i x1qlqyl8 x15bjb6t x1heor9g x1ypdohk x1a2a7pz xh6dtrn"
262
+ },
263
+ children: /*#__PURE__*/_jsx("span", {
264
+ ...{
265
+ className: "x1iyjqo2 xeuugli xb3r6kr xlyipyv xuxw1ft x1yc453h"
266
+ },
267
+ children: triggerContent
268
+ })
269
+ }), isBusy && /*#__PURE__*/_jsx(Spinner, {
270
+ size: "sm"
271
+ }), /*#__PURE__*/_jsx("span", {
272
+ ...{
273
+ 0: {
274
+ className: "x2lah0s x78zum5 x6s0dn4 xl56j7k x1kky2od xlup9mm x11xpdln xuedmi6 xlr8y92 x1g0ag68 xv9yike"
275
+ },
276
+ 1: {
277
+ className: "x2lah0s x78zum5 x6s0dn4 xl56j7k x1kky2od xlup9mm x11xpdln xuedmi6 xlr8y92 x1g0ag68 xv9yike x19jd1h0"
278
+ }
279
+ }[!!popover.isOpen << 0],
280
+ children: /*#__PURE__*/_jsx(Icon, {
281
+ icon: "chevronDown",
282
+ size: "sm",
283
+ color: "inherit",
284
+ ...themeProps('complex-selector-indicator-icon', {
285
+ state: popover.isOpen ? 'expanded' : 'collapsed'
286
+ })
287
+ })
288
+ })]
289
+ }), popover.render(content, {
290
+ placement,
291
+ alignment: 'start',
292
+ xstyle: [styles.popover, layerAnimations[placement]]
293
+ })]
294
+ });
295
+ return /*#__PURE__*/_jsx(Field, {
296
+ label: label,
297
+ isLabelHidden: isLabelHidden,
298
+ description: description,
299
+ inputID: triggerId,
300
+ descriptionID: description ? descriptionId : undefined,
301
+ labelID: labelId,
302
+ isOptional: isOptional,
303
+ isRequired: isRequired,
304
+ isDisabled: isDisabled,
305
+ status: status ? {
306
+ type: status.type,
307
+ message: status.message,
308
+ messageID: status.message ? statusMessageId : undefined
309
+ } : undefined,
310
+ statusVariant: statusVariant,
311
+ labelTooltip: labelTooltip,
312
+ width: width,
313
+ children: selectorContent
314
+ });
315
+ }
316
+ ComplexSelector.displayName = 'ComplexSelector';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @file index.ts
3
+ * @output Exports ComplexSelector and types
4
+ * @position Public API entry point
5
+ */
6
+ export { ComplexSelector, type ComplexSelectorProps, type ComplexSelectorRenderState, type ComplexSelectorSize, type ComplexSelectorStatus, } from './ComplexSelector';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ComplexSelector/index.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,GAC3B,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file index.ts
7
+ * @output Exports ComplexSelector and types
8
+ * @position Public API entry point
9
+ */
10
+ export { ComplexSelector } from "./ComplexSelector.js";
package/dist/astryx.css CHANGED
@@ -458,6 +458,7 @@
458
458
  .xa1yw2k:focus-within:not(#\#):not(#\#){border-color:var(--color-warning)}
459
459
  .x17nn4n9:focus-visible:not(#\#):not(#\#){outline:2px solid var(--color-accent)}
460
460
  .x1gj1ihy.x1gj1ihy:where(.x1iwu4tg:has(:focus-visible) *):not(#\#):not(#\#){outline:2px solid var(--color-accent)}
461
+ .x1oqel4m:focus-within:not(#\#):not(#\#){outline:2px solid var(--color-accent)}
461
462
  .xkri23q.xkri23q:where(.x1tspnpo:has(:focus-visible) *):not(#\#):not(#\#){outline:2px solid var(--color-accent)}
462
463
  .x1p73he7:focus-visible:not(#\#):not(#\#){outline:2px solid var(--color-error)}
463
464
  .x1p25gnr:focus-visible:not(#\#):not(#\#){outline:var(--border-width) solid var(--color-accent)}
@@ -1153,6 +1154,7 @@
1153
1154
  .xofkqq2:popover-open:not(#\#):not(#\#):not(#\#){opacity:1}
1154
1155
  .xzunyri:focus-visible:not(#\#):not(#\#):not(#\#){outline-color:var(--color-accent)}
1155
1156
  .x1edzap1.x1edzap1:where(.x1iwu4tg:has(:focus-visible) *):not(#\#):not(#\#):not(#\#){outline-offset:2px}
1157
+ .x1fanpfn:focus-within:not(#\#):not(#\#):not(#\#){outline-offset:2px}
1156
1158
  .x7s97pk:focus-visible:not(#\#):not(#\#):not(#\#){outline-offset:2px}
1157
1159
  .x81n7kt.x81n7kt:where(.x1tspnpo:has(:focus-visible) *):not(#\#):not(#\#):not(#\#){outline-offset:2px}
1158
1160
  .x13aywxo:focus-visible:not(#\#):not(#\#):not(#\#){outline-offset:var(--button-focus-offset)}
@@ -1408,6 +1410,7 @@
1408
1410
  .x1xiyphd:not(#\#):not(#\#):not(#\#):not(#\#){max-height:240px}
1409
1411
  .xuyqlj2:not(#\#):not(#\#):not(#\#):not(#\#){max-height:300px}
1410
1412
  .xbhvqqn:not(#\#):not(#\#):not(#\#):not(#\#){max-height:calc(100% - var(--spacing-3))}
1413
+ .xpnbb6b:not(#\#):not(#\#):not(#\#):not(#\#){max-height:min(480px,calc(100vh - 32px))}
1411
1414
  .x7ab17h:not(#\#):not(#\#):not(#\#):not(#\#){max-height:none}
1412
1415
  .xenllk4:not(#\#):not(#\#):not(#\#):not(#\#){max-height:var(--container-max-height,none)}
1413
1416
  .x1jols5v:not(#\#):not(#\#):not(#\#):not(#\#){max-height:var(--x-maxHeight)}