@astryxdesign/core 0.1.6-canary.15dd282 → 0.1.6-canary.1b61ba6

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 (104) hide show
  1. package/dist/Button/Button.d.ts.map +1 -1
  2. package/dist/Button/Button.js +34 -4
  3. package/dist/ButtonGroup/ButtonGroup.d.ts +19 -4
  4. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  5. package/dist/ButtonGroup/ButtonGroup.js +19 -4
  6. package/dist/Chat/index.d.ts +1 -1
  7. package/dist/Chat/index.d.ts.map +1 -1
  8. package/dist/Chat/useChatStreamScroll.d.ts +12 -1
  9. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  10. package/dist/Chat/useChatStreamScroll.js +43 -6
  11. package/dist/Dialog/Dialog.d.ts.map +1 -1
  12. package/dist/Dialog/Dialog.js +15 -12
  13. package/dist/Dialog/DialogHeader.d.ts +1 -1
  14. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  15. package/dist/Dialog/DialogHeader.js +3 -1
  16. package/dist/FileInput/FileInput.d.ts.map +1 -1
  17. package/dist/FileInput/FileInput.js +6 -0
  18. package/dist/Table/BaseTable.d.ts.map +1 -1
  19. package/dist/Table/BaseTable.js +26 -15
  20. package/dist/Table/Table.js +2 -2
  21. package/dist/Table/plugins/columnResize/useTableColumnResize.js +1 -1
  22. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +1 -1
  23. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  24. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +1 -1
  25. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -2
  26. package/dist/Table/types.d.ts +17 -10
  27. package/dist/Table/types.d.ts.map +1 -1
  28. package/dist/astryx.css +3 -1
  29. package/dist/astryx.umd.js +12 -12
  30. package/dist/astryx.umd.js.map +3 -3
  31. package/dist/authoring/doc.d.ts +145 -0
  32. package/dist/authoring/doc.d.ts.map +1 -0
  33. package/dist/authoring/doc.js +100 -0
  34. package/dist/authoring/index.d.ts +29 -0
  35. package/dist/authoring/index.d.ts.map +1 -0
  36. package/dist/authoring/index.js +28 -0
  37. package/dist/authoring/integration.d.ts +35 -0
  38. package/dist/authoring/integration.d.ts.map +1 -0
  39. package/dist/authoring/integration.js +30 -0
  40. package/dist/authoring/template.d.ts +66 -0
  41. package/dist/authoring/template.d.ts.map +1 -0
  42. package/dist/authoring/template.js +55 -0
  43. package/dist/config.d.ts +80 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +40 -0
  46. package/package.json +11 -1
  47. package/src/AppShell/AppShell.doc.mjs +8 -2
  48. package/src/Button/Button.tsx +34 -4
  49. package/src/ButtonGroup/ButtonGroup.test.tsx +386 -2
  50. package/src/ButtonGroup/ButtonGroup.tsx +19 -4
  51. package/src/Card/Card.doc.mjs +3 -3
  52. package/src/Chat/ChatLayout.test.tsx +127 -2
  53. package/src/Chat/ChatMessageList.doc.mjs +1 -1
  54. package/src/Chat/ChatToolCalls.doc.mjs +1 -1
  55. package/src/Chat/index.ts +1 -0
  56. package/src/Chat/useChatStreamScroll.test.tsx +168 -0
  57. package/src/Chat/useChatStreamScroll.ts +67 -11
  58. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  59. package/src/ClickableCard/ClickableCard.doc.mjs +1 -1
  60. package/src/DateInput/DateInput.doc.mjs +2 -2
  61. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  62. package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -2
  63. package/src/Dialog/Dialog.tsx +11 -15
  64. package/src/Dialog/DialogHeader.tsx +3 -1
  65. package/src/Field/Field.doc.mjs +2 -2
  66. package/src/FileInput/FileInput.test.tsx +40 -1
  67. package/src/FileInput/FileInput.tsx +9 -0
  68. package/src/Grid/Grid.doc.mjs +5 -5
  69. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  70. package/src/Lightbox/Lightbox.doc.mjs +7 -2
  71. package/src/OverflowList/OverflowList.doc.mjs +2 -2
  72. package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
  73. package/src/PowerSearch/formatFilterValue.test.ts +282 -0
  74. package/src/RadioList/RadioList.doc.mjs +1 -1
  75. package/src/Section/Section.doc.mjs +4 -4
  76. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  77. package/src/Slider/Slider.doc.mjs +2 -2
  78. package/src/Stack/Stack.doc.mjs +10 -10
  79. package/src/Switch/Switch.doc.mjs +2 -2
  80. package/src/Table/BaseTable.tsx +28 -18
  81. package/src/Table/Table.test.tsx +132 -1
  82. package/src/Table/Table.tsx +3 -3
  83. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -1
  84. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +1 -1
  85. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +2 -5
  86. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +4 -4
  87. package/src/Table/types.ts +18 -12
  88. package/src/Table/useTableFiltering.doc.mjs +2 -2
  89. package/src/Table/useTableSortable.doc.mjs +11 -11
  90. package/src/Text/Text.doc.mjs +2 -2
  91. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  92. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  93. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  94. package/src/Toolbar/Toolbar.doc.mjs +1 -1
  95. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  96. package/src/authoring/doc.ts +166 -0
  97. package/src/authoring/index.test.ts +52 -0
  98. package/src/authoring/index.ts +50 -0
  99. package/src/authoring/integration.ts +42 -0
  100. package/src/authoring/template.ts +74 -0
  101. package/src/config.test.ts +16 -0
  102. package/src/config.ts +92 -0
  103. package/src/docPropLiterals.test.ts +938 -0
  104. package/src/i18n/useTranslator.doc.mjs +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"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"}
@@ -228,12 +228,42 @@ const loadingStyles = {
228
228
  $$css: true
229
229
  }
230
230
  };
231
+
232
+ /**
233
+ * "I am the last member of the group" — the trailing end cap.
234
+ *
235
+ * NOT `:last-child`: several members render an invisible layer element AFTER
236
+ * their button (a tooltip'd Button returns button + layer; DropdownMenu returns
237
+ * trigger + popover). `useLayer` renders those inline rather than portaling
238
+ * them, so the layer — not the button — took the `:last-child` slot and the real
239
+ * trailing button silently kept square corners (#2508).
240
+ *
241
+ * Layers always carry the native `popover` attribute (useLayer.tsx), and a
242
+ * popover is never an in-flow member — it is `display: none` until shown, then
243
+ * promoted to the top layer. So "last member" is: no following element sibling
244
+ * that isn't a popover.
245
+ *
246
+ * Reading it the other way round — marking the *buttons* and testing for a
247
+ * marked sibling — is the trap: it silently reclassifies anything it doesn't
248
+ * recognise as "not a member", so a member wrapped in a `display: contents`
249
+ * wrapper (Tooltip, HoverCard) or a raw child would make the button BEFORE it
250
+ * round mid-group. Ignoring known layers keeps the predicate conservative: an
251
+ * unrecognised sibling still counts, exactly as `:last-child` did, so the worst
252
+ * case degrades to the old behaviour instead of a wrong corner.
253
+ *
254
+ * Kept as a same-file const: StyleX only statically evaluates a selector key
255
+ * from a const in the same file.
256
+ *
257
+ * The leading edge still uses `:first-child` — a member's button always precedes
258
+ * its own layer, so the first button is genuinely `:first-child`.
259
+ */
260
+ const IS_LAST_ITEM = ':not(:has(~ *:not([popover])))';
231
261
  const groupStyles = {
232
262
  horizontal: {
233
263
  krdFHd: "x15mokao x8eehn2",
234
264
  kVL7Gh: "xbiv7yw x1xrp5p4",
235
- kfmiAY: "x1ga7v0g x11xp8u1",
236
- kT0f0o: "x16uus16 x747jw7",
265
+ kfmiAY: "x1ga7v0g xbfdvlp",
266
+ kT0f0o: "x16uus16 xajhecq",
237
267
  k2ei4v: "xgbv0en x1pjv70x",
238
268
  kVhnKS: "x1t7ytsu xyf0ibl",
239
269
  kGJrpR: "x1j92z86",
@@ -242,8 +272,8 @@ const groupStyles = {
242
272
  vertical: {
243
273
  krdFHd: "x15mokao x8eehn2",
244
274
  kfmiAY: "x1ga7v0g x2qxyot",
245
- kVL7Gh: "xbiv7yw x1yp72r9",
246
- kT0f0o: "x16uus16 x747jw7",
275
+ kVL7Gh: "xbiv7yw x12tyzlf",
276
+ kT0f0o: "x16uus16 xajhecq",
247
277
  kEafiO: "x11xkdxz x1g31smg",
248
278
  kPef9Z: "x13fuv20 x1d9v4yf",
249
279
  kLZC3w: "x1pc3f07",
@@ -4,9 +4,10 @@
4
4
  * @output Exports ButtonGroup component, context, and types
5
5
  * @position Groups buttons with connected styling; consumed by index.ts
6
6
  *
7
- * Children (Button, IconButton) consume the ButtonGroup context to
8
- * apply position-aware styles using CSS :first-child / :last-child
9
- * pseudo-classes no cloneElement or wrapper divs needed.
7
+ * Children (Button, IconButton) consume the ButtonGroup context to apply
8
+ * position-aware styles in pure CSS no cloneElement or wrapper divs needed.
9
+ * The end-cap radius rules live in Button.tsx; see IS_LAST_ITEM there for why
10
+ * the trailing edge cannot use :last-child (#2508).
10
11
  *
11
12
  * SYNC: When modified, update these files to stay in sync:
12
13
  * - /packages/core/src/ButtonGroup/ButtonGroup.doc.mjs (props table, features)
@@ -56,7 +57,10 @@ export interface ButtonGroupProps extends BaseProps<HTMLDivElement> {
56
57
  * handling (only on outer edges), and horizontal or vertical orientation.
57
58
  *
58
59
  * Children automatically detect the group via context and apply position-aware
59
- * styles using CSS :first-child / :last-child pseudo-classes.
60
+ * styles in pure CSS.
61
+ *
62
+ * Members that render their own layer — a Button with a `tooltip`, or a
63
+ * DropdownMenu — compose correctly, including as the trailing member.
60
64
  *
61
65
  * @example
62
66
  * ```
@@ -66,6 +70,17 @@ export interface ButtonGroupProps extends BaseProps<HTMLDivElement> {
66
70
  * <Button label="Paste" />
67
71
  * </ButtonGroup>
68
72
  * ```
73
+ *
74
+ * @example
75
+ * ```
76
+ * <ButtonGroup label="Approve action">
77
+ * <Button label="Allow once" variant="primary" />
78
+ * <DropdownMenu
79
+ * button={{label: 'Allow options', variant: 'primary', isIconOnly: true, icon: <Icon icon="chevronDown" />}}
80
+ * items={[{label: 'Allow for 30 minutes'}, {label: 'Always allow'}]}
81
+ * />
82
+ * </ButtonGroup>
83
+ * ```
69
84
  */
70
85
  export declare function ButtonGroup({ children, label, orientation, size: sizeProp, isDisabled, xstyle, className, style, ref, 'data-testid': testId, onKeyDown, ...props }: ButtonGroupProps): ReactNode;
71
86
  export declare namespace ButtonGroup {
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonGroup.d.ts","sourceRoot":"","sources":["../../src/ButtonGroup/ButtonGroup.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAU,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAI1C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,sBAAsB,CAAC;AAOjE,MAAM,WAAW,gBAAiB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACjE,yCAAyC;IACzC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,WAAW,CAAC,EAAE,sBAAsB,CAAC;IAErC;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAK,EACL,WAA0B,EAC1B,IAAI,EAAE,QAAQ,EACd,UAAkB,EAClB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,MAAM,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG,SAAS,CAuC9B;yBApDe,WAAW"}
1
+ {"version":3,"file":"ButtonGroup.d.ts","sourceRoot":"","sources":["../../src/ButtonGroup/ButtonGroup.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAU,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAI1C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,sBAAsB,CAAC;AAOjE,MAAM,WAAW,gBAAiB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACjE,yCAAyC;IACzC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,WAAW,CAAC,EAAE,sBAAsB,CAAC;IAErC;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAK,EACL,WAA0B,EAC1B,IAAI,EAAE,QAAQ,EACd,UAAkB,EAClB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,MAAM,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG,SAAS,CAuC9B;yBApDe,WAAW"}
@@ -8,9 +8,10 @@
8
8
  * @output Exports ButtonGroup component, context, and types
9
9
  * @position Groups buttons with connected styling; consumed by index.ts
10
10
  *
11
- * Children (Button, IconButton) consume the ButtonGroup context to
12
- * apply position-aware styles using CSS :first-child / :last-child
13
- * pseudo-classes no cloneElement or wrapper divs needed.
11
+ * Children (Button, IconButton) consume the ButtonGroup context to apply
12
+ * position-aware styles in pure CSS no cloneElement or wrapper divs needed.
13
+ * The end-cap radius rules live in Button.tsx; see IS_LAST_ITEM there for why
14
+ * the trailing edge cannot use :last-child (#2508).
14
15
  *
15
16
  * SYNC: When modified, update these files to stay in sync:
16
17
  * - /packages/core/src/ButtonGroup/ButtonGroup.doc.mjs (props table, features)
@@ -56,7 +57,10 @@ const styles = {
56
57
  * handling (only on outer edges), and horizontal or vertical orientation.
57
58
  *
58
59
  * Children automatically detect the group via context and apply position-aware
59
- * styles using CSS :first-child / :last-child pseudo-classes.
60
+ * styles in pure CSS.
61
+ *
62
+ * Members that render their own layer — a Button with a `tooltip`, or a
63
+ * DropdownMenu — compose correctly, including as the trailing member.
60
64
  *
61
65
  * @example
62
66
  * ```
@@ -66,6 +70,17 @@ const styles = {
66
70
  * <Button label="Paste" />
67
71
  * </ButtonGroup>
68
72
  * ```
73
+ *
74
+ * @example
75
+ * ```
76
+ * <ButtonGroup label="Approve action">
77
+ * <Button label="Allow once" variant="primary" />
78
+ * <DropdownMenu
79
+ * button={{label: 'Allow options', variant: 'primary', isIconOnly: true, icon: <Icon icon="chevronDown" />}}
80
+ * items={[{label: 'Allow for 30 minutes'}, {label: 'Always allow'}]}
81
+ * />
82
+ * </ButtonGroup>
83
+ * ```
69
84
  */
70
85
  export function ButtonGroup({
71
86
  children,
@@ -24,7 +24,7 @@ export type { ChatMessageMetadataProps, ChatMessageStatus, } from './ChatMessage
24
24
  export { ChatSystemMessage } from './ChatSystemMessage';
25
25
  export type { ChatSystemMessageProps, ChatSystemMessageVariant, } from './ChatSystemMessage';
26
26
  export { useChatStreamScroll } from './useChatStreamScroll';
27
- export type { UseChatStreamScrollOptions, UseChatStreamScrollReturn, } from './useChatStreamScroll';
27
+ export type { ChatScrollToBottomOptions, UseChatStreamScrollOptions, UseChatStreamScrollReturn, } from './useChatStreamScroll';
28
28
  export { useChatNewMessages } from './useChatNewMessages';
29
29
  export type { UseChatNewMessagesOptions, UseChatNewMessagesReturn, } from './useChatNewMessages';
30
30
  export { useChatPasteAsToken } from './useChatPasteAsToken';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Chat/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,14 @@
1
+ export interface ChatScrollToBottomOptions {
2
+ /**
3
+ * `'instant'` jumps to the bottom in a single frame instead of running
4
+ * the spring animation. Use for programmatic positioning (opening a
5
+ * conversation, restoring a session) — keep the default `'spring'` for
6
+ * user-initiated scrolls like the scroll-to-bottom button. Mirrors the
7
+ * DOM's `scrollTo({behavior})`.
8
+ * @default 'spring'
9
+ */
10
+ behavior?: 'instant' | 'spring';
11
+ }
1
12
  export interface UseChatStreamScrollOptions {
2
13
  /**
3
14
  * Ref to the scrollable container element.
@@ -42,7 +53,7 @@ export interface UseChatStreamScrollReturn {
42
53
  /** Whether auto-scroll is locked (following content). */
43
54
  isLocked: boolean;
44
55
  /** Scroll to the bottom of the container and re-lock. */
45
- scrollToBottom: () => void;
56
+ scrollToBottom: (options?: ChatScrollToBottomOptions) => void;
46
57
  /** Scroll so a specific element is at the top of the visible area. No lock change. */
47
58
  scrollToMessage: (el: HTMLElement) => void;
48
59
  /** Lock auto-scroll and scroll to bottom. */
@@ -1 +1 @@
1
- {"version":3,"file":"useChatStreamScroll.d.ts","sourceRoot":"","sources":["../../src/Chat/useChatStreamScroll.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAC;IAEtB,yDAAyD;IACzD,QAAQ,EAAE,OAAO,CAAC;IAElB,yDAAyD;IACzD,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,sFAAsF;IACtF,eAAe,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAE3C,6CAA6C;IAC7C,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB,oEAAoE;IACpE,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,mDAAmD;IACnD,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACjC;AAQD,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,OAAc,EACd,aAAkB,EAClB,eAAqB,EACrB,OAAa,EACb,SAAgB,EAChB,IAAW,GACZ,EAAE,0BAA0B,GAAG,yBAAyB,CAmOxD"}
1
+ {"version":3,"file":"useChatStreamScroll.d.ts","sourceRoot":"","sources":["../../src/Chat/useChatStreamScroll.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,yBAAyB;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAC;IAEtB,yDAAyD;IACzD,QAAQ,EAAE,OAAO,CAAC;IAElB,yDAAyD;IACzD,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAE9D,sFAAsF;IACtF,eAAe,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAE3C,6CAA6C;IAC7C,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB,oEAAoE;IACpE,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,mDAAmD;IACnD,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACjC;AAQD,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,OAAc,EACd,aAAkB,EAClB,eAAqB,EACrB,OAAa,EACb,SAAgB,EAChB,IAAW,GACZ,EAAE,0BAA0B,GAAG,yBAAyB,CA4QxD"}
@@ -12,6 +12,9 @@
12
12
  * - Locked (default): content growth auto-scrolls to bottom via rAF spring
13
13
  * - Scrolling up (any source): unlocks immediately
14
14
  * - Scrolling settles at bottom: re-locks on scrollend
15
+ * - The first fill positions instantly (whether content is present at
16
+ * mount or arrives async); only subsequent growth springs
17
+ * - `scrollToBottom({behavior: 'instant'})` jumps in one frame, no animation
15
18
  *
16
19
  * Uses scroll direction (lastScrollTop comparison) to detect user
17
20
  * intent — works for wheel, touch, scrollbar drag, keyboard, everything.
@@ -44,6 +47,9 @@ export function useChatStreamScroll({
44
47
  const [isScrolledUp, setIsScrolledUp] = useState(false);
45
48
  const [isLocked, setIsLocked] = useState(true);
46
49
  const lockedRef = useRef(true);
50
+ // True until the initial fill has been positioned — consumed by the first
51
+ // scrollIfLocked that sees scrollable content.
52
+ const initialFillPendingRef = useRef(true);
47
53
  const velocityRef = useRef(0);
48
54
  const animatingRef = useRef(false);
49
55
  const lastTickRef = useRef(undefined);
@@ -95,14 +101,33 @@ export function useChatStreamScroll({
95
101
  }
96
102
  }, [animate]);
97
103
 
104
+ // Jump to the bottom in a single frame — cancels any in-flight spring so
105
+ // a later animation tick can't fight the assignment.
106
+ const jumpToBottom = useCallback(() => {
107
+ const el = scrollRef.current;
108
+ if (!el) {
109
+ return;
110
+ }
111
+ animatingRef.current = false;
112
+ velocityRef.current = 0;
113
+ lastTickRef.current = undefined;
114
+ el.scrollTop = el.scrollHeight - el.clientHeight;
115
+ lastScrollTopRef.current = el.scrollTop;
116
+ }, [scrollRef]);
117
+
98
118
  // --- Public API ---
99
119
 
100
- const scrollToBottom = useCallback(() => {
120
+ const scrollToBottom = useCallback(options => {
101
121
  lockedRef.current = true;
102
122
  setIsLocked(true);
103
123
  setIsScrolledUp(false);
124
+ initialFillPendingRef.current = false;
125
+ if (options?.behavior === 'instant') {
126
+ jumpToBottom();
127
+ return;
128
+ }
104
129
  startAnimation();
105
- }, [startAnimation]);
130
+ }, [startAnimation, jumpToBottom]);
106
131
  const scrollToMessage = useCallback(el => {
107
132
  const container = scrollRef.current;
108
133
  if (!container) {
@@ -143,10 +168,21 @@ export function useChatStreamScroll({
143
168
  if (!enabled) {
144
169
  return;
145
170
  }
146
- if (lockedRef.current) {
147
- startAnimation();
171
+ if (!lockedRef.current) {
172
+ return;
148
173
  }
149
- }, [enabled, startAnimation]);
174
+ // Initial fill: content appearing for the first time (e.g. an
175
+ // async-loaded conversation) positions in one frame instead of
176
+ // spring-flying from the top. Stays pending through empty/loading
177
+ // resizes until the container is actually scrollable.
178
+ const el = scrollRef.current;
179
+ if (initialFillPendingRef.current && el && el.scrollHeight > el.clientHeight) {
180
+ initialFillPendingRef.current = false;
181
+ jumpToBottom();
182
+ return;
183
+ }
184
+ startAnimation();
185
+ }, [enabled, startAnimation, jumpToBottom, scrollRef]);
150
186
 
151
187
  // --- Event listeners ---
152
188
 
@@ -230,11 +266,12 @@ export function useChatStreamScroll({
230
266
  passive: true
231
267
  });
232
268
 
233
- // Initial scroll to bottom
269
+ // Initial scroll to bottom — content already present at mount.
234
270
  requestAnimationFrame(() => {
235
271
  if (el.scrollHeight > el.clientHeight) {
236
272
  el.scrollTop = el.scrollHeight - el.clientHeight;
237
273
  lastScrollTopRef.current = el.scrollTop;
274
+ initialFillPendingRef.current = false;
238
275
  }
239
276
  });
240
277
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/Dialog/Dialog.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA6B,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AACjE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoB5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAwBhD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAyHD,MAAM,WAAW,WAAY,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC/D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE3C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,QAAgB,EAChB,YAAY,EACZ,KAAW,EACX,SAAkB,EAClB,QAAQ,EACR,OAAoB,EACpB,OAAgB,EAChB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,sCAyOb;yBAzPe,MAAM"}
1
+ {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../src/Dialog/Dialog.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA6B,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AACjE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoB5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAwBhD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAyHD,MAAM,WAAW,WAAY,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC/D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE3C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,QAAgB,EAChB,YAAY,EACZ,KAAW,EACX,SAAkB,EAClB,QAAQ,EACR,OAAoB,EACpB,OAAgB,EAChB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,sCAqOb;yBArPe,MAAM"}
@@ -359,38 +359,41 @@ export function Dialog({
359
359
  })
360
360
  });
361
361
 
362
+ // Filter out native open to prevent InvalidStateError when accidentally passed
363
+ const hasPosition = position != null && !isFullscreen;
364
+ const {
365
+ open: _open,
366
+ ...safeProps
367
+ } = props;
368
+
362
369
  // --- Inline rendering path (for documentation previews) ---
363
370
  if (isInline) {
364
371
  if (!isOpen) {
365
372
  return null;
366
373
  }
367
374
  return /*#__PURE__*/_jsx("div", {
375
+ ...safeProps,
368
376
  ...mergeProps(themeProps('dialog', {
369
377
  variant
370
378
  }), stylex.props(styles.inlineWrapper, !isFullscreen && dynamicStyles.sizing(width, maxHeight), isFullscreen && styles.fullscreen, xstyle), className, style),
371
- "data-testid": props['data-testid'],
372
379
  children: innerContent
373
380
  });
374
381
  }
375
382
 
376
383
  // --- Standard modal rendering path ---
377
- const hasPosition = position != null && !isFullscreen;
378
384
 
379
- // Filter out native open to prevent InvalidStateError when accidentally passed
380
- const {
381
- open: _open,
382
- ...safeProps
383
- } = props;
384
385
  return /*#__PURE__*/_jsx("dialog", {
385
386
  ref: mergeRefs(ref, dialogRef),
386
- onClick: handleClick,
387
- onCancel: handleCancel,
388
- "aria-modal": "true",
389
- role: purpose === 'required' ? 'alertdialog' : undefined,
387
+ ...safeProps,
390
388
  ...mergeProps(themeProps('dialog', {
391
389
  variant
392
390
  }), stylex.props(styles.dialog, isOpen && styles.open, styles.backdrop, !isFullscreen && dynamicStyles.sizing(width, maxHeight), hasPosition && dynamicStyles.position(position?.top, position?.right, position?.bottom, position?.left), isFullscreen && styles.fullscreen, xstyle), className, style),
393
- ...safeProps,
391
+ onClick: handleClick,
392
+ onCancel: handleCancel,
393
+ "aria-modal": "true",
394
+ ...(purpose === 'required' ? {
395
+ role: 'alertdialog'
396
+ } : undefined),
394
397
  children: innerContent
395
398
  });
396
399
  }
@@ -67,7 +67,7 @@ export interface DialogHeaderProps extends BaseProps<HTMLDivElement> {
67
67
  * </Dialog>
68
68
  * ```
69
69
  */
70
- export declare function DialogHeader({ title, subtitle, onOpenChange, startContent, endContent, hasDivider, xstyle, className, style, ref, }: DialogHeaderProps): import("react").JSX.Element;
70
+ export declare function DialogHeader({ title, subtitle, onOpenChange, startContent, endContent, hasDivider, xstyle, className, style, ref, ...rest }: DialogHeaderProps): import("react").JSX.Element;
71
71
  export declare namespace DialogHeader {
72
72
  var displayName: string;
73
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DialogHeader.d.ts","sourceRoot":"","sources":["../../src/Dialog/DialogHeader.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAoB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAQxD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoC5C,MAAM,WAAW,iBAAkB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAClE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE5C;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,GACJ,EAAE,iBAAiB,+BAgEnB;yBA3Ee,YAAY"}
1
+ {"version":3,"file":"DialogHeader.d.ts","sourceRoot":"","sources":["../../src/Dialog/DialogHeader.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAoB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAQxD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAoC5C,MAAM,WAAW,iBAAkB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAClE,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAE5C;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,iBAAiB,+BAiEnB;yBA7Ee,YAAY"}
@@ -64,7 +64,8 @@ export function DialogHeader({
64
64
  xstyle,
65
65
  className,
66
66
  style,
67
- ref
67
+ ref,
68
+ ...rest
68
69
  }) {
69
70
  const t = useTranslator();
70
71
  const titleRef = useRef(null);
@@ -85,6 +86,7 @@ export function DialogHeader({
85
86
  xstyle: xstyle,
86
87
  className: className,
87
88
  style: style,
89
+ ...rest,
88
90
  children: /*#__PURE__*/_jsxs("div", {
89
91
  ...{
90
92
  className: "x78zum5 x1cy8zhl x1qughib xjcht0a"
@@ -1 +1 @@
1
- {"version":3,"file":"FileInput.d.ts","sourceRoot":"","sources":["../../src/FileInput/FileInput.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,UAAU,CAAC;AAMlB,YAAY,EACV,WAAW,IAAI,eAAe,EAC9B,eAAe,IAAI,mBAAmB,GACvC,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AA0N9C,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,EACT,UAAU,GAAG,cAAc,GAAG,OAAO,CACtC;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAC5B;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAqB,EACrB,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,UAAkB,EAClB,OAAO,EACP,QAAQ,EACR,UAAkB,EAClB,eAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,MAAM,EAAE,UAAU,EAClB,WAAW,EACX,WAAW,EACX,IAAc,EACd,UAAkB,EAClB,YAAY,EACZ,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BA6WhB;yBAvYe,SAAS"}
1
+ {"version":3,"file":"FileInput.d.ts","sourceRoot":"","sources":["../../src/FileInput/FileInput.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,UAAU,CAAC;AAMlB,YAAY,EACV,WAAW,IAAI,eAAe,EAC9B,eAAe,IAAI,mBAAmB,GACvC,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AA0N9C,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,EACT,UAAU,GAAG,cAAc,GAAG,OAAO,CACtC;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAC5B;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAqB,EACrB,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,UAAkB,EAClB,OAAO,EACP,QAAQ,EACR,UAAkB,EAClB,eAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,MAAM,EAAE,UAAU,EAClB,WAAW,EACX,WAAW,EACX,IAAc,EACd,UAAkB,EAClB,YAAY,EACZ,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAsXhB;yBAhZe,SAAS"}
@@ -313,6 +313,12 @@ export function FileInput({
313
313
  const handleDragLeave = useCallback(e => {
314
314
  e.preventDefault();
315
315
  e.stopPropagation();
316
+ // Moving over the dropzone's own children (icon, text) fires dragleave on
317
+ // the container too — only a leave that actually exits the dropzone ends
318
+ // the drag-over state, otherwise the highlight flickers mid-drag.
319
+ if (e.relatedTarget instanceof Node && e.currentTarget.contains(e.relatedTarget)) {
320
+ return;
321
+ }
316
322
  setIsDragOver(false);
317
323
  }, []);
318
324
  const handleDrop = useCallback(e => {
@@ -1 +1 @@
1
- {"version":3,"file":"BaseTable.d.ts","sourceRoot":"","sources":["../../src/Table/BaseTable.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAe,KAAK,YAAY,EAAkB,KAAK,GAAG,EAAC,MAAM,OAAO,CAAC;AAGhF,OAAO,KAAK,EACV,cAAc,EAYf,MAAM,SAAS,CAAC;AAijBjB;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,EAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3E,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG;IAAC,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;CAAC,KACrD,YAAY,CAAC"}
1
+ {"version":3,"file":"BaseTable.d.ts","sourceRoot":"","sources":["../../src/Table/BaseTable.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAe,KAAK,YAAY,EAAkB,KAAK,GAAG,EAAC,MAAM,OAAO,CAAC;AAGhF,OAAO,KAAK,EACV,cAAc,EAYf,MAAM,SAAS,CAAC;AA2jBjB;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,EAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3E,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG;IAAC,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;CAAC,KACrD,YAAY,CAAC"}
@@ -116,7 +116,7 @@ function TableRowInner({
116
116
  }
117
117
  const initialBodyCellRenderProps = {
118
118
  htmlProps: initialCellHtmlProps,
119
- styles: [],
119
+ xstyle: [],
120
120
  columnIndex,
121
121
  columns: columns
122
122
  };
@@ -141,7 +141,7 @@ function TableRowInner({
141
141
  return /*#__PURE__*/_jsx(CellComponent, {
142
142
  ...cellRenderProps.htmlProps,
143
143
  contextMenuActions: cellRenderProps.contextMenuActions,
144
- xstyle: cellRenderProps.styles,
144
+ xstyle: cellRenderProps.xstyle,
145
145
  children: content
146
146
  }, col.key);
147
147
  });
@@ -149,7 +149,7 @@ function TableRowInner({
149
149
  // Apply plugin transforms for row (with pre-rendered children)
150
150
  const rowRenderProps = applyPlugins(plugins, p => p.transformBodyRow, {
151
151
  htmlProps: {},
152
- styles: [],
152
+ xstyle: [],
153
153
  children: /*#__PURE__*/_jsx(_Fragment, {
154
154
  children: cells
155
155
  })
@@ -157,7 +157,7 @@ function TableRowInner({
157
157
  const row = /*#__PURE__*/_jsx(RowComponent, {
158
158
  ref: rowRenderProps.ref,
159
159
  ...rowRenderProps.htmlProps,
160
- xstyle: rowRenderProps.styles,
160
+ xstyle: rowRenderProps.xstyle,
161
161
  children: rowRenderProps.children
162
162
  }, rowKey);
163
163
  return row;
@@ -239,7 +239,11 @@ function BaseTableInner({
239
239
  textOverflow = 'wrap',
240
240
  scrollWrapper: ScrollWrapper,
241
241
  emptyState,
242
- ref
242
+ xstyle,
243
+ className,
244
+ style,
245
+ ref,
246
+ ...rest
243
247
  }) {
244
248
  const t = useTranslator();
245
249
  // Use stable empty array when no plugins provided
@@ -275,7 +279,7 @@ function BaseTableInner({
275
279
  htmlProps: {
276
280
  ...userTableProps
277
281
  },
278
- styles: children ? [styles.table, styles.tableAutoLayout] : [styles.table]
282
+ xstyle: children ? [styles.table, styles.tableAutoLayout] : [styles.table]
279
283
  });
280
284
 
281
285
  // --- Plugin pipeline: header cells ---
@@ -297,7 +301,7 @@ function BaseTableInner({
297
301
  }
298
302
  const initialHeaderRenderProps = {
299
303
  htmlProps: initialHeaderHtmlProps,
300
- styles: [],
304
+ xstyle: [],
301
305
  content: headerContent,
302
306
  columnIndex,
303
307
  columns: resolvedColumns
@@ -341,7 +345,7 @@ function BaseTableInner({
341
345
  ...mergedHtmlProps,
342
346
  ...headerTitleProp,
343
347
  contextMenuActions: cellRenderProps.contextMenuActions,
344
- xstyle: cellRenderProps.styles,
348
+ xstyle: cellRenderProps.xstyle,
345
349
  children: headerInner
346
350
  }, col.key);
347
351
  });
@@ -349,7 +353,7 @@ function BaseTableInner({
349
353
  // --- Plugin pipeline: header row ---
350
354
  const headerRowRenderProps = applyPlugins(plugins, p => p.transformHeaderRow, {
351
355
  htmlProps: {},
352
- styles: [],
356
+ xstyle: [],
353
357
  children: /*#__PURE__*/_jsx(_Fragment, {
354
358
  children: headerCells
355
359
  })
@@ -358,21 +362,28 @@ function BaseTableInner({
358
362
  // --- Render ---
359
363
  const hasData = data != null && data.length > 0;
360
364
  const hasColumns = resolvedColumns.length > 0;
365
+
366
+ // Style precedence: deprecated tableProps.style < consumer style < the
367
+ // computed column min-width (structural — derived from column defs, so it
368
+ // must win when present; when absent, a consumer minWidth survives).
361
369
  const tableStyle = {
362
370
  ...tableRenderProps.htmlProps.style,
363
- minWidth: resolvedWidths.tableMinWidth > 0 ? `${resolvedWidths.tableMinWidth}px` : undefined
371
+ ...style,
372
+ ...(resolvedWidths.tableMinWidth > 0 ? {
373
+ minWidth: `${resolvedWidths.tableMinWidth}px`
374
+ } : null)
364
375
  };
365
376
  let tableElement = /*#__PURE__*/_jsx("table", {
366
377
  ref: ref,
367
378
  ...tableRenderProps.htmlProps,
368
- ...mergeProps(themeProps('base-table'), stylex.props(...tableRenderProps.styles), tableRenderProps.htmlProps.className),
369
- style: tableStyle,
379
+ ...mergeProps(themeProps('base-table'), stylex.props(...tableRenderProps.xstyle, xstyle), [tableRenderProps.htmlProps.className, className].filter(Boolean).join(' ') || undefined, tableStyle),
380
+ ...rest,
370
381
  children: children ? children : /*#__PURE__*/_jsxs(_Fragment, {
371
382
  children: [hasColumns && /*#__PURE__*/_jsx(TableHeader, {
372
383
  children: /*#__PURE__*/_jsx(RowComponent, {
373
384
  ...headerRowRenderProps.htmlProps,
374
385
  isHeaderRow: true,
375
- xstyle: headerRowRenderProps.styles,
386
+ xstyle: headerRowRenderProps.xstyle,
376
387
  children: headerRowRenderProps.children
377
388
  })
378
389
  }), /*#__PURE__*/_jsx(TableBody, {
@@ -412,11 +423,11 @@ function BaseTableInner({
412
423
  if (ScrollWrapper) {
413
424
  const scrollWrapperRenderProps = applyPlugins(plugins, p => p.transformScrollWrapper, {
414
425
  htmlProps: {},
415
- styles: []
426
+ xstyle: []
416
427
  });
417
428
  tableElement = /*#__PURE__*/_jsx(ScrollWrapper, {
418
429
  htmlProps: scrollWrapperRenderProps.htmlProps,
419
- styles: scrollWrapperRenderProps.styles,
430
+ xstyle: scrollWrapperRenderProps.xstyle,
420
431
  beforeTable: scrollWrapperRenderProps.beforeTable,
421
432
  afterTable: scrollWrapperRenderProps.afterTable,
422
433
  children: tableElement
@@ -72,7 +72,7 @@ const scrollWrapperStyles = {
72
72
  function TableScrollWrapper({
73
73
  children,
74
74
  htmlProps,
75
- styles: pluginStyles,
75
+ xstyle: pluginStyles,
76
76
  beforeTable,
77
77
  afterTable
78
78
  }) {
@@ -113,7 +113,7 @@ function buildTableStylePlugin() {
113
113
  ...props.htmlProps,
114
114
  className: existingClass ? `${existingClass} ${tableClass}` : tableClass
115
115
  },
116
- styles: [...props.styles, tableStyles.base]
116
+ xstyle: [...props.xstyle, tableStyles.base]
117
117
  };
118
118
  }
119
119
  };
@@ -595,7 +595,7 @@ export function useTableColumnResize(config) {
595
595
  overlay: /*#__PURE__*/_jsxs(_Fragment, {
596
596
  children: [props.overlay, handle]
597
597
  }),
598
- styles: [...props.styles, headerCellRelative.base]
598
+ xstyle: [...props.xstyle, headerCellRelative.base]
599
599
  };
600
600
  }
601
601
  }), [columnWidths, globalMinWidth, maxWidth, resizableColumns, measureRef]);
@@ -199,7 +199,7 @@ export function useTableGroupedRows(config) {
199
199
  onClick: toggle,
200
200
  'aria-expanded': !collapsed
201
201
  },
202
- styles: [...props.styles, styles.headerRow],
202
+ xstyle: [...props.xstyle, styles.headerRow],
203
203
  children:
204
204
  /*#__PURE__*/
205
205
  // colSpan larger than the column count is clamped by the browser
@@ -1 +1 @@
1
- {"version":3,"file":"useTableRowExpansion.d.ts","sourceRoot":"","sources":["../../../../src/Table/plugins/rowExpansion/useTableRowExpansion.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,aAAa,CAAC;AAMrB;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3E,0CAA0C;IAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,kDAAkD;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B,sEAAsE;IACtE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B,uFAAuF;IACvF,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;IAC1C,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,+BAA+B,CAC9C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjC,mCAAmC;IACnC,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,qEAAqE;IACrE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9B,kDAAkD;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C,qDAAqD;IACrD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,+CAA+C;IAC/C,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,+BAA+B,CAC9C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjC,qEAAqE;IACrE,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,4DAA4D;IAC5D,eAAe,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC3E,QAAQ,EACR,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,eAAe,GAChB,EAAE,+BAA+B,CAAC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAyHzE;AAuGD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC,GACpC,WAAW,CAAC,CAAC,CAAC,CA2OhB"}
1
+ {"version":3,"file":"useTableRowExpansion.d.ts","sourceRoot":"","sources":["../../../../src/Table/plugins/rowExpansion/useTableRowExpansion.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,aAAa,CAAC;AAMrB;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3E,0CAA0C;IAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,kDAAkD;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B,sEAAsE;IACtE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B,uFAAuF;IACvF,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;IAC1C,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,+BAA+B,CAC9C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjC,mCAAmC;IACnC,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,qEAAqE;IACrE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9B,kDAAkD;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C,qDAAqD;IACrD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,+CAA+C;IAC/C,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,+BAA+B,CAC9C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjC,qEAAqE;IACrE,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,4DAA4D;IAC5D,eAAe,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC3E,QAAQ,EACR,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,eAAe,GAChB,EAAE,+BAA+B,CAAC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAyHzE;AAuGD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC,GACpC,WAAW,CAAC,CAAC,CAAC,CAwOhB"}
@@ -393,7 +393,7 @@ export function useTableRowExpansion(config) {
393
393
  ...props.htmlProps,
394
394
  onClick: () => onToggle(key)
395
395
  },
396
- styles: [...props.styles, expansionStyles.clickableRow]
396
+ xstyle: [...props.xstyle, expansionStyles.clickableRow]
397
397
  };
398
398
  }
399
399
  }), [expandedKeys, getRowKey, onToggle, getChildren, getDepth, getIsItemExpandable, hasRowClickExpansion, isAllExpanded, onToggleExpandAll, expansionColumn, t]);