@fragments-sdk/ui 0.9.4 → 0.9.6

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 (126) hide show
  1. package/dist/assets/ui.css +443 -247
  2. package/dist/blocks/components/index.d.ts +0 -2
  3. package/dist/blocks/components/index.d.ts.map +1 -1
  4. package/dist/codeblock.cjs +187 -184
  5. package/dist/codeblock.cjs.map +1 -1
  6. package/dist/codeblock.js +183 -180
  7. package/dist/codeblock.js.map +1 -1
  8. package/dist/components/Box/Box.module.scss.cjs +73 -0
  9. package/dist/components/Box/Box.module.scss.cjs.map +1 -1
  10. package/dist/components/Box/Box.module.scss.js +73 -0
  11. package/dist/components/Box/Box.module.scss.js.map +1 -1
  12. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +6 -0
  13. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs.map +1 -1
  14. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +6 -0
  15. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js.map +1 -1
  16. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -23
  17. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs.map +1 -1
  18. package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -23
  19. package/dist/components/CodeBlock/CodeBlock.module.scss.js.map +1 -1
  20. package/dist/components/CodeBlock/index.d.ts +11 -7
  21. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  22. package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
  23. package/dist/components/Combobox/Combobox.module.scss.js +15 -15
  24. package/dist/components/DataTable/DataTable.module.scss.cjs +84 -0
  25. package/dist/components/DataTable/DataTable.module.scss.cjs.map +1 -0
  26. package/dist/components/DataTable/DataTable.module.scss.js +84 -0
  27. package/dist/components/DataTable/DataTable.module.scss.js.map +1 -0
  28. package/dist/components/DataTable/index.cjs +383 -0
  29. package/dist/components/DataTable/index.cjs.map +1 -0
  30. package/dist/components/DataTable/index.d.ts +78 -0
  31. package/dist/components/DataTable/index.d.ts.map +1 -0
  32. package/dist/components/DataTable/index.js +366 -0
  33. package/dist/components/DataTable/index.js.map +1 -0
  34. package/dist/components/Drawer/Drawer.module.scss.cjs +9 -0
  35. package/dist/components/Drawer/Drawer.module.scss.cjs.map +1 -1
  36. package/dist/components/Drawer/Drawer.module.scss.js +9 -0
  37. package/dist/components/Drawer/Drawer.module.scss.js.map +1 -1
  38. package/dist/components/Image/Image.module.scss.cjs +12 -0
  39. package/dist/components/Image/Image.module.scss.cjs.map +1 -1
  40. package/dist/components/Image/Image.module.scss.js +12 -0
  41. package/dist/components/Image/Image.module.scss.js.map +1 -1
  42. package/dist/components/Link/Link.module.scss.cjs +3 -0
  43. package/dist/components/Link/Link.module.scss.cjs.map +1 -1
  44. package/dist/components/Link/Link.module.scss.js +3 -0
  45. package/dist/components/Link/Link.module.scss.js.map +1 -1
  46. package/dist/components/List/List.module.scss.cjs +5 -0
  47. package/dist/components/List/List.module.scss.cjs.map +1 -1
  48. package/dist/components/List/List.module.scss.js +5 -0
  49. package/dist/components/List/List.module.scss.js.map +1 -1
  50. package/dist/components/Loading/Loading.module.scss.cjs +5 -0
  51. package/dist/components/Loading/Loading.module.scss.cjs.map +1 -1
  52. package/dist/components/Loading/Loading.module.scss.js +5 -0
  53. package/dist/components/Loading/Loading.module.scss.js.map +1 -1
  54. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  55. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  56. package/dist/components/Message/Message.module.scss.cjs +22 -16
  57. package/dist/components/Message/Message.module.scss.cjs.map +1 -1
  58. package/dist/components/Message/Message.module.scss.js +22 -16
  59. package/dist/components/Message/Message.module.scss.js.map +1 -1
  60. package/dist/components/Message/index.cjs +5 -3
  61. package/dist/components/Message/index.cjs.map +1 -1
  62. package/dist/components/Message/index.d.ts +5 -1
  63. package/dist/components/Message/index.d.ts.map +1 -1
  64. package/dist/components/Message/index.js +5 -3
  65. package/dist/components/Message/index.js.map +1 -1
  66. package/dist/components/Skeleton/Skeleton.module.scss.cjs +14 -0
  67. package/dist/components/Skeleton/Skeleton.module.scss.cjs.map +1 -1
  68. package/dist/components/Skeleton/Skeleton.module.scss.js +14 -0
  69. package/dist/components/Skeleton/Skeleton.module.scss.js.map +1 -1
  70. package/dist/components/Stack/Stack.module.scss.cjs +14 -0
  71. package/dist/components/Stack/Stack.module.scss.cjs.map +1 -1
  72. package/dist/components/Stack/Stack.module.scss.js +14 -0
  73. package/dist/components/Stack/Stack.module.scss.js.map +1 -1
  74. package/dist/components/Table/Table.module.scss.cjs +21 -36
  75. package/dist/components/Table/Table.module.scss.cjs.map +1 -1
  76. package/dist/components/Table/Table.module.scss.js +21 -36
  77. package/dist/components/Table/Table.module.scss.js.map +1 -1
  78. package/dist/components/Table/index.d.ts +35 -55
  79. package/dist/components/Table/index.d.ts.map +1 -1
  80. package/dist/components/Text/Text.module.scss.cjs +14 -0
  81. package/dist/components/Text/Text.module.scss.cjs.map +1 -1
  82. package/dist/components/Text/Text.module.scss.js +14 -0
  83. package/dist/components/Text/Text.module.scss.js.map +1 -1
  84. package/dist/components/Textarea/Textarea.module.scss.cjs +4 -0
  85. package/dist/components/Textarea/Textarea.module.scss.cjs.map +1 -1
  86. package/dist/components/Textarea/Textarea.module.scss.js +4 -0
  87. package/dist/components/Textarea/Textarea.module.scss.js.map +1 -1
  88. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +5 -0
  89. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs.map +1 -1
  90. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +5 -0
  91. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js.map +1 -1
  92. package/dist/index.cjs +119 -117
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.ts +2 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +3 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/table.cjs +44 -262
  99. package/dist/table.cjs.map +1 -1
  100. package/dist/table.js +47 -248
  101. package/dist/table.js.map +1 -1
  102. package/fragments.json +1 -1
  103. package/package.json +110 -118
  104. package/src/blocks/components/index.ts +0 -3
  105. package/src/components/CodeBlock/CodeBlock.module.scss +16 -34
  106. package/src/components/CodeBlock/index.tsx +351 -345
  107. package/src/components/Combobox/Combobox.module.scss +13 -9
  108. package/src/components/ConversationList/ConversationList.fragment.tsx +96 -129
  109. package/src/components/DataTable/DataTable.fragment.tsx +754 -0
  110. package/src/components/DataTable/DataTable.module.scss +300 -0
  111. package/src/components/DataTable/DataTable.test.tsx +224 -0
  112. package/src/components/DataTable/index.tsx +533 -0
  113. package/src/components/Message/Message.fragment.tsx +34 -0
  114. package/src/components/Message/Message.module.scss +11 -0
  115. package/src/components/Message/index.tsx +12 -3
  116. package/src/components/Table/Table.fragment.tsx +190 -175
  117. package/src/components/Table/Table.module.scss +15 -88
  118. package/src/components/Table/Table.test.tsx +184 -94
  119. package/src/components/Table/index.tsx +105 -374
  120. package/src/index.ts +15 -4
  121. package/src/tokens/_computed.scss +7 -6
  122. package/src/tokens/_density.scss +87 -47
  123. package/src/tokens/_variables.scss +46 -31
  124. package/dist/blocks/components/DataTable.d.ts +0 -19
  125. package/dist/blocks/components/DataTable.d.ts.map +0 -1
  126. package/src/blocks/components/DataTable.tsx +0 -124
@@ -1,5 +1,5 @@
1
- @use '../../tokens/variables' as *;
2
- @use '../../tokens/mixins' as *;
1
+ @use "../../tokens/variables" as *;
2
+ @use "../../tokens/mixins" as *;
3
3
 
4
4
  // Multi-select container — stacks input and chips vertically
5
5
  .multiContainer {
@@ -129,6 +129,7 @@
129
129
  cursor: pointer;
130
130
  border-radius: 0 var(--fui-radius-md, $fui-radius-md) var(--fui-radius-md, $fui-radius-md) 0;
131
131
  transition: color var(--fui-transition-fast, $fui-transition-fast);
132
+ margin-inline-end: 0.5rem;
132
133
 
133
134
  &:hover {
134
135
  color: var(--fui-text-primary, $fui-text-primary);
@@ -162,16 +163,16 @@
162
163
 
163
164
  // Item height derived from text-base font + vertical padding
164
165
  --_item-h: calc(
165
- var(--fui-font-size-sm, #{$fui-font-size-sm}) * var(--fui-line-height-normal, #{$fui-line-height-normal}) +
166
- var(--fui-space-2, #{$fui-space-2}) * 2
166
+ var(--fui-font-size-sm, #{$fui-font-size-sm}) *
167
+ var(--fui-line-height-normal, #{$fui-line-height-normal}) +
168
+ var(--fui-space-2, #{$fui-space-2}) * 2
167
169
  );
168
170
 
169
171
  min-width: var(--anchor-width);
170
172
  // Show N items + half-peek scroll hint (default 4.5 items)
171
173
  // !important needed to override Base UI's inline max-height: 100%
172
174
  max-height: calc(
173
- var(--_item-h) * var(--fui-select-max-items, 4.5) +
174
- var(--fui-space-1, #{$fui-space-1}) * 2
175
+ var(--_item-h) * var(--fui-select-max-items, 4.5) + var(--fui-space-1, #{$fui-space-1}) * 2
175
176
  ) !important;
176
177
  overflow-y: auto !important;
177
178
  padding: var(--fui-padding-item-xs, $fui-padding-item-xs);
@@ -206,7 +207,8 @@
206
207
  align-items: center;
207
208
  gap: var(--fui-space-2, $fui-space-2);
208
209
  width: 100%;
209
- padding: var(--fui-padding-item-xs, $fui-padding-item-xs) var(--fui-padding-item-md, $fui-padding-item-md);
210
+ padding: var(--fui-padding-item-xs, $fui-padding-item-xs)
211
+ var(--fui-padding-item-md, $fui-padding-item-md);
210
212
  border-radius: var(--fui-radius-sm, $fui-radius-sm);
211
213
  cursor: pointer;
212
214
  outline: none;
@@ -252,7 +254,8 @@
252
254
  display: flex;
253
255
  align-items: center;
254
256
  justify-content: center;
255
- padding: var(--fui-padding-item-lg, $fui-padding-item-lg) var(--fui-padding-item-md, $fui-padding-item-md);
257
+ padding: var(--fui-padding-item-lg, $fui-padding-item-lg)
258
+ var(--fui-padding-item-md, $fui-padding-item-md);
256
259
  color: var(--fui-text-tertiary, $fui-text-tertiary);
257
260
  font-size: var(--fui-font-size-sm, $fui-font-size-sm);
258
261
  }
@@ -268,7 +271,8 @@
268
271
 
269
272
  // Group label
270
273
  .groupLabel {
271
- padding: var(--fui-padding-item-xs, $fui-padding-item-xs) var(--fui-padding-item-md, $fui-padding-item-md);
274
+ padding: var(--fui-padding-item-xs, $fui-padding-item-xs)
275
+ var(--fui-padding-item-md, $fui-padding-item-md);
272
276
  font-size: var(--fui-font-size-xs, $fui-font-size-xs);
273
277
  font-weight: var(--fui-font-weight-medium, $fui-font-weight-medium);
274
278
  color: var(--fui-text-tertiary, $fui-text-tertiary);
@@ -1,201 +1,168 @@
1
- import React from 'react';
2
- import { defineFragment } from '@fragments-sdk/cli/core';
3
- import { ConversationList } from '.';
4
- import { Message } from '../Message';
1
+ import React from "react";
2
+ import { defineFragment } from "@fragments-sdk/cli/core";
3
+ import { ConversationList } from ".";
4
+ import { Message } from "../Message";
5
5
 
6
6
  export default defineFragment({
7
7
  component: ConversationList,
8
8
 
9
9
  meta: {
10
- name: 'ConversationList',
11
- description: 'Scrollable message container with auto-scroll and history loading',
12
- category: 'ai',
13
- status: 'stable',
14
- tags: ['conversation', 'chat', 'messages', 'scroll', 'ai', 'list'],
10
+ name: "ConversationList",
11
+ description: "Scrollable message container with auto-scroll and history loading",
12
+ category: "ai",
13
+ status: "stable",
14
+ tags: ["conversation", "chat", "messages", "scroll", "ai", "list"],
15
15
  },
16
16
 
17
17
  usage: {
18
18
  when: [
19
- 'Building a chat interface with multiple messages',
20
- 'Need auto-scroll behavior when new messages arrive',
21
- 'Require infinite scroll for loading message history',
22
- 'Want date separators between message groups',
19
+ "Building a chat interface with multiple messages",
20
+ "Need auto-scroll behavior when new messages arrive",
21
+ "Require infinite scroll for loading message history",
22
+ "Want date separators between message groups",
23
23
  ],
24
24
  whenNot: [
25
- 'Simple list of items without chat context (use List)',
26
- 'Single message display (use Message directly)',
27
- 'Non-scrolling message layout',
25
+ "Simple list of items without chat context (use List)",
26
+ "Single message display (use Message directly)",
27
+ "Non-scrolling message layout",
28
28
  ],
29
29
  guidelines: [
30
30
  'Use autoScroll="smart" for best UX (only auto-scrolls when near bottom)',
31
- 'Implement onScrollTop for loading older messages',
32
- 'Provide an emptyState for new conversations',
33
- 'Use DateSeparator between messages from different days',
31
+ "Implement onScrollTop for loading older messages",
32
+ "Provide an emptyState for new conversations",
33
+ "Use DateSeparator between messages from different days",
34
34
  ],
35
35
  accessibility: [
36
- 'Uses proper ARIA roles for separators',
37
- 'Typing indicator has aria-label',
38
- 'Smooth scroll respects reduced motion preferences',
39
- 'Keyboard navigation works within scrollable container',
36
+ "Uses proper ARIA roles for separators",
37
+ "Typing indicator has aria-label",
38
+ "Smooth scroll respects reduced motion preferences",
39
+ "Keyboard navigation works within scrollable container",
40
40
  ],
41
41
  },
42
42
 
43
43
  props: {
44
44
  children: {
45
- type: 'node',
46
- description: 'Message components',
45
+ type: "node",
46
+ description: "Message components",
47
47
  required: true,
48
48
  },
49
49
  autoScroll: {
50
- type: 'union',
50
+ type: "union",
51
51
  default: '"smart"',
52
- description: 'Auto-scroll behavior: true (always), false (never), or "smart" (only when near bottom)',
52
+ description:
53
+ 'Auto-scroll behavior: true (always), false (never), or "smart" (only when near bottom)',
53
54
  },
54
55
  onScrollTop: {
55
- type: 'function',
56
- description: 'Callback when user scrolls to top (for loading history)',
56
+ type: "function",
57
+ description: "Callback when user scrolls to top (for loading history)",
57
58
  },
58
59
  loadingHistory: {
59
- type: 'boolean',
60
- default: 'false',
61
- description: 'Show loading spinner at top when loading history',
60
+ type: "boolean",
61
+ default: "false",
62
+ description: "Show loading spinner at top when loading history",
62
63
  },
63
64
  emptyState: {
64
- type: 'node',
65
- description: 'Content to show when conversation is empty',
65
+ type: "node",
66
+ description: "Content to show when conversation is empty",
66
67
  },
67
68
  scrollTopThreshold: {
68
- type: 'number',
69
- default: '50',
70
- description: 'Pixels from top to trigger onScrollTop',
69
+ type: "number",
70
+ default: "50",
71
+ description: "Pixels from top to trigger onScrollTop",
71
72
  },
72
73
  scrollBottomThreshold: {
73
- type: 'number',
74
- default: '100',
75
- description: 'Pixels from bottom for smart auto-scroll',
74
+ type: "number",
75
+ default: "100",
76
+ description: "Pixels from bottom for smart auto-scroll",
76
77
  },
77
78
  },
78
79
 
79
80
  relations: [
80
81
  {
81
- component: 'Message',
82
- relationship: 'child',
83
- note: 'ConversationList contains Message components',
82
+ component: "Message",
83
+ relationship: "child",
84
+ note: "ConversationList contains Message components",
84
85
  },
85
86
  {
86
- component: 'ThinkingIndicator',
87
- relationship: 'child',
88
- note: 'Show ThinkingIndicator at bottom while awaiting response',
87
+ component: "ThinkingIndicator",
88
+ relationship: "child",
89
+ note: "Show ThinkingIndicator at bottom while awaiting response",
89
90
  },
90
91
  {
91
- component: 'Prompt',
92
- relationship: 'sibling',
93
- note: 'Typically paired with Prompt for input',
92
+ component: "Prompt",
93
+ relationship: "sibling",
94
+ note: "Typically paired with Prompt for input",
94
95
  },
95
96
  ],
96
97
 
97
98
  contract: {
98
99
  propsSummary: [
99
- 'children: ReactNode - Message components',
100
+ "children: ReactNode - Message components",
100
101
  'autoScroll: boolean | "smart" - scroll behavior (default: "smart")',
101
- 'onScrollTop: () => void - callback for loading history',
102
- 'loadingHistory: boolean - show history loading spinner',
103
- 'emptyState: ReactNode - empty conversation content',
104
- ],
105
- scenarioTags: [
106
- 'ui.chat',
107
- 'ui.conversation',
108
- 'ai.assistant',
109
- 'layout.scroll',
110
- ],
111
- a11yRules: [
112
- 'A11Y_ARIA_ROLES',
113
- 'A11Y_MOTION_PREFERENCE',
102
+ "onScrollTop: () => void - callback for loading history",
103
+ "loadingHistory: boolean - show history loading spinner",
104
+ "emptyState: ReactNode - empty conversation content",
114
105
  ],
106
+ scenarioTags: ["ui.chat", "ui.conversation", "ai.assistant", "layout.scroll"],
107
+ a11yRules: ["A11Y_ARIA_ROLES", "A11Y_MOTION_PREFERENCE"],
115
108
  bans: [],
116
109
  },
117
110
 
118
111
  variants: [
119
112
  {
120
- name: 'Basic',
121
- description: 'Simple conversation with messages',
122
- render: () => (
123
- <div style={{ height: '300px', border: '1px solid #e4e4e7', borderRadius: '8px' }}>
124
- <ConversationList>
125
- <Message role="user">
126
- <Message.Content>Hello!</Message.Content>
127
- </Message>
128
- <Message role="assistant">
129
- <Message.Content>Hi there! How can I help you today?</Message.Content>
130
- </Message>
131
- <Message role="user">
132
- <Message.Content>Can you explain React hooks?</Message.Content>
133
- </Message>
134
- </ConversationList>
135
- </div>
136
- ),
137
- },
138
- {
139
- name: 'With Date Separators',
140
- description: 'Messages grouped by date',
113
+ name: "Basic",
114
+ description: "Simple conversation with messages",
141
115
  render: () => (
142
- <div style={{ height: '300px', border: '1px solid #e4e4e7', borderRadius: '8px' }}>
143
- <ConversationList>
144
- <ConversationList.DateSeparator date={new Date(Date.now() - 86400000)} />
145
- <Message role="user">
146
- <Message.Content>A message from yesterday</Message.Content>
147
- </Message>
148
- <ConversationList.DateSeparator date={new Date()} />
149
- <Message role="assistant">
150
- <Message.Content>And a message from today!</Message.Content>
151
- </Message>
152
- </ConversationList>
153
- </div>
116
+ <ConversationList>
117
+ <Message role="user">
118
+ <Message.Content>Hello!</Message.Content>
119
+ </Message>
120
+ <Message role="assistant">
121
+ <Message.Content>Hi there! How can I help you today?</Message.Content>
122
+ </Message>
123
+ <Message role="user">
124
+ <Message.Content>Can you explain React hooks?</Message.Content>
125
+ </Message>
126
+ </ConversationList>
154
127
  ),
155
128
  },
156
129
  {
157
- name: 'With Typing Indicator',
158
- description: 'Shows assistant is typing',
130
+ name: "With Date Separators",
131
+ description: "Messages grouped by date",
159
132
  render: () => (
160
- <div style={{ height: '300px', border: '1px solid #e4e4e7', borderRadius: '8px' }}>
161
- <ConversationList>
162
- <Message role="user">
163
- <Message.Content>What is TypeScript?</Message.Content>
164
- </Message>
165
- <ConversationList.TypingIndicator name="Assistant" />
166
- </ConversationList>
167
- </div>
133
+ <ConversationList>
134
+ <ConversationList.DateSeparator date={new Date(Date.now() - 86400000)} />
135
+ <Message role="user">
136
+ <Message.Content>A message from yesterday</Message.Content>
137
+ </Message>
138
+ <ConversationList.DateSeparator date={new Date()} />
139
+ <Message role="assistant">
140
+ <Message.Content>And a message from today!</Message.Content>
141
+ </Message>
142
+ </ConversationList>
168
143
  ),
169
144
  },
170
145
  {
171
- name: 'Loading History',
172
- description: 'Loading older messages',
146
+ name: "With Typing Indicator",
147
+ description: "Shows assistant is typing",
173
148
  render: () => (
174
- <div style={{ height: '300px', border: '1px solid #e4e4e7', borderRadius: '8px' }}>
175
- <ConversationList loadingHistory>
176
- <Message role="user">
177
- <Message.Content>This is the latest message</Message.Content>
178
- </Message>
179
- </ConversationList>
180
- </div>
149
+ <ConversationList>
150
+ <Message role="user">
151
+ <Message.Content>What is TypeScript?</Message.Content>
152
+ </Message>
153
+ <ConversationList.TypingIndicator name="Assistant" />
154
+ </ConversationList>
181
155
  ),
182
156
  },
183
157
  {
184
- name: 'Empty State',
185
- description: 'No messages yet',
158
+ name: "Loading History",
159
+ description: "Loading older messages",
186
160
  render: () => (
187
- <div style={{ height: '300px', border: '1px solid #e4e4e7', borderRadius: '8px' }}>
188
- <ConversationList
189
- emptyState={
190
- <div style={{ textAlign: 'center', color: '#71717a', padding: '2rem' }}>
191
- <p>No messages yet</p>
192
- <p style={{ fontSize: '12px' }}>Start a conversation!</p>
193
- </div>
194
- }
195
- >
196
- {/* No messages */}
197
- </ConversationList>
198
- </div>
161
+ <ConversationList loadingHistory>
162
+ <Message role="user">
163
+ <Message.Content>This is the latest message</Message.Content>
164
+ </Message>
165
+ </ConversationList>
199
166
  ),
200
167
  },
201
168
  ],