@fragments-sdk/ui 0.17.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/ui.css +2700 -3256
- package/dist/chart.cjs +0 -1
- package/dist/chart.js +0 -1
- package/dist/codeblock.cjs +0 -1
- package/dist/codeblock.js +0 -1
- package/dist/colorpicker.cjs +0 -1
- package/dist/colorpicker.js +0 -1
- package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
- package/dist/components/Accordion/Accordion.module.scss.js +8 -8
- package/dist/components/Alert/Alert.module.scss.cjs +12 -12
- package/dist/components/Alert/Alert.module.scss.js +12 -12
- package/dist/components/AppShell/AppShell.module.scss.cjs +12 -12
- package/dist/components/AppShell/AppShell.module.scss.js +12 -12
- package/dist/components/Avatar/Avatar.module.scss.cjs +13 -13
- package/dist/components/Avatar/Avatar.module.scss.js +13 -13
- package/dist/components/Badge/Badge.module.scss.cjs +13 -13
- package/dist/components/Badge/Badge.module.scss.js +13 -13
- package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
- package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
- package/dist/components/Box/Box.module.scss.cjs +152 -152
- package/dist/components/Box/Box.module.scss.js +152 -152
- package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +8 -8
- package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +8 -8
- package/dist/components/Button/Button.module.scss.cjs +12 -12
- package/dist/components/Button/Button.module.scss.js +12 -12
- package/dist/components/Card/Card.module.scss.cjs +14 -14
- package/dist/components/Card/Card.module.scss.js +14 -14
- package/dist/components/Chart/Chart.module.scss.cjs +15 -15
- package/dist/components/Chart/Chart.module.scss.js +15 -15
- package/dist/components/Chart/index.d.ts +0 -1
- package/dist/components/Chart/index.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
- package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
- package/dist/components/Chip/Chip.module.scss.cjs +15 -15
- package/dist/components/Chip/Chip.module.scss.js +15 -15
- package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +21 -21
- package/dist/components/CodeBlock/CodeBlock.module.scss.js +21 -21
- package/dist/components/CodeBlock/index.d.ts +0 -1
- package/dist/components/CodeBlock/index.d.ts.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
- package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
- package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
- package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
- package/dist/components/ColorPicker/index.d.ts +0 -1
- package/dist/components/ColorPicker/index.d.ts.map +1 -1
- package/dist/components/Combobox/Combobox.module.scss.cjs +23 -23
- package/dist/components/Combobox/Combobox.module.scss.js +23 -23
- package/dist/components/Combobox/index.cjs +13 -10
- package/dist/components/Combobox/index.d.ts.map +1 -1
- package/dist/components/Combobox/index.js +13 -10
- package/dist/components/Command/Command.module.scss.cjs +11 -11
- package/dist/components/Command/Command.module.scss.js +11 -11
- package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
- package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
- package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
- package/dist/components/DataTable/DataTable.module.scss.js +26 -26
- package/dist/components/DataTable/index.cjs +0 -1
- package/dist/components/DataTable/index.d.ts +0 -1
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +0 -1
- package/dist/components/DatePicker/DatePicker.module.scss.cjs +31 -31
- package/dist/components/DatePicker/DatePicker.module.scss.js +31 -31
- package/dist/components/DatePicker/index.d.ts +0 -1
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
- package/dist/components/Dialog/Dialog.module.scss.js +14 -14
- package/dist/components/Drawer/Drawer.module.scss.cjs +33 -27
- package/dist/components/Drawer/Drawer.module.scss.js +34 -28
- package/dist/components/Drawer/index.cjs +36 -14
- package/dist/components/Drawer/index.d.ts +21 -3
- package/dist/components/Drawer/index.d.ts.map +1 -1
- package/dist/components/Drawer/index.js +36 -14
- package/dist/components/Editor/Editor.module.scss.cjs +17 -17
- package/dist/components/Editor/Editor.module.scss.js +17 -17
- package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
- package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
- package/dist/components/Field/Field.module.scss.cjs +4 -4
- package/dist/components/Field/Field.module.scss.js +4 -4
- package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
- package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
- package/dist/components/Header/Header.module.scss.cjs +28 -28
- package/dist/components/Header/Header.module.scss.js +28 -28
- package/dist/components/Icon/Icon.module.scss.cjs +8 -8
- package/dist/components/Icon/Icon.module.scss.js +8 -8
- package/dist/components/Image/Image.module.scss.cjs +27 -27
- package/dist/components/Image/Image.module.scss.js +27 -27
- package/dist/components/Input/Input.module.scss.cjs +19 -19
- package/dist/components/Input/Input.module.scss.js +19 -19
- package/dist/components/Link/Link.module.scss.cjs +10 -10
- package/dist/components/Link/Link.module.scss.js +10 -10
- package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
- package/dist/components/Listbox/Listbox.module.scss.js +8 -8
- package/dist/components/Loading/Loading.module.scss.cjs +30 -30
- package/dist/components/Loading/Loading.module.scss.js +30 -30
- package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
- package/dist/components/Markdown/Markdown.module.scss.js +1 -1
- package/dist/components/Markdown/index.d.ts +0 -1
- package/dist/components/Markdown/index.d.ts.map +1 -1
- package/dist/components/Menu/Menu.module.scss.cjs +16 -13
- package/dist/components/Menu/Menu.module.scss.js +17 -14
- package/dist/components/Menu/index.cjs +1 -1
- package/dist/components/Menu/index.d.ts.map +1 -1
- package/dist/components/Menu/index.js +1 -1
- package/dist/components/Message/Message.module.scss.cjs +18 -18
- package/dist/components/Message/Message.module.scss.js +18 -18
- package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +28 -28
- package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
- package/dist/components/Pagination/Pagination.module.scss.cjs +7 -7
- package/dist/components/Pagination/Pagination.module.scss.js +7 -7
- package/dist/components/Popover/Popover.module.scss.cjs +10 -10
- package/dist/components/Popover/Popover.module.scss.js +10 -10
- package/dist/components/Progress/Progress.module.scss.cjs +25 -25
- package/dist/components/Progress/Progress.module.scss.js +25 -25
- package/dist/components/Prompt/Prompt.module.scss.cjs +26 -14
- package/dist/components/Prompt/Prompt.module.scss.js +26 -14
- package/dist/components/Prompt/index.cjs +16 -0
- package/dist/components/Prompt/index.d.ts +17 -1
- package/dist/components/Prompt/index.d.ts.map +1 -1
- package/dist/components/Prompt/index.js +16 -0
- package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +16 -16
- package/dist/components/RadioGroup/RadioGroup.module.scss.js +16 -16
- package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +10 -10
- package/dist/components/ScrollArea/ScrollArea.module.scss.js +10 -10
- package/dist/components/Select/Select.module.scss.cjs +17 -17
- package/dist/components/Select/Select.module.scss.js +17 -17
- package/dist/components/Select/index.cjs +20 -20
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +20 -20
- package/dist/components/Separator/Separator.module.scss.cjs +10 -10
- package/dist/components/Separator/Separator.module.scss.js +10 -10
- package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
- package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
- package/dist/components/Slider/Slider.module.scss.cjs +12 -12
- package/dist/components/Slider/Slider.module.scss.js +12 -12
- package/dist/components/Slider/index.cjs +23 -21
- package/dist/components/Slider/index.js +23 -21
- package/dist/components/Stack/Stack.module.scss.cjs +35 -35
- package/dist/components/Stack/Stack.module.scss.js +35 -35
- package/dist/components/Table/Table.module.scss.cjs +16 -16
- package/dist/components/Table/Table.module.scss.js +16 -16
- package/dist/components/Table/index.d.ts +0 -1
- package/dist/components/Table/index.d.ts.map +1 -1
- package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +7 -7
- package/dist/components/TableOfContents/TableOfContents.module.scss.js +7 -7
- package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
- package/dist/components/Tabs/Tabs.module.scss.js +9 -9
- package/dist/components/Text/Text.module.scss.cjs +38 -38
- package/dist/components/Text/Text.module.scss.js +38 -38
- package/dist/components/Textarea/Textarea.module.scss.cjs +23 -23
- package/dist/components/Textarea/Textarea.module.scss.js +23 -23
- package/dist/components/Theme/ThemeToggle.module.scss.cjs +6 -6
- package/dist/components/Theme/ThemeToggle.module.scss.js +6 -6
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
- package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
- package/dist/components/Toast/Toast.module.scss.cjs +20 -20
- package/dist/components/Toast/Toast.module.scss.js +20 -20
- package/dist/components/Toggle/Toggle.module.scss.cjs +13 -13
- package/dist/components/Toggle/Toggle.module.scss.js +13 -13
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
- package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
- package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
- package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
- package/dist/components/Tooltip/index.cjs +4 -3
- package/dist/components/Tooltip/index.d.ts +4 -1
- package/dist/components/Tooltip/index.d.ts.map +1 -1
- package/dist/components/Tooltip/index.js +4 -3
- package/dist/datepicker.cjs +0 -1
- package/dist/datepicker.js +0 -1
- package/dist/index.cjs +0 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/markdown.cjs +0 -1
- package/dist/markdown.js +0 -1
- package/dist/table.cjs +0 -1
- package/dist/table.js +0 -1
- package/dist/utils/seed-derivation.cjs +29 -0
- package/dist/utils/seed-derivation.d.ts +1 -1
- package/dist/utils/seed-derivation.d.ts.map +1 -1
- package/dist/utils/seed-derivation.js +29 -0
- package/fragments.json +1 -1
- package/package.json +18 -14
- package/src/components/Accordion/Accordion.contract.json +169 -0
- package/src/components/Alert/Alert.contract.json +157 -0
- package/src/components/AppShell/AppShell.contract.json +155 -0
- package/src/components/Avatar/Avatar.contract.json +189 -0
- package/src/components/Badge/Badge.contract.json +187 -0
- package/src/components/BentoGrid/BentoGrid.contract.json +135 -0
- package/src/components/Box/Box.contract.json +423 -0
- package/src/components/Breadcrumbs/Breadcrumbs.contract.json +143 -0
- package/src/components/Button/Button.contract.json +205 -0
- package/src/components/Button/Button.module.scss +24 -1
- package/src/components/ButtonGroup/ButtonGroup.contract.json +140 -0
- package/src/components/Card/Card.contract.json +185 -0
- package/src/components/Card/Card.module.scss +5 -1
- package/src/components/Chart/Chart.contract.json +129 -0
- package/src/components/Chart/index.tsx +0 -1
- package/src/components/Checkbox/Checkbox.contract.json +246 -0
- package/src/components/Chip/Chip.contract.json +212 -0
- package/src/components/Chip/Chip.module.scss +4 -4
- package/src/components/CodeBlock/CodeBlock.contract.json +388 -0
- package/src/components/CodeBlock/index.tsx +0 -1
- package/src/components/Collapsible/Collapsible.contract.json +154 -0
- package/src/components/ColorPicker/ColorPicker.contract.json +212 -0
- package/src/components/ColorPicker/index.tsx +0 -1
- package/src/components/Combobox/Combobox.contract.json +297 -0
- package/src/components/Combobox/index.tsx +7 -8
- package/src/components/Command/Command.contract.json +165 -0
- package/src/components/Command/Command.module.scss +22 -9
- package/src/components/ConversationList/ConversationList.contract.json +151 -0
- package/src/components/DataTable/DataTable.contract.json +302 -0
- package/src/components/DataTable/index.tsx +0 -2
- package/src/components/DatePicker/DatePicker.contract.json +288 -0
- package/src/components/DatePicker/index.tsx +0 -2
- package/src/components/Dialog/Dialog.contract.json +159 -0
- package/src/components/Drawer/Drawer.contract.json +161 -0
- package/src/components/Drawer/Drawer.module.scss +45 -5
- package/src/components/Drawer/index.tsx +66 -23
- package/src/components/Editor/Editor.contract.json +263 -0
- package/src/components/EmptyState/EmptyState.contract.json +133 -0
- package/src/components/Field/Field.contract.json +157 -0
- package/src/components/Fieldset/Fieldset.contract.json +117 -0
- package/src/components/Form/Form.contract.json +145 -0
- package/src/components/Grid/Grid.contract.json +195 -0
- package/src/components/Header/Header.contract.json +196 -0
- package/src/components/Icon/Icon.contract.json +194 -0
- package/src/components/Image/Image.contract.json +209 -0
- package/src/components/Input/Input.contract.json +344 -0
- package/src/components/Input/Input.module.scss +16 -6
- package/src/components/Link/Link.contract.json +180 -0
- package/src/components/List/List.contract.json +154 -0
- package/src/components/Listbox/Listbox.contract.json +158 -0
- package/src/components/Loading/Loading.contract.json +167 -0
- package/src/components/Markdown/Markdown.contract.json +127 -0
- package/src/components/Markdown/Markdown.module.scss +0 -3
- package/src/components/Markdown/index.tsx +0 -1
- package/src/components/Menu/Menu.contract.json +177 -0
- package/src/components/Menu/Menu.module.scss +6 -0
- package/src/components/Menu/index.tsx +3 -1
- package/src/components/Message/Message.contract.json +183 -0
- package/src/components/Message/Message.module.scss +2 -2
- package/src/components/NavigationMenu/NavigationMenu.contract.json +203 -0
- package/src/components/NavigationMenu/NavigationMenu.module.scss +18 -23
- package/src/components/Pagination/Pagination.contract.json +163 -0
- package/src/components/Pagination/Pagination.module.scss +1 -1
- package/src/components/Popover/Popover.contract.json +163 -0
- package/src/components/Progress/Progress.contract.json +176 -0
- package/src/components/Prompt/Prompt.contract.json +211 -0
- package/src/components/Prompt/Prompt.module.scss +117 -3
- package/src/components/Prompt/index.tsx +40 -0
- package/src/components/RadioGroup/RadioGroup.contract.json +226 -0
- package/src/components/ScrollArea/ScrollArea.contract.json +131 -0
- package/src/components/Select/Select.contract.json +269 -0
- package/src/components/Select/index.tsx +20 -25
- package/src/components/Separator/Separator.contract.json +143 -0
- package/src/components/Sidebar/Sidebar.contract.json +258 -0
- package/src/components/Sidebar/Sidebar.module.scss +1 -1
- package/src/components/Skeleton/Skeleton.contract.json +166 -0
- package/src/components/Slider/Slider.contract.json +248 -0
- package/src/components/Slider/index.tsx +10 -10
- package/src/components/Stack/Stack.contract.json +220 -0
- package/src/components/Table/Table.contract.json +171 -0
- package/src/components/Table/index.tsx +0 -2
- package/src/components/TableOfContents/TableOfContents.contract.json +145 -0
- package/src/components/TableOfContents/TableOfContents.module.scss +19 -15
- package/src/components/Tabs/Tabs.contract.json +159 -0
- package/src/components/Text/Text.contract.json +239 -0
- package/src/components/Textarea/Textarea.contract.json +308 -0
- package/src/components/Theme/Theme.contract.json +152 -0
- package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +165 -0
- package/src/components/Toast/Toast.contract.json +181 -0
- package/src/components/Toggle/Toggle.contract.json +231 -0
- package/src/components/Toggle/Toggle.module.scss +3 -3
- package/src/components/ToggleGroup/ToggleGroup.contract.json +206 -0
- package/src/components/Tooltip/Tooltip.contract.json +214 -0
- package/src/components/Tooltip/index.tsx +7 -3
- package/src/components/VisuallyHidden/VisuallyHidden.contract.json +116 -0
- package/src/index.ts +8 -3
- package/src/styles/globals.scss +6 -1
- package/src/tokens/_computed.scss +3 -1
- package/src/tokens/_density.scss +4 -4
- package/src/tokens/_derive.scss +52 -56
- package/src/tokens/_palettes.scss +20 -1
- package/src/tokens/_seeds.scss +2 -2
- package/src/tokens/_variables.scss +45 -29
- package/src/utils/seed-derivation.ts +23 -1
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
|
+
"name": "Progress",
|
|
4
|
+
"description": "Visual indicator of task completion or loading state. Available in linear and circular variants.",
|
|
5
|
+
"category": "feedback",
|
|
6
|
+
"tags": [
|
|
7
|
+
"progress",
|
|
8
|
+
"loading",
|
|
9
|
+
"indicator",
|
|
10
|
+
"percentage",
|
|
11
|
+
"status"
|
|
12
|
+
],
|
|
13
|
+
"status": "stable",
|
|
14
|
+
"sourcePath": "src/components/Progress/index.tsx",
|
|
15
|
+
"exportName": "Progress",
|
|
16
|
+
"propsSummary": [
|
|
17
|
+
"value: number (default: null)",
|
|
18
|
+
"min: number (default: 0)",
|
|
19
|
+
"max: number (default: 100)",
|
|
20
|
+
"size: sm|md|lg (default: md)",
|
|
21
|
+
"variant: default|success|warning|danger (default: default)",
|
|
22
|
+
"label: string",
|
|
23
|
+
"showValue: boolean (default: false)",
|
|
24
|
+
"formatValue: function"
|
|
25
|
+
],
|
|
26
|
+
"props": {
|
|
27
|
+
"value": {
|
|
28
|
+
"type": "number",
|
|
29
|
+
"description": "Current progress value (0-100). Null for indeterminate.",
|
|
30
|
+
"default": "null",
|
|
31
|
+
"required": false
|
|
32
|
+
},
|
|
33
|
+
"min": {
|
|
34
|
+
"type": "number",
|
|
35
|
+
"description": "Minimum value",
|
|
36
|
+
"default": "0",
|
|
37
|
+
"required": false
|
|
38
|
+
},
|
|
39
|
+
"max": {
|
|
40
|
+
"type": "number",
|
|
41
|
+
"description": "Maximum value",
|
|
42
|
+
"default": "100",
|
|
43
|
+
"required": false
|
|
44
|
+
},
|
|
45
|
+
"size": {
|
|
46
|
+
"type": "enum",
|
|
47
|
+
"description": "Size of the progress bar",
|
|
48
|
+
"default": "md",
|
|
49
|
+
"required": false,
|
|
50
|
+
"values": [
|
|
51
|
+
"sm",
|
|
52
|
+
"md",
|
|
53
|
+
"lg"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"variant": {
|
|
57
|
+
"type": "enum",
|
|
58
|
+
"description": "Color variant",
|
|
59
|
+
"default": "default",
|
|
60
|
+
"required": false,
|
|
61
|
+
"values": [
|
|
62
|
+
"default",
|
|
63
|
+
"success",
|
|
64
|
+
"warning",
|
|
65
|
+
"danger"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"label": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"description": "Label text above the progress bar",
|
|
71
|
+
"required": false
|
|
72
|
+
},
|
|
73
|
+
"showValue": {
|
|
74
|
+
"type": "boolean",
|
|
75
|
+
"description": "Show percentage value",
|
|
76
|
+
"default": "false",
|
|
77
|
+
"required": false
|
|
78
|
+
},
|
|
79
|
+
"formatValue": {
|
|
80
|
+
"type": "function",
|
|
81
|
+
"description": "Custom formatter for displayed progress value",
|
|
82
|
+
"required": false
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"usage": {
|
|
86
|
+
"when": [
|
|
87
|
+
"Showing upload/download progress",
|
|
88
|
+
"Displaying task completion percentage",
|
|
89
|
+
"Form completion indicators",
|
|
90
|
+
"Loading states with known duration"
|
|
91
|
+
],
|
|
92
|
+
"whenNot": [
|
|
93
|
+
"Unknown loading duration (use Spinner)",
|
|
94
|
+
"Step-based progress (use Stepper)",
|
|
95
|
+
"Status without percentage (use Badge)"
|
|
96
|
+
],
|
|
97
|
+
"guidelines": [
|
|
98
|
+
"Use determinate progress when you know the completion percentage",
|
|
99
|
+
"Use indeterminate for unknown durations",
|
|
100
|
+
"Include a label for context when the purpose isnt obvious",
|
|
101
|
+
"Use appropriate color variants for success/warning/danger states",
|
|
102
|
+
"Determinate values are clamped to the min/max range for display"
|
|
103
|
+
],
|
|
104
|
+
"accessibility": [
|
|
105
|
+
"Uses role=\"progressbar\" with aria-valuenow",
|
|
106
|
+
"Label is associated with the progress bar",
|
|
107
|
+
"State changes are announced to screen readers"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"examples": [
|
|
111
|
+
{
|
|
112
|
+
"name": "Default",
|
|
113
|
+
"description": "Basic progress bar with percentage",
|
|
114
|
+
"code": "<Progress value={60} label=\"Uploading...\" showValue />"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "Variants",
|
|
118
|
+
"description": "Different color variants for different states",
|
|
119
|
+
"code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>\n <Progress value={75} variant=\"default\" label=\"Processing\" showValue />\n <Progress value={100} variant=\"success\" label=\"Complete\" showValue />\n <Progress value={80} variant=\"warning\" label=\"Almost full\" showValue />\n <Progress value={95} variant=\"danger\" label=\"Storage critical\" showValue />\n</div>"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "Sizes",
|
|
123
|
+
"description": "Different progress bar sizes",
|
|
124
|
+
"code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>\n <Progress value={50} size=\"sm\" label=\"Small\" />\n <Progress value={50} size=\"md\" label=\"Medium\" />\n <Progress value={50} size=\"lg\" label=\"Large\" />\n</div>"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "Indeterminate",
|
|
128
|
+
"description": "Loading state with unknown duration",
|
|
129
|
+
"code": "<Progress value={null} label=\"Loading...\" />"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "Circular",
|
|
133
|
+
"description": "Circular progress indicator",
|
|
134
|
+
"code": "<div style={{ display: 'flex', gap: '24px', alignItems: 'center' }}>\n <CircularProgress value={25} size=\"sm\" />\n <CircularProgress value={50} size=\"md\" showValue />\n <CircularProgress value={75} size=\"lg\" showValue variant=\"success\" />\n <CircularProgress value={null} size=\"md\" />\n</div>"
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"relations": [
|
|
138
|
+
{
|
|
139
|
+
"component": "Badge",
|
|
140
|
+
"relationship": "alternative",
|
|
141
|
+
"note": "Use Badge for status without percentage"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"component": "Alert",
|
|
145
|
+
"relationship": "sibling",
|
|
146
|
+
"note": "Use Alert for completion messages"
|
|
147
|
+
}
|
|
148
|
+
],
|
|
149
|
+
"contract": {
|
|
150
|
+
"propsSummary": [
|
|
151
|
+
"value: number|null - progress percentage (null for indeterminate)",
|
|
152
|
+
"size: sm|md|lg - bar thickness",
|
|
153
|
+
"variant: default|success|warning|danger - color",
|
|
154
|
+
"label: string - descriptive label",
|
|
155
|
+
"showValue: boolean - display percentage",
|
|
156
|
+
"Determinate display values are clamped (and invalid min/max ranges render as 0%)"
|
|
157
|
+
],
|
|
158
|
+
"a11yRules": [
|
|
159
|
+
"A11Y_PROGRESS_ROLE",
|
|
160
|
+
"A11Y_PROGRESS_VALUE"
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
"ai": {
|
|
164
|
+
"compositionPattern": "compound",
|
|
165
|
+
"subComponents": [
|
|
166
|
+
"Root",
|
|
167
|
+
"Circular"
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
"provenance": {
|
|
171
|
+
"source": "migrated",
|
|
172
|
+
"verified": false,
|
|
173
|
+
"frameworkSupport": "native",
|
|
174
|
+
"extractedAt": "2026-03-13T23:19:02.339Z"
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://usefragments.com/schemas/contract.v1.json",
|
|
3
|
+
"name": "Prompt",
|
|
4
|
+
"description": "Multi-line input with toolbar for AI/chat interfaces",
|
|
5
|
+
"category": "ai",
|
|
6
|
+
"tags": [
|
|
7
|
+
"prompt",
|
|
8
|
+
"chat",
|
|
9
|
+
"ai",
|
|
10
|
+
"input",
|
|
11
|
+
"textarea",
|
|
12
|
+
"form"
|
|
13
|
+
],
|
|
14
|
+
"status": "stable",
|
|
15
|
+
"sourcePath": "src/components/Prompt/index.tsx",
|
|
16
|
+
"exportName": "Prompt",
|
|
17
|
+
"propsSummary": [
|
|
18
|
+
"children: node (required)",
|
|
19
|
+
"value: string",
|
|
20
|
+
"defaultValue: string (default: )",
|
|
21
|
+
"onChange: function",
|
|
22
|
+
"onSubmit: function",
|
|
23
|
+
"placeholder: string (default: Ask, Search or Chat...)",
|
|
24
|
+
"disabled: boolean (default: false)",
|
|
25
|
+
"loading: boolean (default: false)",
|
|
26
|
+
"minRows: number (default: 1)",
|
|
27
|
+
"maxRows: number (default: 8)",
|
|
28
|
+
"autoResize: boolean (default: true)",
|
|
29
|
+
"submitOnEnter: boolean (default: true)",
|
|
30
|
+
"variant: default|fixed|sticky (default: default)"
|
|
31
|
+
],
|
|
32
|
+
"props": {
|
|
33
|
+
"children": {
|
|
34
|
+
"type": "node",
|
|
35
|
+
"description": "Prompt composition using Prompt sub-components",
|
|
36
|
+
"required": true
|
|
37
|
+
},
|
|
38
|
+
"value": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"description": "Controlled input value",
|
|
41
|
+
"required": false
|
|
42
|
+
},
|
|
43
|
+
"defaultValue": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Uncontrolled default value",
|
|
46
|
+
"default": "",
|
|
47
|
+
"required": false
|
|
48
|
+
},
|
|
49
|
+
"onChange": {
|
|
50
|
+
"type": "function",
|
|
51
|
+
"description": "Called when value changes",
|
|
52
|
+
"required": false
|
|
53
|
+
},
|
|
54
|
+
"onSubmit": {
|
|
55
|
+
"type": "function",
|
|
56
|
+
"description": "Called on form submission",
|
|
57
|
+
"required": false
|
|
58
|
+
},
|
|
59
|
+
"placeholder": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"description": "Placeholder text for the textarea",
|
|
62
|
+
"default": "Ask, Search or Chat...",
|
|
63
|
+
"required": false
|
|
64
|
+
},
|
|
65
|
+
"disabled": {
|
|
66
|
+
"type": "boolean",
|
|
67
|
+
"description": "Disable the entire prompt",
|
|
68
|
+
"default": "false",
|
|
69
|
+
"required": false
|
|
70
|
+
},
|
|
71
|
+
"loading": {
|
|
72
|
+
"type": "boolean",
|
|
73
|
+
"description": "Show loading state",
|
|
74
|
+
"default": "false",
|
|
75
|
+
"required": false
|
|
76
|
+
},
|
|
77
|
+
"minRows": {
|
|
78
|
+
"type": "number",
|
|
79
|
+
"description": "Minimum number of visible rows",
|
|
80
|
+
"default": "1",
|
|
81
|
+
"required": false
|
|
82
|
+
},
|
|
83
|
+
"maxRows": {
|
|
84
|
+
"type": "number",
|
|
85
|
+
"description": "Maximum number of visible rows",
|
|
86
|
+
"default": "8",
|
|
87
|
+
"required": false
|
|
88
|
+
},
|
|
89
|
+
"autoResize": {
|
|
90
|
+
"type": "boolean",
|
|
91
|
+
"description": "Enable auto-resize based on content",
|
|
92
|
+
"default": "true",
|
|
93
|
+
"required": false
|
|
94
|
+
},
|
|
95
|
+
"submitOnEnter": {
|
|
96
|
+
"type": "boolean",
|
|
97
|
+
"description": "Submit on Enter (Shift+Enter for newline)",
|
|
98
|
+
"default": "true",
|
|
99
|
+
"required": false
|
|
100
|
+
},
|
|
101
|
+
"variant": {
|
|
102
|
+
"type": "enum",
|
|
103
|
+
"description": "Visual/positioning variant",
|
|
104
|
+
"default": "default",
|
|
105
|
+
"required": false,
|
|
106
|
+
"values": [
|
|
107
|
+
"default",
|
|
108
|
+
"fixed",
|
|
109
|
+
"sticky"
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"usage": {
|
|
114
|
+
"when": [
|
|
115
|
+
"Building chat or AI assistant interfaces",
|
|
116
|
+
"Need multi-line input with submit action",
|
|
117
|
+
"Require toolbar with actions like attachments or model selection"
|
|
118
|
+
],
|
|
119
|
+
"whenNot": [
|
|
120
|
+
"Simple single-line text input (use Input)",
|
|
121
|
+
"Basic multi-line without toolbar (use Textarea)",
|
|
122
|
+
"Search-only interface (use Input with search variant)"
|
|
123
|
+
],
|
|
124
|
+
"guidelines": [
|
|
125
|
+
"Always provide an onSubmit handler",
|
|
126
|
+
"Use loading state during API calls",
|
|
127
|
+
"Prompt.Textarea forwards native textarea props (autoComplete, inputMode, aria-*, data-*, handlers)",
|
|
128
|
+
"Prompt.Textarea composes your onChange/onKeyDown handlers with built-in submit and auto-resize behavior",
|
|
129
|
+
"Consider showing usage/token limits for AI contexts"
|
|
130
|
+
],
|
|
131
|
+
"accessibility": [
|
|
132
|
+
"Enter submits, Shift+Enter for newline",
|
|
133
|
+
"Submit button is keyboard accessible",
|
|
134
|
+
"Loading state prevents duplicate submissions"
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
"examples": [
|
|
138
|
+
{
|
|
139
|
+
"name": "Basic",
|
|
140
|
+
"description": "Simple prompt with submit button",
|
|
141
|
+
"code": "<Prompt onSubmit={(value) => console.log(value)}>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions />\n <Prompt.Info>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"name": "With Actions",
|
|
145
|
+
"description": "Prompt with attachment and mode buttons",
|
|
146
|
+
"code": "<Prompt onSubmit={(value) => console.log(value)}>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n <Prompt.ModeButton>Auto</Prompt.ModeButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"name": "With Usage",
|
|
150
|
+
"description": "Shows token usage indicator",
|
|
151
|
+
"code": "<Prompt onSubmit={(value) => console.log(value)}>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n <Prompt.ModeButton active>Auto</Prompt.ModeButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Usage>52% used</Prompt.Usage>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"name": "Loading State",
|
|
155
|
+
"description": "During API submission",
|
|
156
|
+
"code": "<Prompt\n onSubmit={(value) => console.log(value)}\n loading\n defaultValue=\"Tell me about the weather...\"\n>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n <Prompt.ModeButton>Auto</Prompt.ModeButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Usage>52% used</Prompt.Usage>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"name": "Disabled",
|
|
160
|
+
"description": "Non-interactive prompt",
|
|
161
|
+
"code": "<Prompt onSubmit={(value) => console.log(value)} disabled>\n <Prompt.Textarea />\n <Prompt.Toolbar>\n <Prompt.Actions>\n <Prompt.ActionButton aria-label=\"Add attachment\">\n +\n </Prompt.ActionButton>\n </Prompt.Actions>\n <Prompt.Info>\n <Prompt.Submit />\n </Prompt.Info>\n </Prompt.Toolbar>\n</Prompt>"
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
"relations": [
|
|
165
|
+
{
|
|
166
|
+
"component": "Input",
|
|
167
|
+
"relationship": "alternative",
|
|
168
|
+
"note": "Use Input for simple single-line text input"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"component": "Textarea",
|
|
172
|
+
"relationship": "alternative",
|
|
173
|
+
"note": "Use Textarea for multi-line without toolbar"
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
"contract": {
|
|
177
|
+
"propsSummary": [
|
|
178
|
+
"value: string - controlled input value",
|
|
179
|
+
"onSubmit: (value: string) => void - submission handler",
|
|
180
|
+
"placeholder: string - hint text (default: \"Ask, Search or Chat...\")",
|
|
181
|
+
"disabled: boolean - disables interaction",
|
|
182
|
+
"loading: boolean - shows loading state",
|
|
183
|
+
"minRows/maxRows: number - row constraints (default: 1/8)",
|
|
184
|
+
"submitOnEnter: boolean - Enter key behavior (default: true)",
|
|
185
|
+
"Prompt.Textarea accepts native textarea props and optional aria-label override"
|
|
186
|
+
],
|
|
187
|
+
"a11yRules": [
|
|
188
|
+
"A11Y_TEXTAREA_LABEL",
|
|
189
|
+
"A11Y_BUTTON_LABEL"
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
"ai": {
|
|
193
|
+
"compositionPattern": "compound",
|
|
194
|
+
"subComponents": [
|
|
195
|
+
"Textarea",
|
|
196
|
+
"Toolbar",
|
|
197
|
+
"Actions",
|
|
198
|
+
"Info",
|
|
199
|
+
"ActionButton",
|
|
200
|
+
"ModeButton",
|
|
201
|
+
"Usage",
|
|
202
|
+
"Submit"
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
"provenance": {
|
|
206
|
+
"source": "migrated",
|
|
207
|
+
"verified": false,
|
|
208
|
+
"frameworkSupport": "native",
|
|
209
|
+
"extractedAt": "2026-03-13T23:19:02.513Z"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -11,13 +11,77 @@
|
|
|
11
11
|
flex-direction: column;
|
|
12
12
|
border-radius: var(--fui-radius-xl, $fui-radius-xl);
|
|
13
13
|
overflow: hidden;
|
|
14
|
+
position: relative;
|
|
15
|
+
|
|
16
|
+
// Beam border — rotating conic gradient clipped to a 1px border
|
|
17
|
+
&::before,
|
|
18
|
+
&::after {
|
|
19
|
+
content: '';
|
|
20
|
+
position: absolute;
|
|
21
|
+
inset: 0;
|
|
22
|
+
border-radius: inherit;
|
|
23
|
+
pointer-events: none;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Gradient layer (behind everything)
|
|
27
|
+
&::before {
|
|
28
|
+
inset: -1px;
|
|
29
|
+
z-index: 0;
|
|
30
|
+
background: conic-gradient(
|
|
31
|
+
from var(--beam-angle, 0deg) at 50% 50%,
|
|
32
|
+
transparent 0%,
|
|
33
|
+
transparent 25%,
|
|
34
|
+
var(--fui-color-accent, $fui-color-accent) 45%,
|
|
35
|
+
transparent 50%,
|
|
36
|
+
transparent 55%,
|
|
37
|
+
color-mix(in srgb, var(--fui-color-accent, $fui-color-accent) 40%, transparent) 70%,
|
|
38
|
+
transparent 75%,
|
|
39
|
+
transparent 100%
|
|
40
|
+
);
|
|
41
|
+
animation: beam-rotate 4s linear infinite;
|
|
42
|
+
opacity: 0.6;
|
|
43
|
+
transition: opacity 300ms ease;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Mask layer — covers the interior, leaving only the 1px border visible
|
|
47
|
+
&::after {
|
|
48
|
+
inset: 1px;
|
|
49
|
+
z-index: 1;
|
|
50
|
+
background: var(--fui-bg-elevated, $fui-bg-elevated);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Content must sit above the mask
|
|
54
|
+
> * {
|
|
55
|
+
position: relative;
|
|
56
|
+
z-index: 2;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
&:focus-within::before {
|
|
60
|
+
opacity: 1;
|
|
61
|
+
}
|
|
14
62
|
|
|
15
63
|
&[data-disabled] {
|
|
16
64
|
opacity: 0.5;
|
|
17
65
|
pointer-events: none;
|
|
66
|
+
|
|
67
|
+
&::before {
|
|
68
|
+
animation-play-state: paused;
|
|
69
|
+
opacity: 0.2;
|
|
70
|
+
}
|
|
18
71
|
}
|
|
19
72
|
}
|
|
20
73
|
|
|
74
|
+
@keyframes beam-rotate {
|
|
75
|
+
from { --beam-angle: 0deg; }
|
|
76
|
+
to { --beam-angle: 360deg; }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@property --beam-angle {
|
|
80
|
+
syntax: '<angle>';
|
|
81
|
+
initial-value: 0deg;
|
|
82
|
+
inherits: false;
|
|
83
|
+
}
|
|
84
|
+
|
|
21
85
|
// Fixed variant - for viewport-fixed prompts (centered to page)
|
|
22
86
|
.fixed {
|
|
23
87
|
position: fixed;
|
|
@@ -71,9 +135,11 @@
|
|
|
71
135
|
color: var(--fui-text-tertiary, $fui-text-tertiary);
|
|
72
136
|
}
|
|
73
137
|
|
|
138
|
+
// Focus is shown on the prompt container via :focus-within instead
|
|
139
|
+
&:focus,
|
|
74
140
|
&:focus-visible {
|
|
75
|
-
|
|
76
|
-
|
|
141
|
+
outline: none;
|
|
142
|
+
box-shadow: none;
|
|
77
143
|
}
|
|
78
144
|
|
|
79
145
|
&:disabled {
|
|
@@ -81,6 +147,52 @@
|
|
|
81
147
|
}
|
|
82
148
|
}
|
|
83
149
|
|
|
150
|
+
// ============================================
|
|
151
|
+
// Tabs (floating above the prompt body)
|
|
152
|
+
// ============================================
|
|
153
|
+
|
|
154
|
+
.tabs {
|
|
155
|
+
display: flex;
|
|
156
|
+
justify-content: center;
|
|
157
|
+
margin-bottom: calc(-1 * var(--fui-space-1, $fui-space-1)); // overlap the prompt border
|
|
158
|
+
position: relative;
|
|
159
|
+
z-index: 1;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.tabsInner {
|
|
163
|
+
display: inline-flex;
|
|
164
|
+
gap: 1px;
|
|
165
|
+
background-color: var(--fui-bg-elevated, $fui-bg-elevated);
|
|
166
|
+
border-radius: var(--fui-radius-lg, $fui-radius-lg) var(--fui-radius-lg, $fui-radius-lg) 0 0;
|
|
167
|
+
padding: 3px 3px 0 3px;
|
|
168
|
+
border: 1px solid var(--fui-border, $fui-border);
|
|
169
|
+
border-bottom: none;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.tabButton {
|
|
173
|
+
@include button-reset;
|
|
174
|
+
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
justify-content: center;
|
|
178
|
+
padding: var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
|
|
179
|
+
border-radius: var(--fui-radius-md, $fui-radius-md) var(--fui-radius-md, $fui-radius-md) 0 0;
|
|
180
|
+
font-size: var(--fui-font-size-sm, $fui-font-size-sm);
|
|
181
|
+
font-weight: var(--fui-font-weight-medium, $fui-font-weight-medium);
|
|
182
|
+
color: var(--fui-text-tertiary, $fui-text-tertiary);
|
|
183
|
+
transition: all 120ms ease;
|
|
184
|
+
white-space: nowrap;
|
|
185
|
+
|
|
186
|
+
&:hover {
|
|
187
|
+
color: var(--fui-text-primary, $fui-text-primary);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.tabButtonActive {
|
|
192
|
+
background-color: var(--fui-bg-secondary, $fui-bg-secondary);
|
|
193
|
+
color: var(--fui-text-primary, $fui-text-primary);
|
|
194
|
+
}
|
|
195
|
+
|
|
84
196
|
// ============================================
|
|
85
197
|
// Toolbar
|
|
86
198
|
// ============================================
|
|
@@ -102,7 +214,9 @@
|
|
|
102
214
|
.actions {
|
|
103
215
|
display: flex;
|
|
104
216
|
align-items: center;
|
|
217
|
+
align-self: flex-end;
|
|
105
218
|
gap: var(--fui-space-1, $fui-space-1);
|
|
219
|
+
padding: 0 var(--fui-space-2, $fui-space-2) var(--fui-space-2, $fui-space-2) 0;
|
|
106
220
|
}
|
|
107
221
|
|
|
108
222
|
.info {
|
|
@@ -201,7 +315,7 @@
|
|
|
201
315
|
height: 2rem;
|
|
202
316
|
border-radius: var(--fui-radius-full, $fui-radius-full);
|
|
203
317
|
background-color: var(--fui-color-accent, $fui-color-accent);
|
|
204
|
-
color: var(--fui-
|
|
318
|
+
color: var(--fui-color-on-accent, $fui-color-on-accent);
|
|
205
319
|
|
|
206
320
|
&:hover:not(:disabled) {
|
|
207
321
|
background-color: var(--fui-color-accent-hover, $fui-color-accent-hover);
|
|
@@ -55,6 +55,20 @@ export interface PromptToolbarProps {
|
|
|
55
55
|
className?: string;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
export interface PromptTabsProps {
|
|
59
|
+
children: React.ReactNode;
|
|
60
|
+
className?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface PromptTabProps {
|
|
64
|
+
children: React.ReactNode;
|
|
65
|
+
/** Whether this tab is currently active */
|
|
66
|
+
active?: boolean;
|
|
67
|
+
/** Click handler */
|
|
68
|
+
onClick?: React.MouseEventHandler<HTMLButtonElement>;
|
|
69
|
+
className?: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
58
72
|
export interface PromptActionsProps {
|
|
59
73
|
children?: React.ReactNode;
|
|
60
74
|
className?: string;
|
|
@@ -330,6 +344,28 @@ function PromptToolbar({ children, className }: PromptToolbarProps) {
|
|
|
330
344
|
return <div className={classes}>{children}</div>;
|
|
331
345
|
}
|
|
332
346
|
|
|
347
|
+
function PromptTabs({ children, className }: PromptTabsProps) {
|
|
348
|
+
const classes = [styles.tabs, className].filter(Boolean).join(' ');
|
|
349
|
+
return (
|
|
350
|
+
<div className={classes}>
|
|
351
|
+
<div className={styles.tabsInner}>{children}</div>
|
|
352
|
+
</div>
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function PromptTab({ children, active = false, onClick, className }: PromptTabProps) {
|
|
357
|
+
const classes = [
|
|
358
|
+
styles.tabButton,
|
|
359
|
+
active && styles.tabButtonActive,
|
|
360
|
+
className,
|
|
361
|
+
].filter(Boolean).join(' ');
|
|
362
|
+
return (
|
|
363
|
+
<button type="button" className={classes} onClick={onClick} aria-pressed={active}>
|
|
364
|
+
{children}
|
|
365
|
+
</button>
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
|
|
333
369
|
function PromptActions({ children, className }: PromptActionsProps) {
|
|
334
370
|
if (!children) return null;
|
|
335
371
|
const classes = [styles.actions, className].filter(Boolean).join(' ');
|
|
@@ -444,6 +480,8 @@ function PromptSubmit({
|
|
|
444
480
|
export const Prompt = Object.assign(PromptRoot, {
|
|
445
481
|
Textarea: PromptTextarea,
|
|
446
482
|
Toolbar: PromptToolbar,
|
|
483
|
+
Tabs: PromptTabs,
|
|
484
|
+
Tab: PromptTab,
|
|
447
485
|
Actions: PromptActions,
|
|
448
486
|
Info: PromptInfo,
|
|
449
487
|
ActionButton: PromptActionButton,
|
|
@@ -456,6 +494,8 @@ export {
|
|
|
456
494
|
PromptRoot,
|
|
457
495
|
PromptTextarea,
|
|
458
496
|
PromptToolbar,
|
|
497
|
+
PromptTabs,
|
|
498
|
+
PromptTab,
|
|
459
499
|
PromptActions,
|
|
460
500
|
PromptInfo,
|
|
461
501
|
PromptActionButton,
|