@neuronection/assistant-ui 0.6.0 → 0.7.1

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 (71) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +2 -0
  3. package/dist/ai-magic-fill.js +1 -1
  4. package/dist/{chunk-TKKHWO6C.js → chunk-2YQSA5AE.js} +3 -3
  5. package/dist/{chunk-TKKHWO6C.js.map → chunk-2YQSA5AE.js.map} +1 -1
  6. package/dist/{chunk-W5WDGME5.js → chunk-3RDFWXX6.js} +9 -6
  7. package/dist/chunk-3RDFWXX6.js.map +1 -0
  8. package/dist/{chunk-2EPZAT3X.js → chunk-62GIJMWT.js} +3 -3
  9. package/dist/{chunk-2EPZAT3X.js.map → chunk-62GIJMWT.js.map} +1 -1
  10. package/dist/{chunk-UU2V5FGF.js → chunk-6VCJX4CP.js} +3 -3
  11. package/dist/{chunk-UU2V5FGF.js.map → chunk-6VCJX4CP.js.map} +1 -1
  12. package/dist/chunk-AHLNXCP2.js +74 -0
  13. package/dist/chunk-AHLNXCP2.js.map +1 -0
  14. package/dist/{chunk-L4NM55XW.js → chunk-EODV6JK7.js} +3 -3
  15. package/dist/{chunk-L4NM55XW.js.map → chunk-EODV6JK7.js.map} +1 -1
  16. package/dist/{chunk-BWPNEQ3T.js → chunk-G6557MEN.js} +3 -3
  17. package/dist/{chunk-BWPNEQ3T.js.map → chunk-G6557MEN.js.map} +1 -1
  18. package/dist/chunk-IQKP2BWE.js +78 -0
  19. package/dist/chunk-IQKP2BWE.js.map +1 -0
  20. package/dist/chunk-J4OELYDR.js +125 -0
  21. package/dist/chunk-J4OELYDR.js.map +1 -0
  22. package/dist/chunk-OPTH3VUY.js +63 -0
  23. package/dist/chunk-OPTH3VUY.js.map +1 -0
  24. package/dist/{chunk-5AVBKEDQ.js → chunk-PFAH25VU.js} +3 -3
  25. package/dist/{chunk-5AVBKEDQ.js.map → chunk-PFAH25VU.js.map} +1 -1
  26. package/dist/chunk-RJSN4TVT.js +89 -0
  27. package/dist/chunk-RJSN4TVT.js.map +1 -0
  28. package/dist/chunk-RLFND34I.js +3 -0
  29. package/dist/chunk-RLFND34I.js.map +1 -0
  30. package/dist/chunk-TN35RR2R.js +92 -0
  31. package/dist/chunk-TN35RR2R.js.map +1 -0
  32. package/dist/chunk-UWHUCQC6.js +73 -0
  33. package/dist/chunk-UWHUCQC6.js.map +1 -0
  34. package/dist/chunk-VKV464ZF.js +3 -0
  35. package/dist/chunk-VKV464ZF.js.map +1 -0
  36. package/dist/{chunk-SXVOJ7WE.js → chunk-Y7BKBG57.js} +3 -3
  37. package/dist/{chunk-SXVOJ7WE.js.map → chunk-Y7BKBG57.js.map} +1 -1
  38. package/dist/{chunk-75QQR2VT.js → chunk-YMCMUAIF.js} +3 -3
  39. package/dist/{chunk-75QQR2VT.js.map → chunk-YMCMUAIF.js.map} +1 -1
  40. package/dist/combobox.d.ts +1 -0
  41. package/dist/combobox.js +1 -1
  42. package/dist/confirmation-modal.js +1 -1
  43. package/dist/connection-test-row.js +1 -71
  44. package/dist/connection-test-row.js.map +1 -1
  45. package/dist/date-picker.js +1 -1
  46. package/dist/file-card.d.ts +25 -0
  47. package/dist/file-card.js +3 -0
  48. package/dist/file-card.js.map +1 -0
  49. package/dist/file-queue.d.ts +32 -0
  50. package/dist/file-queue.js +3 -0
  51. package/dist/file-queue.js.map +1 -0
  52. package/dist/form-modal.js +1 -1
  53. package/dist/index.d.ts +30 -2
  54. package/dist/index.js +149 -11
  55. package/dist/index.js.map +1 -1
  56. package/dist/modal.js +2 -2
  57. package/dist/model-picker.d.ts +38 -0
  58. package/dist/model-picker.js +3 -0
  59. package/dist/model-picker.js.map +1 -0
  60. package/dist/provider-form.js +1 -87
  61. package/dist/provider-form.js.map +1 -1
  62. package/dist/range-bar.js +1 -1
  63. package/dist/settings-shell.js +1 -72
  64. package/dist/settings-shell.js.map +1 -1
  65. package/dist/styles.css +1 -1
  66. package/dist/task-assignment-picker.d.ts +27 -0
  67. package/dist/task-assignment-picker.js +3 -0
  68. package/dist/task-assignment-picker.js.map +1 -0
  69. package/dist/wizard.js +1 -1
  70. package/package.json +21 -1
  71. package/dist/chunk-W5WDGME5.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,44 +1,182 @@
1
+ export { Stepper, Wizard } from './chunk-YMCMUAIF.js';
2
+ export { Table } from './chunk-5LRRVD27.js';
3
+ export { TaskAssignmentPicker } from './chunk-TN35RR2R.js';
4
+ export { SettingsShell } from './chunk-AHLNXCP2.js';
1
5
  export { ThemeScope } from './chunk-TGU3PKNM.js';
2
6
  export { InfoTooltip, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './chunk-34NO2UOB.js';
3
7
  export { UndoNotice } from './chunk-OUHUVACM.js';
4
8
  export { ViewToggle } from './chunk-MXOBOS4Y.js';
5
- export { Stepper, Wizard } from './chunk-75QQR2VT.js';
6
- export { RangeBar } from './chunk-5AVBKEDQ.js';
9
+ export { Portal } from './chunk-7YLR4AGA.js';
10
+ export { ProviderForm } from './chunk-RJSN4TVT.js';
11
+ export { RangeBar } from './chunk-PFAH25VU.js';
7
12
  export { ScaleSlider, scaleColorForValue } from './chunk-UIUALJNR.js';
8
13
  export { SearchInput } from './chunk-H5U4KNXF.js';
9
14
  export { SelectionBar } from './chunk-HSUCCANX.js';
10
- export { Table } from './chunk-5LRRVD27.js';
11
15
  export { Input } from './chunk-M4V7XHL7.js';
12
16
  export { MarqueeBand, MarqueeSurface, hitTestIds, marqueeRect, rectsIntersect, useMarquee } from './chunk-RU3DEF2O.js';
13
- export { PanelModal } from './chunk-BWPNEQ3T.js';
14
- export { Portal } from './chunk-7YLR4AGA.js';
17
+ export { ModelPicker } from './chunk-OPTH3VUY.js';
18
+ export { PanelModal } from './chunk-G6557MEN.js';
15
19
  export { ContextMenu } from './chunk-WA7Q4TTA.js';
16
20
  export { ActionMenu, Menu, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuSeparator, MenuTrigger } from './chunk-JWAX2AOO.js';
17
- export { DatePicker } from './chunk-UU2V5FGF.js';
21
+ export { DatePicker } from './chunk-6VCJX4CP.js';
18
22
  export { EmptyState } from './chunk-KDJLYKR6.js';
19
23
  export { ErrorBanner } from './chunk-BJOY3XL7.js';
20
24
  export { ExpandableSearch } from './chunk-4SW3ESVI.js';
25
+ export { FileQueue } from './chunk-IQKP2BWE.js';
26
+ export { FileCard, formatBytes } from './chunk-J4OELYDR.js';
21
27
  export { FieldLabel } from './chunk-I5J6SDLK.js';
22
28
  export { InfoButton } from './chunk-OT6EQFMP.js';
23
29
  export { PopoverButton } from './chunk-BE3XFZWU.js';
24
30
  export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-HSWSYEFQ.js';
31
+ export { ConnectionTestRow } from './chunk-UWHUCQC6.js';
25
32
  export { CheckIndicator } from './chunk-XE4TFW63.js';
26
33
  export { ChipInput } from './chunk-TPLQL62V.js';
27
34
  export { ChipList } from './chunk-BN3YHYYL.js';
28
- export { Combobox, ComboboxMulti } from './chunk-W5WDGME5.js';
29
- export { ConfirmationModal } from './chunk-TKKHWO6C.js';
35
+ export { Combobox, ComboboxMulti } from './chunk-3RDFWXX6.js';
36
+ export { ConfirmationModal } from './chunk-2YQSA5AE.js';
30
37
  export { CopyButton } from './chunk-CZ2BL2ZL.js';
31
38
  export { rawTokens, semanticTokens } from './chunk-GDGKARRB.js';
32
39
  export { AiActionsDropdown } from './chunk-I37SYHM7.js';
33
40
  export { AiButton } from './chunk-L56KGPGS.js';
34
41
  export { Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger } from './chunk-SIIY2EGI.js';
35
- export { AiMagicFill } from './chunk-L4NM55XW.js';
36
- export { FormModal } from './chunk-2EPZAT3X.js';
37
- export { Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, modalContentVariants } from './chunk-SXVOJ7WE.js';
42
+ export { AiMagicFill } from './chunk-EODV6JK7.js';
43
+ export { FormModal } from './chunk-62GIJMWT.js';
44
+ export { Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, modalContentVariants } from './chunk-Y7BKBG57.js';
38
45
  export { Badge, badgeVariants } from './chunk-SKTLC2XY.js';
39
46
  export { Breadcrumbs } from './chunk-TFS2NUET.js';
40
47
  export { Button, buttonVariants } from './chunk-GTXGTQ6F.js';
41
48
  export { Spinner } from './chunk-INTST5VG.js';
49
+ import { cn } from './chunk-BLJWR4ZV.js';
42
50
  export { cn } from './chunk-BLJWR4ZV.js';
51
+ import * as React from 'react';
52
+ import { Loader2, FolderUp, Upload } from 'lucide-react';
53
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
54
+
55
+ var UploadDropzone = React.forwardRef(
56
+ function UploadDropzone2({
57
+ onFiles,
58
+ uploading = false,
59
+ variant = "block",
60
+ label = "Drop files here or click to browse",
61
+ hint,
62
+ browseLabel = "Choose files",
63
+ folderLabel = "Choose folder",
64
+ accept,
65
+ multiple = true,
66
+ allowFolders = false,
67
+ disabled = false,
68
+ className
69
+ }, ref) {
70
+ const [dragging, setDragging] = React.useState(false);
71
+ const fileInput = React.useRef(null);
72
+ const folderInput = React.useRef(null);
73
+ const active = !disabled && !uploading;
74
+ const emit = (list) => {
75
+ if (!active || !list || list.length === 0) return;
76
+ onFiles(Array.from(list));
77
+ };
78
+ const input = allowFolders ? /* @__PURE__ */ jsxs(Fragment, { children: [
79
+ /* @__PURE__ */ jsx(
80
+ "input",
81
+ {
82
+ ref: fileInput,
83
+ type: "file",
84
+ accept,
85
+ multiple,
86
+ className: "hidden",
87
+ "aria-hidden": true,
88
+ tabIndex: -1,
89
+ onChange: (event) => {
90
+ emit(event.target.files);
91
+ event.target.value = "";
92
+ }
93
+ }
94
+ ),
95
+ /* @__PURE__ */ jsx(
96
+ "input",
97
+ {
98
+ ref: folderInput,
99
+ type: "file",
100
+ multiple: true,
101
+ className: "hidden",
102
+ webkitdirectory: "",
103
+ "aria-hidden": true,
104
+ tabIndex: -1,
105
+ onChange: (event) => {
106
+ emit(event.target.files);
107
+ event.target.value = "";
108
+ }
109
+ }
110
+ )
111
+ ] }) : /* @__PURE__ */ jsx(
112
+ "input",
113
+ {
114
+ ref: fileInput,
115
+ type: "file",
116
+ accept,
117
+ multiple,
118
+ className: "hidden",
119
+ "aria-hidden": true,
120
+ tabIndex: -1,
121
+ onChange: (event) => {
122
+ emit(event.target.files);
123
+ event.target.value = "";
124
+ }
125
+ }
126
+ );
127
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
128
+ input,
129
+ /* @__PURE__ */ jsxs(
130
+ "div",
131
+ {
132
+ ref,
133
+ "data-as": "upload-dropzone",
134
+ "data-variant": variant,
135
+ "data-dragging": dragging || void 0,
136
+ role: "button",
137
+ tabIndex: active ? 0 : -1,
138
+ "aria-label": label,
139
+ "aria-disabled": disabled || uploading || void 0,
140
+ onClick: () => active && fileInput.current?.click(),
141
+ onKeyDown: (event) => {
142
+ if (active && (event.key === "Enter" || event.key === " ")) {
143
+ event.preventDefault();
144
+ fileInput.current?.click();
145
+ }
146
+ },
147
+ onDragOver: (event) => {
148
+ event.preventDefault();
149
+ if (active) setDragging(true);
150
+ },
151
+ onDragLeave: () => setDragging(false),
152
+ onDrop: (event) => {
153
+ event.preventDefault();
154
+ setDragging(false);
155
+ emit(event.dataTransfer.files);
156
+ },
157
+ className: cn(
158
+ "flex cursor-pointer items-center justify-center gap-3 border border-dashed border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] transition-colors",
159
+ "hover:border-[var(--as-primary)] hover:text-[var(--as-fg)]",
160
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
161
+ variant === "block" ? "rounded-[var(--as-radius-lg)] p-8" : "rounded-[var(--as-radius)] px-4 py-3",
162
+ dragging && "border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] text-[var(--as-fg)]",
163
+ uploading && "cursor-progress opacity-70",
164
+ disabled && "pointer-events-none opacity-50",
165
+ className
166
+ ),
167
+ children: [
168
+ uploading ? /* @__PURE__ */ jsx(Loader2, { className: "size-5 shrink-0 animate-spin", "aria-hidden": true }) : allowFolders ? /* @__PURE__ */ jsx(FolderUp, { className: "size-5 shrink-0", "aria-hidden": true }) : /* @__PURE__ */ jsx(Upload, { className: "size-5 shrink-0", "aria-hidden": true }),
169
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col", children: [
170
+ /* @__PURE__ */ jsx("span", { className: "truncate text-sm font-medium", role: uploading ? "status" : void 0, children: uploading ? `${browseLabel}\u2026` : dragging ? folderLabel : label }),
171
+ hint ? /* @__PURE__ */ jsx("span", { className: "truncate text-xs", children: hint }) : null
172
+ ] })
173
+ ]
174
+ }
175
+ )
176
+ ] });
177
+ }
178
+ );
179
+
180
+ export { UploadDropzone };
43
181
  //# sourceMappingURL=index.js.map
44
182
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
1
+ {"version":3,"sources":["../src/components/upload-dropzone/UploadDropzone.tsx"],"names":["UploadDropzone"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react'\nimport { FolderUp, Loader2, Upload } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface UploadDropzoneProps {\n onFiles: (files: File[]) => void\n uploading?: boolean\n variant?: 'block' | 'row'\n label?: string\n hint?: string\n browseLabel?: string\n folderLabel?: string\n accept?: string\n multiple?: boolean\n allowFolders?: boolean\n disabled?: boolean\n className?: string\n}\n\n/**\n * Presentational dropzone: drag events and file-picker results go out via\n * `onFiles` — uploading, storage and progress stay app-side. Pass\n * `uploading` to render a busy state and suppress input.\n */\nexport const UploadDropzone = React.forwardRef<HTMLDivElement, UploadDropzoneProps>(\n function UploadDropzone(\n {\n onFiles,\n uploading = false,\n variant = 'block',\n label = 'Drop files here or click to browse',\n hint,\n browseLabel = 'Choose files',\n folderLabel = 'Choose folder',\n accept,\n multiple = true,\n allowFolders = false,\n disabled = false,\n className,\n },\n ref,\n ) {\n const [dragging, setDragging] = React.useState(false)\n const fileInput = React.useRef<HTMLInputElement>(null)\n const folderInput = React.useRef<HTMLInputElement>(null)\n\n const active = !disabled && !uploading\n\n const emit = (list: FileList | null) => {\n if (!active || !list || list.length === 0) return\n onFiles(Array.from(list))\n }\n\n const input = allowFolders ? (\n <>\n <input\n ref={fileInput}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n <input\n ref={folderInput}\n type=\"file\"\n multiple\n className=\"hidden\"\n // @ts-expect-error non-standard but universally supported directory picker\n webkitdirectory=\"\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n </>\n ) : (\n <input\n ref={fileInput}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n aria-hidden\n tabIndex={-1}\n onChange={(event) => {\n emit(event.target.files)\n event.target.value = ''\n }}\n />\n )\n\n return (\n <>\n {input}\n <div\n ref={ref}\n data-as=\"upload-dropzone\"\n data-variant={variant}\n data-dragging={dragging || undefined}\n role=\"button\"\n tabIndex={active ? 0 : -1}\n aria-label={label}\n aria-disabled={disabled || uploading || undefined}\n onClick={() => active && fileInput.current?.click()}\n onKeyDown={(event) => {\n if (active && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault()\n fileInput.current?.click()\n }\n }}\n onDragOver={(event) => {\n event.preventDefault()\n if (active) setDragging(true)\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(event) => {\n event.preventDefault()\n setDragging(false)\n emit(event.dataTransfer.files)\n }}\n className={cn(\n 'flex cursor-pointer items-center justify-center gap-3 border border-dashed border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] transition-colors',\n 'hover:border-[var(--as-primary)] hover:text-[var(--as-fg)]',\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]',\n variant === 'block' ? 'rounded-[var(--as-radius-lg)] p-8' : 'rounded-[var(--as-radius)] px-4 py-3',\n dragging && 'border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] text-[var(--as-fg)]',\n uploading && 'cursor-progress opacity-70',\n disabled && 'pointer-events-none opacity-50',\n className,\n )}\n >\n {uploading ? (\n <Loader2 className=\"size-5 shrink-0 animate-spin\" aria-hidden />\n ) : allowFolders ? (\n <FolderUp className=\"size-5 shrink-0\" aria-hidden />\n ) : (\n <Upload className=\"size-5 shrink-0\" aria-hidden />\n )}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm font-medium\" role={uploading ? 'status' : undefined}>\n {uploading ? `${browseLabel}…` : dragging ? folderLabel : label}\n </span>\n {hint ? <span className=\"truncate text-xs\">{hint}</span> : null}\n </span>\n </div>\n </>\n )\n },\n)\n"]}
package/dist/modal.js CHANGED
@@ -1,4 +1,4 @@
1
- export { PanelModal } from './chunk-BWPNEQ3T.js';
2
- export { Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, modalContentVariants } from './chunk-SXVOJ7WE.js';
1
+ export { PanelModal } from './chunk-G6557MEN.js';
2
+ export { Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, modalContentVariants } from './chunk-Y7BKBG57.js';
3
3
  //# sourceMappingURL=modal.js.map
4
4
  //# sourceMappingURL=modal.js.map
@@ -0,0 +1,38 @@
1
+ import * as React from 'react';
2
+
3
+ interface ModelPickerModel {
4
+ id: string;
5
+ name: string;
6
+ /** Short capability chip, e.g. `vision` or `tools`. */
7
+ capability?: string;
8
+ }
9
+ interface ModelPickerProvider {
10
+ id: string;
11
+ name: string;
12
+ models: ModelPickerModel[];
13
+ }
14
+ interface ModelPickerProps {
15
+ providers: ModelPickerProvider[];
16
+ value?: string;
17
+ onChange: (modelId: string) => void;
18
+ placeholder?: string;
19
+ searchPlaceholder?: string;
20
+ searchLabel?: string;
21
+ emptyLabel?: string;
22
+ loading?: boolean;
23
+ disabled?: boolean;
24
+ clearable?: boolean;
25
+ clearLabel?: string;
26
+ label?: string;
27
+ error?: string;
28
+ id?: string;
29
+ className?: string;
30
+ panelClassName?: string;
31
+ }
32
+ /**
33
+ * Grouped, searchable provider → model picker. Presentational: the model
34
+ * list comes in via props, selection goes out via `onChange`.
35
+ */
36
+ declare const ModelPicker: React.ForwardRefExoticComponent<ModelPickerProps & React.RefAttributes<HTMLButtonElement>>;
37
+
38
+ export { ModelPicker, type ModelPickerModel, type ModelPickerProps, type ModelPickerProvider };
@@ -0,0 +1,3 @@
1
+ export { ModelPicker } from './chunk-OPTH3VUY.js';
2
+ //# sourceMappingURL=model-picker.js.map
3
+ //# sourceMappingURL=model-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"model-picker.js"}
@@ -1,89 +1,3 @@
1
- import { Input } from './chunk-M4V7XHL7.js';
2
- import { cn } from './chunk-BLJWR4ZV.js';
3
- import * as React from 'react';
4
- import { KeyRound } from 'lucide-react';
5
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
-
7
- var ProviderForm = React.forwardRef(
8
- function ProviderForm2({
9
- name,
10
- onNameChange,
11
- baseUrl,
12
- onBaseUrlChange,
13
- apiKey,
14
- onApiKeyChange,
15
- namePlaceholder = "Provider name",
16
- baseUrlPlaceholder = "https://api.example.com/v1",
17
- nameLabel = "Name",
18
- baseUrlLabel = "API base URL",
19
- apiKeyLabel = "API key",
20
- apiKeyHelp,
21
- hasStoredKey = false,
22
- storedKeyLabel = "Stored \u2014 leave empty to keep",
23
- keyPlaceholder = "sk-\u2026",
24
- error,
25
- children,
26
- className,
27
- ...props
28
- }, ref) {
29
- return /* @__PURE__ */ jsxs(
30
- "div",
31
- {
32
- ref,
33
- "data-as": "provider-form",
34
- className: cn("flex w-full flex-col gap-4", className),
35
- ...props,
36
- children: [
37
- /* @__PURE__ */ jsx(
38
- Input,
39
- {
40
- label: nameLabel,
41
- value: name,
42
- onChange: (event) => onNameChange(event.target.value),
43
- placeholder: namePlaceholder
44
- }
45
- ),
46
- /* @__PURE__ */ jsx(
47
- Input,
48
- {
49
- label: baseUrlLabel,
50
- value: baseUrl,
51
- onChange: (event) => onBaseUrlChange(event.target.value),
52
- placeholder: baseUrlPlaceholder,
53
- className: "font-mono"
54
- }
55
- ),
56
- /* @__PURE__ */ jsx(
57
- Input,
58
- {
59
- label: hasStoredKey ? /* @__PURE__ */ jsxs(Fragment, { children: [
60
- apiKeyLabel,
61
- " ",
62
- /* @__PURE__ */ jsxs("span", { className: "font-normal text-[var(--as-muted-fg)]", children: [
63
- "(",
64
- storedKeyLabel,
65
- ")"
66
- ] })
67
- ] }) : apiKeyLabel,
68
- type: "password",
69
- value: apiKey,
70
- onChange: (event) => onApiKeyChange(event.target.value),
71
- placeholder: hasStoredKey ? "\u2022\u2022\u2022" : keyPlaceholder,
72
- autoComplete: "new-password",
73
- hint: apiKeyHelp ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
74
- /* @__PURE__ */ jsx(KeyRound, { className: "size-3", "aria-hidden": true }),
75
- apiKeyHelp
76
- ] }) : void 0
77
- }
78
- ),
79
- children,
80
- error ? /* @__PURE__ */ jsx("p", { role: "alert", className: "text-sm font-medium text-[var(--as-danger)]", children: error }) : null
81
- ]
82
- }
83
- );
84
- }
85
- );
86
-
87
- export { ProviderForm };
1
+ export { ProviderForm } from './chunk-RJSN4TVT.js';
88
2
  //# sourceMappingURL=provider-form.js.map
89
3
  //# sourceMappingURL=provider-form.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/provider-form/ProviderForm.tsx"],"names":["ProviderForm"],"mappings":";;;;;;AAgCO,IAAM,YAAA,GAAqB,KAAA,CAAA,UAAA;AAAA,EAChC,SAASA,aAAAA,CACP;AAAA,IACE,IAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA,GAAkB,eAAA;AAAA,IAClB,kBAAA,GAAqB,4BAAA;AAAA,IACrB,SAAA,GAAY,MAAA;AAAA,IACZ,YAAA,GAAe,cAAA;AAAA,IACf,WAAA,GAAc,SAAA;AAAA,IACd,UAAA;AAAA,IACA,YAAA,GAAe,KAAA;AAAA,IACf,cAAA,GAAiB,mCAAA;AAAA,IACjB,cAAA,GAAiB,WAAA;AAAA,IACjB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,eAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,QACpD,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,SAAA;AAAA,cACP,KAAA,EAAO,IAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACpD,WAAA,EAAa;AAAA;AAAA,WACf;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,YAAA;AAAA,cACP,KAAA,EAAO,OAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACvD,WAAA,EAAa,kBAAA;AAAA,cACb,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EACE,+BACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,gBAAA,WAAA;AAAA,gBAAa,GAAA;AAAA,gCACd,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACpD,cAAA;AAAA,kBAAe;AAAA,iBAAA,EACnB;AAAA,eAAA,EACF,CAAA,GAEA,WAAA;AAAA,cAGJ,IAAA,EAAK,UAAA;AAAA,cACL,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACtD,WAAA,EAAa,eAAe,oBAAA,GAAQ,cAAA;AAAA,cACpC,YAAA,EAAa,cAAA;AAAA,cACb,IAAA,EACE,UAAA,mBACE,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACd,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,gBACxC;AAAA,eAAA,EACH,CAAA,GACE;AAAA;AAAA,WAER;AAAA,UACC,QAAA;AAAA,UACA,KAAA,uBACE,GAAA,EAAA,EAAE,IAAA,EAAK,SAAQ,SAAA,EAAU,6CAAA,EACvB,iBACH,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF","file":"provider-form.js","sourcesContent":["import * as React from 'react'\nimport { KeyRound } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Input } from '../input/Input'\n\nexport interface ProviderFormProps extends React.ComponentProps<'div'> {\n name: string\n onNameChange: (value: string) => void\n baseUrl: string\n onBaseUrlChange: (value: string) => void\n apiKey: string\n onApiKeyChange: (value: string) => void\n namePlaceholder?: string\n baseUrlPlaceholder?: string\n nameLabel?: string\n baseUrlLabel?: string\n apiKeyLabel?: string\n /** Hint under the key field; apps mention keyring storage here. */\n apiKeyHelp?: string\n /** The provider already stores a key (write-only field shows no value). */\n hasStoredKey?: boolean\n storedKeyLabel?: string\n keyPlaceholder?: string\n error?: string\n children?: React.ReactNode\n}\n\n/**\n * Standard provider credential fields: name, base URL and a **write-only**\n * masked API key (`onChange` only — the library never renders a stored key;\n * keyring/storage is the app's business, ADR-006).\n */\nexport const ProviderForm = React.forwardRef<HTMLDivElement, ProviderFormProps>(\n function ProviderForm(\n {\n name,\n onNameChange,\n baseUrl,\n onBaseUrlChange,\n apiKey,\n onApiKeyChange,\n namePlaceholder = 'Provider name',\n baseUrlPlaceholder = 'https://api.example.com/v1',\n nameLabel = 'Name',\n baseUrlLabel = 'API base URL',\n apiKeyLabel = 'API key',\n apiKeyHelp,\n hasStoredKey = false,\n storedKeyLabel = 'Stored — leave empty to keep',\n keyPlaceholder = 'sk-…',\n error,\n children,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n data-as=\"provider-form\"\n className={cn('flex w-full flex-col gap-4', className)}\n {...props}\n >\n <Input\n label={nameLabel}\n value={name}\n onChange={(event) => onNameChange(event.target.value)}\n placeholder={namePlaceholder}\n />\n <Input\n label={baseUrlLabel}\n value={baseUrl}\n onChange={(event) => onBaseUrlChange(event.target.value)}\n placeholder={baseUrlPlaceholder}\n className=\"font-mono\"\n />\n <Input\n label={\n hasStoredKey ? (\n <>\n {apiKeyLabel}{' '}\n <span className=\"font-normal text-[var(--as-muted-fg)]\">\n ({storedKeyLabel})\n </span>\n </>\n ) : (\n apiKeyLabel\n )\n }\n type=\"password\"\n value={apiKey}\n onChange={(event) => onApiKeyChange(event.target.value)}\n placeholder={hasStoredKey ? '•••' : keyPlaceholder}\n autoComplete=\"new-password\"\n hint={\n apiKeyHelp ? (\n <span className=\"inline-flex items-center gap-1\">\n <KeyRound className=\"size-3\" aria-hidden />\n {apiKeyHelp}\n </span>\n ) : undefined\n }\n />\n {children}\n {error ? (\n <p role=\"alert\" className=\"text-sm font-medium text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n )\n },\n)\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"provider-form.js"}
package/dist/range-bar.js CHANGED
@@ -1,3 +1,3 @@
1
- export { RangeBar } from './chunk-5AVBKEDQ.js';
1
+ export { RangeBar } from './chunk-PFAH25VU.js';
2
2
  //# sourceMappingURL=range-bar.js.map
3
3
  //# sourceMappingURL=range-bar.js.map
@@ -1,74 +1,3 @@
1
- import { cn } from './chunk-BLJWR4ZV.js';
2
- import * as React from 'react';
3
- import { jsxs, jsx } from 'react/jsx-runtime';
4
-
5
- var SettingsShell = React.forwardRef(
6
- function SettingsShell2({ nav, active, onNavigate, header, children, className, navClassName }, ref) {
7
- const HeaderIcon = header?.icon;
8
- return /* @__PURE__ */ jsxs(
9
- "div",
10
- {
11
- ref,
12
- "data-as": "settings-shell",
13
- className: cn("grid grid-cols-1 gap-8 lg:grid-cols-4", className),
14
- children: [
15
- /* @__PURE__ */ jsx("nav", { className: "lg:col-span-1", "aria-label": "Settings sections", children: /* @__PURE__ */ jsxs(
16
- "div",
17
- {
18
- className: cn(
19
- "space-y-1 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-3 lg:sticky lg:top-24",
20
- navClassName
21
- ),
22
- children: [
23
- header ? /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center gap-2.5 border-b border-[var(--as-border)] px-3 py-2", children: [
24
- HeaderIcon ? /* @__PURE__ */ jsx(
25
- HeaderIcon,
26
- {
27
- className: "size-5 shrink-0 text-[var(--as-primary)]",
28
- "aria-hidden": true
29
- }
30
- ) : null,
31
- /* @__PURE__ */ jsx("span", { className: "truncate text-sm font-bold text-[var(--as-fg)]", children: header.title })
32
- ] }) : null,
33
- nav.map(({ id, label, description, icon: Icon }) => {
34
- const isActive = id === active;
35
- return /* @__PURE__ */ jsxs(
36
- "button",
37
- {
38
- type: "button",
39
- "aria-current": isActive ? "page" : void 0,
40
- onClick: () => onNavigate(id),
41
- className: cn(
42
- "flex w-full cursor-pointer items-start rounded-[var(--as-radius)] px-3 py-2.5 text-left text-sm transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
43
- isActive ? "bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] font-bold text-[var(--as-primary)]" : "font-medium text-[var(--as-fg)] hover:bg-[var(--as-muted)]"
44
- ),
45
- children: [
46
- Icon ? /* @__PURE__ */ jsx(
47
- Icon,
48
- {
49
- className: "mr-3 mt-0.5 size-4 shrink-0",
50
- "aria-hidden": true
51
- }
52
- ) : null,
53
- /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col", children: [
54
- /* @__PURE__ */ jsx("span", { className: "truncate", children: label }),
55
- description ? /* @__PURE__ */ jsx("span", { className: "text-[11px] font-normal text-[var(--as-muted-fg)]", children: description }) : null
56
- ] })
57
- ]
58
- },
59
- id
60
- );
61
- })
62
- ]
63
- }
64
- ) }),
65
- /* @__PURE__ */ jsx("div", { className: "min-w-0 lg:col-span-3", children })
66
- ]
67
- }
68
- );
69
- }
70
- );
71
-
72
- export { SettingsShell };
1
+ export { SettingsShell } from './chunk-AHLNXCP2.js';
73
2
  //# sourceMappingURL=settings-shell.js.map
74
3
  //# sourceMappingURL=settings-shell.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/settings-shell/SettingsShell.tsx"],"names":["SettingsShell"],"mappings":";;;;AAqBO,IAAM,aAAA,GAAsB,KAAA,CAAA,UAAA;AAAA,EACjC,SAASA,cAAAA,CACP,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,YAAA,EAAa,EACrE,GAAA,EACA;AACA,IAAA,MAAM,aAAa,MAAA,EAAQ,IAAA;AAC3B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,gBAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA;AAAA,QAEhE,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,YAAA,EAAW,mBAAA,EACxC,QAAA,kBAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,gIAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,MAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,UAAA,mBACC,GAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,0CAAA;AAAA,sBACV,aAAA,EAAW;AAAA;AAAA,mBACb,GACE,IAAA;AAAA,kCACJ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACb,iBAAO,KAAA,EACV;AAAA,iBAAA,EACF,CAAA,GACE,IAAA;AAAA,gBACH,GAAA,CAAI,IAAI,CAAC,EAAE,IAAI,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,IAAA,EAAK,KAAM;AACnD,kBAAA,MAAM,WAAW,EAAA,KAAO,MAAA;AACxB,kBAAA,uBACE,IAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,sBAClC,OAAA,EAAS,MAAM,UAAA,CAAW,EAAE,CAAA;AAAA,sBAC5B,SAAA,EAAW,EAAA;AAAA,wBACT,uNAAA;AAAA,wBACA,WACI,8FAAA,GACA;AAAA,uBACN;AAAA,sBAEC,QAAA,EAAA;AAAA,wBAAA,IAAA,mBACC,GAAA;AAAA,0BAAC,IAAA;AAAA,0BAAA;AAAA,4BACC,SAAA,EAAU,6BAAA;AAAA,4BACV,aAAA,EAAW;AAAA;AAAA,yBACb,GACE,IAAA;AAAA,wCACJ,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACd,QAAA,EAAA;AAAA,0CAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACjC,8BACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACb,uBACH,CAAA,GACE;AAAA,yBAAA,EACN;AAAA;AAAA,qBAAA;AAAA,oBAxBK;AAAA,mBAyBP;AAAA,gBAEJ,CAAC;AAAA;AAAA;AAAA,WACH,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAS;AAAA;AAAA;AAAA,KACnD;AAAA,EAEJ;AACF","file":"settings-shell.js","sourcesContent":["import * as React from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface SettingsNavItem {\n id: string\n label: string\n description?: string\n icon?: LucideIcon\n}\n\nexport interface SettingsShellProps {\n nav: SettingsNavItem[]\n active: string\n onNavigate: (id: string) => void\n header?: { icon?: LucideIcon; title: string }\n children: React.ReactNode\n className?: string\n navClassName?: string\n}\n\nexport const SettingsShell = React.forwardRef<HTMLDivElement, SettingsShellProps>(\n function SettingsShell(\n { nav, active, onNavigate, header, children, className, navClassName },\n ref,\n ) {\n const HeaderIcon = header?.icon\n return (\n <div\n ref={ref}\n data-as=\"settings-shell\"\n className={cn('grid grid-cols-1 gap-8 lg:grid-cols-4', className)}\n >\n <nav className=\"lg:col-span-1\" aria-label=\"Settings sections\">\n <div\n className={cn(\n 'space-y-1 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-3 lg:sticky lg:top-24',\n navClassName,\n )}\n >\n {header ? (\n <div className=\"mb-2 flex items-center gap-2.5 border-b border-[var(--as-border)] px-3 py-2\">\n {HeaderIcon ? (\n <HeaderIcon\n className=\"size-5 shrink-0 text-[var(--as-primary)]\"\n aria-hidden\n />\n ) : null}\n <span className=\"truncate text-sm font-bold text-[var(--as-fg)]\">\n {header.title}\n </span>\n </div>\n ) : null}\n {nav.map(({ id, label, description, icon: Icon }) => {\n const isActive = id === active\n return (\n <button\n key={id}\n type=\"button\"\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onNavigate(id)}\n className={cn(\n 'flex w-full cursor-pointer items-start rounded-[var(--as-radius)] px-3 py-2.5 text-left text-sm transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n isActive\n ? 'bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] font-bold text-[var(--as-primary)]'\n : 'font-medium text-[var(--as-fg)] hover:bg-[var(--as-muted)]',\n )}\n >\n {Icon ? (\n <Icon\n className=\"mr-3 mt-0.5 size-4 shrink-0\"\n aria-hidden\n />\n ) : null}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{label}</span>\n {description ? (\n <span className=\"text-[11px] font-normal text-[var(--as-muted-fg)]\">\n {description}\n </span>\n ) : null}\n </span>\n </button>\n )\n })}\n </div>\n </nav>\n <div className=\"min-w-0 lg:col-span-3\">{children}</div>\n </div>\n )\n },\n)\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"settings-shell.js"}