@nocoo/basalt 2.0.3 → 2.1.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/README.md +134 -15
- package/ai/COMPATIBILITY.md +180 -0
- package/ai/INTEGRATION.md +1760 -0
- package/ai/RECIPES.md +161 -0
- package/ai/USAGE.md +99 -0
- package/ai/registry.json +38099 -0
- package/ai/sources.json +10 -0
- package/dist/assets/brand-mark.d.ts +1 -0
- package/dist/assets/brand-mark.js +7 -0
- package/dist/assets/brand-mark.js.map +1 -0
- package/dist/charts/area.d.ts +58 -5
- package/dist/charts/area.js +20 -12
- package/dist/charts/area.js.map +1 -1
- package/dist/charts/bar.d.ts +54 -5
- package/dist/charts/bar.js +16 -10
- package/dist/charts/bar.js.map +1 -1
- package/dist/charts/bullet.d.ts +18 -1
- package/dist/charts/bullet.js +6 -3
- package/dist/charts/bullet.js.map +1 -1
- package/dist/charts/charts.d.ts +58 -5
- package/dist/charts/charts.js +13 -2
- package/dist/charts/charts.js.map +1 -1
- package/dist/charts/config.d.ts +7 -0
- package/dist/charts/config.js +5 -1
- package/dist/charts/config.js.map +1 -1
- package/dist/charts/custom-chart.d.ts +58 -5
- package/dist/charts/custom-chart.js +13 -2
- package/dist/charts/custom-chart.js.map +1 -1
- package/dist/charts/donut.d.ts +18 -1
- package/dist/charts/donut.js +6 -3
- package/dist/charts/donut.js.map +1 -1
- package/dist/charts/frame.d.ts +40 -3
- package/dist/charts/frame.js +55 -28
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/funnel.d.ts +18 -1
- package/dist/charts/funnel.js +5 -1
- package/dist/charts/funnel.js.map +1 -1
- package/dist/charts/gauge.d.ts +18 -1
- package/dist/charts/gauge.js +38 -20
- package/dist/charts/gauge.js.map +1 -1
- package/dist/charts/grouped-bar.d.ts +54 -5
- package/dist/charts/grouped-bar.js +16 -10
- package/dist/charts/grouped-bar.js.map +1 -1
- package/dist/charts/heatmap-calendar.d.ts +61 -0
- package/dist/charts/heatmap-calendar.js +287 -96
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.d.ts +99 -0
- package/dist/charts/heatmap-matrix.js +249 -0
- package/dist/charts/heatmap-matrix.js.map +1 -0
- package/dist/charts/line.d.ts +66 -5
- package/dist/charts/line.js +37 -30
- package/dist/charts/line.js.map +1 -1
- package/dist/charts/palette.d.ts +1 -0
- package/dist/charts/palette.js +7 -1
- package/dist/charts/palette.js.map +1 -1
- package/dist/charts/radar.d.ts +18 -1
- package/dist/charts/radar.js +26 -19
- package/dist/charts/radar.js.map +1 -1
- package/dist/charts/sankey.d.ts +18 -1
- package/dist/charts/sankey.js +4 -1
- package/dist/charts/sankey.js.map +1 -1
- package/dist/charts/series.d.ts +5 -7
- package/dist/charts/series.js.map +1 -1
- package/dist/charts/slot-bar.d.ts +38 -6
- package/dist/charts/slot-bar.js +5 -2
- package/dist/charts/slot-bar.js.map +1 -1
- package/dist/charts/sparkline.d.ts +35 -5
- package/dist/charts/sparkline.js +22 -18
- package/dist/charts/sparkline.js.map +1 -1
- package/dist/charts/stacked-bar.d.ts +58 -5
- package/dist/charts/stacked-bar.js +19 -12
- package/dist/charts/stacked-bar.js.map +1 -1
- package/dist/charts/stat-card.d.ts +51 -1
- package/dist/charts/stat-card.js +66 -39
- package/dist/charts/stat-card.js.map +1 -1
- package/dist/charts/timeline.d.ts +3 -0
- package/dist/charts/timeline.js +4 -3
- package/dist/charts/timeline.js.map +1 -1
- package/dist/charts/timeseries.d.ts +58 -5
- package/dist/charts/timeseries.js +13 -2
- package/dist/charts/timeseries.js.map +1 -1
- package/dist/charts/tooltip.d.ts +57 -0
- package/dist/charts/tooltip.js +119 -2
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.d.ts +117 -2
- package/dist/components/accordion.js +20 -13
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.d.ts +131 -13
- package/dist/components/alert-dialog.js +12 -9
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/app-header.js +18 -17
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.js +15 -14
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/autocomplete.d.ts +4 -0
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/avatar.d.ts +76 -3
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/badge.d.ts +15 -1
- package/dist/components/badge.js +17 -16
- package/dist/components/badge.js.map +1 -1
- package/dist/components/banner.d.ts +88 -2
- package/dist/components/banner.js +41 -40
- package/dist/components/banner.js.map +1 -1
- package/dist/components/basalt-mark.js +14 -8
- package/dist/components/basalt-mark.js.map +1 -1
- package/dist/components/battery-meter.d.ts +10 -0
- package/dist/components/battery-meter.js +56 -0
- package/dist/components/battery-meter.js.map +1 -0
- package/dist/components/breadcrumbs.d.ts +27 -7
- package/dist/components/breadcrumbs.js +21 -20
- package/dist/components/breadcrumbs.js.map +1 -1
- package/dist/components/button.d.ts +48 -2
- package/dist/components/button.js +87 -36
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.d.ts +7 -0
- package/dist/components/chat-bubble.js +14 -13
- package/dist/components/chat-bubble.js.map +1 -1
- package/dist/components/chat-composer.d.ts +7 -3
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/chat-header.d.ts +6 -1
- package/dist/components/chat-header.js +17 -16
- package/dist/components/chat-header.js.map +1 -1
- package/dist/components/chat-inbox.d.ts +7 -2
- package/dist/components/chat-inbox.js.map +1 -1
- package/dist/components/checkbox.js +84 -53
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/clipboard-text.d.ts +13 -2
- package/dist/components/clipboard-text.js +4 -4
- package/dist/components/clipboard-text.js.map +1 -1
- package/dist/components/collapsible.d.ts +58 -15
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/command-palette.d.ts +151 -61
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/confirm-dialog.d.ts +1 -1
- package/dist/components/confirm-dialog.js +6 -4
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-menu.d.ts +210 -2
- package/dist/components/context-menu.js +7 -4
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.d.ts +40 -2
- package/dist/components/data-table.js +168 -120
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.d.ts +53 -2
- package/dist/components/date-picker.js +387 -219
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.d.ts +7 -1
- package/dist/components/delete-resource.js +22 -18
- package/dist/components/delete-resource.js.map +1 -1
- package/dist/components/description-list.js +16 -15
- package/dist/components/description-list.js.map +1 -1
- package/dist/components/dialog.d.ts +141 -12
- package/dist/components/dialog.js +42 -38
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/dock.d.ts +1 -1
- package/dist/components/dock.js +39 -58
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.d.ts +229 -15
- package/dist/components/dropdown-menu.js +9 -6
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.d.ts +33 -0
- package/dist/components/editable-nav-item.js +90 -0
- package/dist/components/editable-nav-item.js.map +1 -0
- package/dist/components/empty.d.ts +22 -2
- package/dist/components/empty.js +22 -13
- package/dist/components/empty.js.map +1 -1
- package/dist/components/field.js +31 -30
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-dropzone.d.ts +37 -0
- package/dist/components/file-dropzone.js +103 -0
- package/dist/components/file-dropzone.js.map +1 -0
- package/dist/components/filter-bar.d.ts +34 -0
- package/dist/components/filter-bar.js +52 -0
- package/dist/components/filter-bar.js.map +1 -0
- package/dist/components/flow.js +19 -18
- package/dist/components/flow.js.map +1 -1
- package/dist/components/grid.d.ts +3 -1
- package/dist/components/grid.js.map +1 -1
- package/dist/components/hover-card.d.ts +111 -1
- package/dist/components/hover-card.js +9 -6
- package/dist/components/hover-card.js.map +1 -1
- package/dist/components/icon-picker.d.ts +34 -0
- package/dist/components/icon-picker.js +77 -0
- package/dist/components/icon-picker.js.map +1 -0
- package/dist/components/inline-editable.d.ts +46 -0
- package/dist/components/inline-editable.js +124 -0
- package/dist/components/inline-editable.js.map +1 -0
- package/dist/components/input-area.js +3 -3
- package/dist/components/input-group.js +7 -7
- package/dist/components/input.js +3 -3
- package/dist/components/label.js +18 -17
- package/dist/components/label.js.map +1 -1
- package/dist/components/layer-card.d.ts +10 -2
- package/dist/components/layer-card.js +71 -68
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/loader.d.ts +10 -2
- package/dist/components/loader.js.map +1 -1
- package/dist/components/menu-bar.d.ts +174 -6
- package/dist/components/menu-bar.js +33 -29
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/meter.d.ts +27 -2
- package/dist/components/meter.js.map +1 -1
- package/dist/components/multi-select.d.ts +64 -0
- package/dist/components/multi-select.js +218 -0
- package/dist/components/multi-select.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +88 -5
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/overlay.js +6 -5
- package/dist/components/overlay.js.map +1 -1
- package/dist/components/page-header.js +23 -21
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/pagination.js +7 -7
- package/dist/components/popover.d.ts +136 -16
- package/dist/components/popover.js +32 -28
- package/dist/components/popover.js.map +1 -1
- package/dist/components/radio.js +38 -37
- package/dist/components/radio.js.map +1 -1
- package/dist/components/resource-list.d.ts +26 -1
- package/dist/components/resource-list.js +28 -15
- package/dist/components/resource-list.js.map +1 -1
- package/dist/components/responsive-master-detail.d.ts +27 -0
- package/dist/components/responsive-master-detail.js +85 -0
- package/dist/components/responsive-master-detail.js.map +1 -0
- package/dist/components/section-rule.js +23 -22
- package/dist/components/section-rule.js.map +1 -1
- package/dist/components/select.d.ts +27 -3
- package/dist/components/select.js +11 -11
- package/dist/components/select.js.map +1 -1
- package/dist/components/sheet.d.ts +115 -11
- package/dist/components/sheet.js +37 -30
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/sidebar.d.ts +109 -17
- package/dist/components/sidebar.js +109 -108
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.d.ts +22 -2
- package/dist/components/skeleton-line.js.map +1 -1
- package/dist/components/slider.d.ts +61 -1
- package/dist/components/slider.js +31 -15
- package/dist/components/slider.js.map +1 -1
- package/dist/components/stat-strip.js +16 -15
- package/dist/components/stat-strip.js.map +1 -1
- package/dist/components/switch.js +78 -47
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table-of-contents.js +18 -17
- package/dist/components/table-of-contents.js.map +1 -1
- package/dist/components/table-pager.js +20 -19
- package/dist/components/table-pager.js.map +1 -1
- package/dist/components/table.d.ts +9 -3
- package/dist/components/table.js +19 -18
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +29 -22
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.d.ts +58 -0
- package/dist/components/tag-badge.js +72 -0
- package/dist/components/tag-badge.js.map +1 -0
- package/dist/components/tag-color-picker.d.ts +20 -0
- package/dist/components/tag-color-picker.js +42 -0
- package/dist/components/tag-color-picker.js.map +1 -0
- package/dist/components/text.js +17 -16
- package/dist/components/text.js.map +1 -1
- package/dist/components/toast.d.ts +173 -3
- package/dist/components/toast.js +1 -1
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.d.ts +88 -2
- package/dist/components/toggle-group.js +32 -31
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.d.ts +35 -2
- package/dist/components/toggle.js +12 -11
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tooltip.d.ts +144 -6
- package/dist/components/tooltip.js +9 -6
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/typeahead-field.js +193 -132
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.d.ts +51 -0
- package/dist/components/upload-queue.js +116 -0
- package/dist/components/upload-queue.js.map +1 -0
- package/dist/providers/accent.d.ts +46 -2
- package/dist/providers/accent.js +358 -172
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/link.d.ts +14 -4
- package/dist/providers/link.js.map +1 -1
- package/dist/providers/theme.d.ts +38 -2
- package/dist/providers/theme.js +160 -27
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/base.css +83 -0
- package/dist/styles/standalone.css +711 -120
- package/dist/styles/tailwind.css +21 -7
- package/dist/styles/tokens.css +145 -91
- package/dist/utils/control-surface.d.ts +2 -1
- package/dist/utils/control-surface.js +4 -4
- package/dist/utils/control-surface.js.map +1 -1
- package/dist/utils/selection-indicator.js +2 -2
- package/dist/utils/selection-indicator.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-editable.js","names":[],"sources":["../../src/components/inline-editable.tsx"],"sourcesContent":["import { Pencil } from \"lucide-react\";\nimport { useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\n\nexport type InlineEditableChangeReason = \"edit\" | \"save\" | \"blur\" | \"cancel\";\nexport interface InlineEditableProps {\n\t/** Accessible name of the edited field. */\n\tlabel: string;\n\t/** Committed value, owned by the application. */\n\tvalue: string;\n\t/** Persist the draft. Return a promise to keep the editor pending; rejection preserves the draft. */\n\tonSave: (value: string) => void | Promise<void>;\n\t/** Controlled edit mode. */\n\tediting?: boolean;\n\t/** Initial uncontrolled edit mode. @default false */\n\tdefaultEditing?: boolean;\n\t/** Edit-mode requests with their cause, including blur that must not steal focus. */\n\tonEditingChange?: (editing: boolean, reason: InlineEditableChangeReason) => void;\n\t/** External pending state. @default false */\n\tpending?: boolean;\n\t/** Application-owned error message. */\n\terror?: string;\n\t/** Disable editing and saving. @default false */\n\tdisabled?: boolean;\n\t/** Reject an empty draft. @default true */\n\trequired?: boolean;\n\t/** Trim whitespace before validation and save. @default true */\n\ttrim?: boolean;\n\t/** Commit when focus leaves the whole editor, including its actions. @default true */\n\tsaveOnBlur?: boolean;\n\t/** Return a validation message to retain the draft without invoking onSave. */\n\tvalidate?: (value: string) => string | undefined;\n\t/** Empty committed-value prompt. @default \"Untitled\" */\n\tplaceholder?: string;\n\t/** Edit action label prefix. @default \"Edit\" */\n\teditLabel?: string;\n\t/** Save action text. @default \"Save\" */\n\tsaveLabel?: string;\n\t/** Cancel action text. @default \"Cancel\" */\n\tcancelLabel?: string;\n\t/** Pending announcement. @default \"Saving…\" */\n\tpendingLabel?: string;\n\t/** Empty-value validation message. @default \"Enter a value.\" */\n\trequiredLabel?: string;\n\t/** Fallback for non-Error rejections. @default \"Could not save changes.\" */\n\terrorLabel?: string;\n\t/** Additional root classes. */\n\tclassName?: string;\n}\n\nexport function InlineEditable({\n\tlabel,\n\tvalue,\n\tonSave,\n\tediting,\n\tdefaultEditing = false,\n\tonEditingChange,\n\tpending = false,\n\terror,\n\tdisabled = false,\n\trequired = true,\n\ttrim = true,\n\tsaveOnBlur = true,\n\tvalidate,\n\tplaceholder = \"Untitled\",\n\teditLabel = \"Edit\",\n\tsaveLabel = \"Save\",\n\tcancelLabel = \"Cancel\",\n\tpendingLabel = \"Saving…\",\n\trequiredLabel = \"Enter a value.\",\n\terrorLabel = \"Could not save changes.\",\n\tclassName,\n}: InlineEditableProps) {\n\tconst [localEditing, setLocalEditing] = useState(defaultEditing);\n\tconst [draft, setDraft] = useState(value);\n\tconst [saving, setSaving] = useState(false);\n\tconst [failure, setFailure] = useState<string>();\n\tconst input = useRef<HTMLInputElement>(null);\n\tconst trigger = useRef<HTMLButtonElement>(null);\n\tconst mounted = useRef(true);\n\tconst operation = useRef(0);\n\tconst locked = useRef(false);\n\tconst restore = useRef(false);\n\tconst id = useId();\n\tconst isEditing = editing ?? localEditing;\n\tconst busy = pending || saving;\n\tconst message = error ?? failure;\n\tuseEffect(() => {\n\t\tmounted.current = true;\n\t\treturn () => {\n\t\t\tmounted.current = false;\n\t\t\toperation.current += 1;\n\t\t};\n\t}, []);\n\tuseLayoutEffect(() => {\n\t\tif (isEditing && !disabled) {\n\t\t\tinput.current?.focus();\n\t\t\tinput.current?.select();\n\t\t} else if (!isEditing && restore.current) {\n\t\t\trestore.current = false;\n\t\t\ttrigger.current?.focus();\n\t\t}\n\t}, [isEditing, disabled]);\n\tuseEffect(() => {\n\t\tif (!isEditing) {\n\t\t\toperation.current += 1;\n\t\t\tlocked.current = false;\n\t\t\tsetSaving(false);\n\t\t\tsetDraft(value);\n\t\t\tsetFailure(undefined);\n\t\t}\n\t}, [isEditing, value]);\n\tfunction changeEditing(next: boolean, reason: InlineEditableChangeReason) {\n\t\tif (editing === undefined) setLocalEditing(next);\n\t\tonEditingChange?.(next, reason);\n\t}\n\tfunction finish(reason: InlineEditableChangeReason) {\n\t\trestore.current = reason !== \"blur\";\n\t\tchangeEditing(false, reason);\n\t}\n\tasync function save(reason: \"save\" | \"blur\") {\n\t\tif (!isEditing || disabled || busy || locked.current) return;\n\t\tconst next = trim ? draft.trim() : draft;\n\t\tconst invalid = required && !next ? requiredLabel : validate?.(next);\n\t\tif (invalid) {\n\t\t\tsetFailure(invalid);\n\t\t\treturn;\n\t\t}\n\t\tif (next === value) {\n\t\t\tfinish(reason);\n\t\t\treturn;\n\t\t}\n\t\tlocked.current = true;\n\t\tsetSaving(true);\n\t\tsetFailure(undefined);\n\t\tconst ticket = ++operation.current;\n\t\ttry {\n\t\t\tawait onSave(next);\n\t\t\tif (mounted.current && ticket === operation.current) finish(reason);\n\t\t} catch (cause) {\n\t\t\tif (mounted.current && ticket === operation.current)\n\t\t\t\tsetFailure(cause instanceof Error && cause.message ? cause.message : errorLabel);\n\t\t} finally {\n\t\t\tif (mounted.current && ticket === operation.current) {\n\t\t\t\tlocked.current = false;\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t}\n\t}\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\taria-label={label}\n\t\t\taria-busy={busy}\n\t\t\tclassName={cn(BASALT_UI_CLASS, \"min-w-0 space-y-2\", className)}\n\t\t\tonBlur={(event) => {\n\t\t\t\tif (saveOnBlur && !event.currentTarget.contains(event.relatedTarget)) void save(\"blur\");\n\t\t\t}}\n\t\t>\n\t\t\t{isEditing ? (\n\t\t\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={input}\n\t\t\t\t\t\taria-label={label}\n\t\t\t\t\t\tclassName=\"min-w-0 flex-1 basis-32\"\n\t\t\t\t\t\tvalue={draft}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\treadOnly={busy}\n\t\t\t\t\t\taria-invalid={!!message}\n\t\t\t\t\t\taria-describedby={message ? `${id}-error` : undefined}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\tsetDraft(event.target.value);\n\t\t\t\t\t\t\tsetFailure(undefined);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.nativeEvent.isComposing) return;\n\t\t\t\t\t\t\tif (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tvoid save(\"save\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"Escape\" && !busy) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\tsetDraft(value);\n\t\t\t\t\t\t\t\tsetFailure(undefined);\n\t\t\t\t\t\t\t\tfinish(\"cancel\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button size=\"sm\" disabled={disabled || busy} onClick={() => void save(\"save\")}>\n\t\t\t\t\t\t{saveLabel}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetDraft(value);\n\t\t\t\t\t\t\tsetFailure(undefined);\n\t\t\t\t\t\t\tfinish(\"cancel\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{cancelLabel}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<button\n\t\t\t\t\tref={trigger}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={disabled || pending}\n\t\t\t\t\taria-label={`${editLabel} ${label}`}\n\t\t\t\t\tclassName=\"group flex max-w-full items-center gap-2 rounded-basalt-md px-1 py-1 text-left text-sm hover:bg-basalt-accent focus-visible:outline-2 focus-visible:outline-basalt-ring disabled:opacity-50\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetDraft(value);\n\t\t\t\t\t\tsetFailure(undefined);\n\t\t\t\t\t\tchangeEditing(true, \"edit\");\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span className={cn(\"min-w-0 break-words\", !value && \"text-basalt-muted-foreground\")}>\n\t\t\t\t\t\t{value || placeholder}\n\t\t\t\t\t</span>\n\t\t\t\t\t<Pencil className=\"size-3.5 shrink-0 text-basalt-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t\t{busy && (\n\t\t\t\t<p role=\"status\" className=\"text-xs text-basalt-muted-foreground\">\n\t\t\t\t\t{pendingLabel}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{message && (\n\t\t\t\t<p id={`${id}-error`} role=\"alert\" className=\"text-xs text-basalt-destructive\">\n\t\t\t\t\t{message}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { controlSurfaceClass as t } from "../utils/control-surface.js";
|
|
4
|
+
import { FOCUS_BORDER as n } from "./overlay.js";
|
|
5
5
|
import * as r from "react";
|
|
6
6
|
import { jsx as i } from "react/jsx-runtime";
|
|
7
7
|
//#region src/components/input-area.tsx
|
|
@@ -16,7 +16,7 @@ var a = {
|
|
|
16
16
|
"data-lpignore": "true"
|
|
17
17
|
}, s = r.forwardRef(({ className: r, size: s = "default", passwordManagerIgnore: c = !1, ...l }, u) => /* @__PURE__ */ i("textarea", {
|
|
18
18
|
ref: u,
|
|
19
|
-
className:
|
|
19
|
+
className: t(e("flex w-full text-basalt-foreground shadow-xs placeholder:text-basalt-muted-foreground disabled:cursor-not-allowed disabled:border-transparent disabled:text-basalt-muted-foreground/40", a[s], n, "aria-invalid:border-basalt-destructive aria-invalid:focus-visible:border-basalt-destructive", c && "keeper-ignore", r)),
|
|
20
20
|
...l,
|
|
21
21
|
...c ? o : {}
|
|
22
22
|
}));
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { controlSurfaceClass as t } from "../utils/control-surface.js";
|
|
4
|
+
import { Button as n } from "./button.js";
|
|
5
5
|
import { Input as r } from "./input.js";
|
|
6
6
|
import * as i from "react";
|
|
7
7
|
import { jsx as a } from "react/jsx-runtime";
|
|
8
8
|
//#region src/components/input-group.tsx
|
|
9
|
-
var o = i.createContext(!1), s = i.forwardRef(({ className:
|
|
9
|
+
var o = i.createContext(!1), s = i.forwardRef(({ className: n, disabled: r, onClick: i, children: s, ...c }, l) => /* @__PURE__ */ a(o.Provider, {
|
|
10
10
|
value: !!r,
|
|
11
11
|
children: /* @__PURE__ */ a("div", {
|
|
12
12
|
ref: l,
|
|
@@ -14,7 +14,7 @@ var o = i.createContext(!1), s = i.forwardRef(({ className: t, disabled: r, onCl
|
|
|
14
14
|
"data-disabled": r ? "" : void 0,
|
|
15
15
|
"aria-disabled": r || void 0,
|
|
16
16
|
inert: r || void 0,
|
|
17
|
-
className:
|
|
17
|
+
className: t(e("flex h-9 w-full items-center shadow-xs", "[&>:first-child]:rounded-l-basalt-md [&>:last-child]:rounded-r-basalt-md", "outline-hidden focus-within:border-basalt-ring", "has-[[data-slot=input-group-addon-start]]:[&_input]:pl-2", "has-[[data-slot=input-group-addon-end]]:[&_input]:pr-2", "has-[[data-slot=input-group-suffix]]:[&_input]:flex-none", "has-[[data-slot=input-group-suffix]]:[&_input]:[field-sizing:content]", "has-[[data-slot=input-group-suffix]]:[&_input]:pr-0", "data-[disabled]:pointer-events-none data-[disabled]:opacity-50", n)),
|
|
18
18
|
onClick: (e) => {
|
|
19
19
|
i?.(e), !(e.defaultPrevented || r) && (e.target.closest("input, textarea, button, a") || e.currentTarget.querySelector("input")?.focus());
|
|
20
20
|
},
|
|
@@ -54,14 +54,14 @@ function u({ className: t, children: n, ...r }) {
|
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
u.displayName = "InputGroup.Suffix";
|
|
57
|
-
var d = i.forwardRef(({ className:
|
|
57
|
+
var d = i.forwardRef(({ className: t, variant: r = "ghost", size: s = "icon", disabled: c, ...l }, u) => {
|
|
58
58
|
let d = i.useContext(o);
|
|
59
|
-
return /* @__PURE__ */ a(
|
|
59
|
+
return /* @__PURE__ */ a(n, {
|
|
60
60
|
ref: u,
|
|
61
61
|
variant: r,
|
|
62
62
|
size: s,
|
|
63
63
|
disabled: c || d,
|
|
64
|
-
className: e("h-7 w-7 shrink-0 rounded-basalt-sm",
|
|
64
|
+
className: e("h-7 w-7 shrink-0 rounded-basalt-sm", t),
|
|
65
65
|
...l
|
|
66
66
|
});
|
|
67
67
|
});
|
package/dist/components/input.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { controlSurfaceClass as t } from "../utils/control-surface.js";
|
|
4
|
+
import { FOCUS_BORDER as n } from "./overlay.js";
|
|
5
5
|
import * as r from "react";
|
|
6
6
|
import { jsx as i } from "react/jsx-runtime";
|
|
7
7
|
//#region src/components/input.tsx
|
|
@@ -16,7 +16,7 @@ var a = {
|
|
|
16
16
|
"data-lpignore": "true"
|
|
17
17
|
}, s = r.forwardRef(({ className: r, type: s, size: c = "default", passwordManagerIgnore: l = !1, ...u }, d) => /* @__PURE__ */ i("input", {
|
|
18
18
|
type: s,
|
|
19
|
-
className:
|
|
19
|
+
className: t(e("flex w-full text-basalt-foreground shadow-xs file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-basalt-muted-foreground disabled:cursor-not-allowed disabled:border-transparent disabled:text-basalt-muted-foreground/40", a[c], n, "aria-invalid:border-basalt-destructive aria-invalid:focus-visible:border-basalt-destructive", l && "keeper-ignore", r)),
|
|
20
20
|
ref: d,
|
|
21
21
|
...u,
|
|
22
22
|
...l ? o : {}
|
package/dist/components/label.js
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
3
|
+
import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
|
|
4
|
+
import { Tooltip as n, TooltipContent as r, TooltipProvider as i, TooltipTrigger as a } from "./tooltip.js";
|
|
5
|
+
import * as o from "react";
|
|
6
|
+
import { Info as s } from "lucide-react";
|
|
7
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
8
|
+
import * as u from "@radix-ui/react-label";
|
|
8
9
|
//#region src/components/label.tsx
|
|
9
|
-
var
|
|
10
|
-
ref:
|
|
11
|
-
className: e("inline-flex items-center gap-1 text-sm font-medium leading-none text-basalt-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
12
|
-
...
|
|
10
|
+
var d = o.forwardRef(({ className: o, children: d, showOptional: f = !1, tooltip: p, ...m }, h) => /* @__PURE__ */ l(u.Root, {
|
|
11
|
+
ref: h,
|
|
12
|
+
className: e(t, "inline-flex items-center gap-1 text-sm font-medium leading-none text-basalt-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70", o),
|
|
13
|
+
...m,
|
|
13
14
|
children: [
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
d,
|
|
16
|
+
f ? /* @__PURE__ */ c("span", {
|
|
16
17
|
className: "font-normal text-basalt-muted-foreground",
|
|
17
18
|
children: "(optional)"
|
|
18
19
|
}) : null,
|
|
19
|
-
|
|
20
|
+
p ? /* @__PURE__ */ c(i, { children: /* @__PURE__ */ l(n, { children: [/* @__PURE__ */ c(a, {
|
|
20
21
|
asChild: !0,
|
|
21
|
-
children: /* @__PURE__ */
|
|
22
|
+
children: /* @__PURE__ */ c("button", {
|
|
22
23
|
type: "button",
|
|
23
24
|
"aria-label": "More information",
|
|
24
25
|
className: "inline-flex size-4 shrink-0 items-center justify-center text-basalt-muted-foreground hover:text-basalt-foreground",
|
|
25
|
-
children: /* @__PURE__ */ s
|
|
26
|
+
children: /* @__PURE__ */ c(s, { className: "size-3.5" })
|
|
26
27
|
})
|
|
27
|
-
}), /* @__PURE__ */
|
|
28
|
+
}), /* @__PURE__ */ c(r, { children: p })] }) }) : null
|
|
28
29
|
]
|
|
29
30
|
}));
|
|
30
|
-
|
|
31
|
+
d.displayName = u.Root.displayName;
|
|
31
32
|
//#endregion
|
|
32
|
-
export {
|
|
33
|
+
export { d as Label };
|
|
33
34
|
|
|
34
35
|
//# sourceMappingURL=label.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","names":[],"sources":["../../src/components/label.tsx"],"sourcesContent":["import * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { Info } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./tooltip\";\n\nexport type LabelProps = React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & {\n\t/**\n\t * Show gray (optional) after the label.\n\t * @default false\n\t */\n\tshowOptional?: boolean;\n\t/** Info icon with hover text. */\n\ttooltip?: React.ReactNode;\n};\n\nexport const Label = React.forwardRef<React.ElementRef<typeof LabelPrimitive.Root>, LabelProps>(\n\t({ className, children, showOptional = false, tooltip, ...props }, ref) => (\n\t\t<LabelPrimitive.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex items-center gap-1 text-sm font-medium leading-none text-basalt-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t{showOptional ? (\n\t\t\t\t<span className=\"font-normal text-basalt-muted-foreground\">(optional)</span>\n\t\t\t) : null}\n\t\t\t{tooltip ? (\n\t\t\t\t<TooltipProvider>\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-label=\"More information\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex size-4 shrink-0 items-center justify-center text-basalt-muted-foreground hover:text-basalt-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Info className=\"size-3.5\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>{tooltip}</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TooltipProvider>\n\t\t\t) : null}\n\t\t</LabelPrimitive.Root>\n\t),\n);\nLabel.displayName = LabelPrimitive.Root.displayName;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"label.js","names":[],"sources":["../../src/components/label.tsx"],"sourcesContent":["import * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { Info } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./tooltip\";\n\nexport type LabelProps = React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & {\n\t/**\n\t * Show gray (optional) after the label.\n\t * @default false\n\t */\n\tshowOptional?: boolean;\n\t/** Info icon with hover text. */\n\ttooltip?: React.ReactNode;\n};\n\nexport const Label = React.forwardRef<React.ElementRef<typeof LabelPrimitive.Root>, LabelProps>(\n\t({ className, children, showOptional = false, tooltip, ...props }, ref) => (\n\t\t<LabelPrimitive.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"inline-flex items-center gap-1 text-sm font-medium leading-none text-basalt-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t{showOptional ? (\n\t\t\t\t<span className=\"font-normal text-basalt-muted-foreground\">(optional)</span>\n\t\t\t) : null}\n\t\t\t{tooltip ? (\n\t\t\t\t<TooltipProvider>\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-label=\"More information\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex size-4 shrink-0 items-center justify-center text-basalt-muted-foreground hover:text-basalt-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Info className=\"size-3.5\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>{tooltip}</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TooltipProvider>\n\t\t\t) : null}\n\t\t</LabelPrimitive.Root>\n\t),\n);\nLabel.displayName = LabelPrimitive.Root.displayName;\n"],"mappings":";;;;;;;;;AAiBA,IAAa,IAAQ,EAAM,YACzB,EAAE,cAAW,aAAU,kBAAe,IAAO,YAAS,GAAG,KAAS,MAClE,kBAAC,EAAe,MAAhB;CACM;CACL,WAAW,EACV,GACA,oJACA,CACD;CACA,GAAI;CAPL,UAAA;EASE;EACA,IACA,kBAAC,QAAD;GAAM,WAAU;GAA2C,UAAA;EAAgB,CAAA,IACxE;EACH,IACA,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAgB,SAAA;GACf,UAAA,kBAAC,UAAD;IACC,MAAK;IACL,cAAW;IACX,WAAU;IAEV,UAAA,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;GACrB,CAAA;EACO,CAAA,GAChB,kBAAC,GAAD,EAAA,UAAiB,EAAwB,CAAA,CACjC,EAAA,CAAA,EACO,CAAA,IACd;CACgB;AAEvB,CAAA,CAAA;AACA,EAAM,cAAc,EAAe,KAAK"}
|
|
@@ -37,7 +37,7 @@ export type LayerCardLoadingProps = Omit<HTMLAttributes<HTMLDivElement>, "aria-l
|
|
|
37
37
|
*/
|
|
38
38
|
label?: string;
|
|
39
39
|
};
|
|
40
|
-
export type LayerCardEmptyProps = Omit<HTMLAttributes<HTMLDivElement>, "title"> & {
|
|
40
|
+
export type LayerCardEmptyProps = Omit<HTMLAttributes<HTMLDivElement>, "title" | "children"> & {
|
|
41
41
|
/**
|
|
42
42
|
* Empty-state heading.
|
|
43
43
|
* @default "No content"
|
|
@@ -51,6 +51,14 @@ export type LayerCardEmptyProps = Omit<HTMLAttributes<HTMLDivElement>, "title">
|
|
|
51
51
|
* Optional empty-state icon.
|
|
52
52
|
*/
|
|
53
53
|
icon?: ReactNode;
|
|
54
|
+
/**
|
|
55
|
+
* Optional interactive action element rendered below empty content.
|
|
56
|
+
*/
|
|
57
|
+
action?: ReactNode;
|
|
58
|
+
/**
|
|
59
|
+
* Custom supporting content or custom layout rendered between description and action.
|
|
60
|
+
*/
|
|
61
|
+
children?: ReactNode;
|
|
54
62
|
};
|
|
55
63
|
declare function LayerCardHeader({ className, ...props }: LayerCardSectionProps): import("react").JSX.Element;
|
|
56
64
|
declare function LayerCardBody({ className, ...props }: LayerCardSectionProps): import("react").JSX.Element;
|
|
@@ -59,7 +67,7 @@ declare function LayerCardPrimary(props: LayerCardWellProps): import("react").JS
|
|
|
59
67
|
declare function LayerCardSecondary(props: LayerCardSectionProps): import("react").JSX.Element;
|
|
60
68
|
declare function LayerCardFooter({ className, ...props }: LayerCardSectionProps): import("react").JSX.Element;
|
|
61
69
|
declare function LayerCardLoading({ label, className, ...props }: LayerCardLoadingProps): import("react").JSX.Element;
|
|
62
|
-
declare function LayerCardEmpty({ title, description, icon, className, ...props }: LayerCardEmptyProps): import("react").JSX.Element;
|
|
70
|
+
declare function LayerCardEmpty({ title, description, icon, action, children, className, ...props }: LayerCardEmptyProps): import("react").JSX.Element;
|
|
63
71
|
export declare const LayerCard: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "className"> & {
|
|
64
72
|
/**
|
|
65
73
|
* Additional classes for the card root.
|
|
@@ -1,137 +1,140 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
|
|
4
|
+
import { Empty as n } from "./empty.js";
|
|
5
|
+
import { SkeletonLine as r } from "./skeleton-line.js";
|
|
6
|
+
import { Children as i, Fragment as a, cloneElement as o, forwardRef as s, isValidElement as c } from "react";
|
|
7
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
7
8
|
//#region src/components/layer-card.tsx
|
|
8
|
-
var
|
|
9
|
+
var d = `${t} overflow-hidden rounded-basalt-lg text-basalt-foreground`, f = {
|
|
9
10
|
none: "",
|
|
10
11
|
sm: "p-3",
|
|
11
12
|
md: "p-4",
|
|
12
13
|
lg: "p-6"
|
|
13
14
|
};
|
|
14
|
-
function f(e) {
|
|
15
|
-
return s(e);
|
|
16
|
-
}
|
|
17
15
|
function p(e) {
|
|
16
|
+
return c(e);
|
|
17
|
+
}
|
|
18
|
+
function m(e) {
|
|
18
19
|
return e.type;
|
|
19
20
|
}
|
|
20
|
-
function
|
|
21
|
-
return
|
|
21
|
+
function h(e, t) {
|
|
22
|
+
return i.toArray(e).some((e) => p(e) ? t(m(e)) ? !0 : m(e) === a && h(e.props.children, t) : !1);
|
|
22
23
|
}
|
|
23
|
-
function
|
|
24
|
-
return n ?
|
|
25
|
-
if (!
|
|
26
|
-
if (
|
|
27
|
-
if (
|
|
24
|
+
function g(t, n) {
|
|
25
|
+
return n ? i.map(t, (t) => {
|
|
26
|
+
if (!p(t)) return t;
|
|
27
|
+
if (m(t) === a) return o(t, { children: g(t.props.children, n) });
|
|
28
|
+
if (m(t) === v || m(t) === S) {
|
|
28
29
|
let n = t;
|
|
29
|
-
return
|
|
30
|
+
return o(n, { className: e(n.props.className, "border-b border-basalt-border") });
|
|
30
31
|
}
|
|
31
32
|
return t;
|
|
32
33
|
}) : t;
|
|
33
34
|
}
|
|
34
|
-
var
|
|
35
|
-
let s =
|
|
36
|
-
return /* @__PURE__ */
|
|
35
|
+
var _ = s(({ className: t, children: n, outlined: r = !1, padding: i = "md", ...a }, o) => {
|
|
36
|
+
let s = h(n, (e) => E.has(e)), c = h(n, (e) => e === b || e === x), u = h(n, (e) => e === y) && !c;
|
|
37
|
+
return /* @__PURE__ */ l("div", {
|
|
37
38
|
ref: o,
|
|
38
39
|
"data-basalt-surface": "",
|
|
39
|
-
className: e(
|
|
40
|
+
className: e(d, s ? "flex w-full flex-col" : f[i], r && "ring-1 ring-basalt-border/40", t),
|
|
40
41
|
...a,
|
|
41
|
-
children:
|
|
42
|
+
children: g(n, u)
|
|
42
43
|
});
|
|
43
44
|
});
|
|
44
|
-
|
|
45
|
-
function
|
|
46
|
-
return /* @__PURE__ */
|
|
45
|
+
_.displayName = "LayerCard";
|
|
46
|
+
function v({ className: t, ...n }) {
|
|
47
|
+
return /* @__PURE__ */ l("div", {
|
|
47
48
|
className: e("flex min-w-0 items-start justify-between gap-4 px-4 py-3 text-basalt-muted-foreground", t),
|
|
48
49
|
...n
|
|
49
50
|
});
|
|
50
51
|
}
|
|
51
|
-
|
|
52
|
-
function
|
|
53
|
-
return /* @__PURE__ */
|
|
52
|
+
v.displayName = "LayerCard.Header";
|
|
53
|
+
function y({ className: t, ...n }) {
|
|
54
|
+
return /* @__PURE__ */ l("div", {
|
|
54
55
|
className: e("min-w-0 p-4", t),
|
|
55
56
|
...n
|
|
56
57
|
});
|
|
57
58
|
}
|
|
58
|
-
|
|
59
|
-
function
|
|
60
|
-
return /* @__PURE__ */
|
|
59
|
+
y.displayName = "LayerCard.Body";
|
|
60
|
+
function b({ className: t, outlined: n = !1, ...r }) {
|
|
61
|
+
return /* @__PURE__ */ l("div", {
|
|
61
62
|
"data-basalt-surface": "",
|
|
62
63
|
className: e("min-w-0 p-4", n && "ring-1 ring-basalt-border/40", t),
|
|
63
64
|
...r
|
|
64
65
|
});
|
|
65
66
|
}
|
|
66
|
-
|
|
67
|
-
function b(e) {
|
|
68
|
-
return /* @__PURE__ */ c(y, { ...e });
|
|
69
|
-
}
|
|
70
|
-
b.displayName = "LayerCard.Primary";
|
|
67
|
+
b.displayName = "LayerCard.Well";
|
|
71
68
|
function x(e) {
|
|
72
|
-
return /* @__PURE__ */
|
|
69
|
+
return /* @__PURE__ */ l(b, { ...e });
|
|
73
70
|
}
|
|
74
|
-
x.displayName = "LayerCard.
|
|
75
|
-
function S(
|
|
76
|
-
return /* @__PURE__ */
|
|
71
|
+
x.displayName = "LayerCard.Primary";
|
|
72
|
+
function S(e) {
|
|
73
|
+
return /* @__PURE__ */ l(v, { ...e });
|
|
74
|
+
}
|
|
75
|
+
S.displayName = "LayerCard.Secondary";
|
|
76
|
+
function C({ className: t, ...n }) {
|
|
77
|
+
return /* @__PURE__ */ l("div", {
|
|
77
78
|
className: e("flex flex-wrap items-center justify-end gap-2 border-t border-basalt-border px-4 py-3", t),
|
|
78
79
|
...n
|
|
79
80
|
});
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
function
|
|
83
|
-
return /* @__PURE__ */
|
|
82
|
+
C.displayName = "LayerCard.Footer";
|
|
83
|
+
function w({ label: t = "Loading", className: n, ...i }) {
|
|
84
|
+
return /* @__PURE__ */ u("div", {
|
|
84
85
|
role: "status",
|
|
85
86
|
"aria-label": t,
|
|
86
|
-
className: e("space-y-3 p-4",
|
|
87
|
+
className: e("space-y-3 p-4", n),
|
|
87
88
|
...i,
|
|
88
89
|
children: [
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ l(r, {
|
|
90
91
|
minWidth: 100,
|
|
91
92
|
maxWidth: 100
|
|
92
93
|
}),
|
|
93
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ l(r, {
|
|
94
95
|
minWidth: 72,
|
|
95
96
|
maxWidth: 72
|
|
96
97
|
}),
|
|
97
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ l(r, {
|
|
98
99
|
minWidth: 88,
|
|
99
100
|
maxWidth: 88
|
|
100
101
|
})
|
|
101
102
|
]
|
|
102
103
|
});
|
|
103
104
|
}
|
|
104
|
-
|
|
105
|
-
function
|
|
106
|
-
return /* @__PURE__ */
|
|
107
|
-
title:
|
|
105
|
+
w.displayName = "LayerCard.Loading";
|
|
106
|
+
function T({ title: t = "No content", description: r, icon: i, action: a, children: o, className: s, ...c }) {
|
|
107
|
+
return /* @__PURE__ */ l(n, {
|
|
108
|
+
title: t,
|
|
108
109
|
description: r,
|
|
109
110
|
icon: i,
|
|
110
|
-
|
|
111
|
-
|
|
111
|
+
action: a,
|
|
112
|
+
className: e("p-8", s),
|
|
113
|
+
...c,
|
|
114
|
+
children: o
|
|
112
115
|
});
|
|
113
116
|
}
|
|
114
|
-
|
|
115
|
-
var
|
|
116
|
-
_,
|
|
117
|
+
T.displayName = "LayerCard.Empty";
|
|
118
|
+
var E = /* @__PURE__ */ new Set([
|
|
117
119
|
v,
|
|
118
120
|
y,
|
|
119
|
-
|
|
121
|
+
b,
|
|
120
122
|
C,
|
|
121
123
|
w,
|
|
122
|
-
|
|
123
|
-
x
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
124
|
+
T,
|
|
125
|
+
x,
|
|
126
|
+
S
|
|
127
|
+
]), D = Object.assign(_, {
|
|
128
|
+
Primary: x,
|
|
129
|
+
Secondary: S,
|
|
130
|
+
Header: v,
|
|
131
|
+
Body: y,
|
|
132
|
+
Well: b,
|
|
133
|
+
Footer: C,
|
|
134
|
+
Loading: w,
|
|
135
|
+
Empty: T
|
|
133
136
|
});
|
|
134
137
|
//#endregion
|
|
135
|
-
export {
|
|
138
|
+
export { D as LayerCard };
|
|
136
139
|
|
|
137
140
|
//# sourceMappingURL=layer-card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer-card.js","names":[],"sources":["../../src/components/layer-card.tsx"],"sourcesContent":["import {\n\tChildren,\n\tcloneElement,\n\tFragment,\n\tforwardRef,\n\ttype HTMLAttributes,\n\tisValidElement,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Empty } from \"./empty\";\nimport { SkeletonLine } from \"./skeleton-line\";\n\nconst ROOT_CLASSES =
|
|
1
|
+
{"version":3,"file":"layer-card.js","names":[],"sources":["../../src/components/layer-card.tsx"],"sourcesContent":["import {\n\tChildren,\n\tcloneElement,\n\tFragment,\n\tforwardRef,\n\ttype HTMLAttributes,\n\tisValidElement,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Empty } from \"./empty\";\nimport { SkeletonLine } from \"./skeleton-line\";\n\nconst ROOT_CLASSES = `${BASALT_UI_CLASS} overflow-hidden rounded-basalt-lg text-basalt-foreground`;\nconst PADDING_CLASSES = {\n\tnone: \"\",\n\tsm: \"p-3\",\n\tmd: \"p-4\",\n\tlg: \"p-6\",\n} as const;\n\nexport type LayerCardPadding = keyof typeof PADDING_CLASSES;\n\nexport type LayerCardProps = Omit<HTMLAttributes<HTMLDivElement>, \"className\"> & {\n\t/**\n\t * Additional classes for the card root.\n\t */\n\tclassName?: string;\n\t/**\n\t * Draw a hairline ring. Default grouping is luminance only.\n\t * @default false\n\t */\n\toutlined?: boolean;\n\t/**\n\t * Inner spacing for unstructured card content.\n\t * @default \"md\"\n\t */\n\tpadding?: LayerCardPadding;\n};\nexport type LayerCardSectionProps = HTMLAttributes<HTMLDivElement>;\nexport type LayerCardWellProps = LayerCardSectionProps & {\n\t/**\n\t * Draw a hairline ring on a nested well.\n\t * @default false\n\t */\n\toutlined?: boolean;\n};\nexport type LayerCardLoadingProps = Omit<HTMLAttributes<HTMLDivElement>, \"aria-label\"> & {\n\t/**\n\t * Accessible label announced for the loading state.\n\t * @default \"Loading\"\n\t */\n\tlabel?: string;\n};\nexport type LayerCardEmptyProps = Omit<HTMLAttributes<HTMLDivElement>, \"title\" | \"children\"> & {\n\t/**\n\t * Empty-state heading.\n\t * @default \"No content\"\n\t */\n\ttitle?: string;\n\t/**\n\t * Supporting empty-state text.\n\t */\n\tdescription?: string;\n\t/**\n\t * Optional empty-state icon.\n\t */\n\ticon?: ReactNode;\n\t/**\n\t * Optional interactive action element rendered below empty content.\n\t */\n\taction?: ReactNode;\n\t/**\n\t * Custom supporting content or custom layout rendered between description and action.\n\t */\n\tchildren?: ReactNode;\n};\n\nfunction isElement(child: ReactNode): child is ReactElement<{ children?: ReactNode }> {\n\treturn isValidElement(child);\n}\n\nfunction childType(child: ReactElement): unknown {\n\treturn child.type;\n}\n\nfunction hasSlot(children: ReactNode, match: (type: unknown) => boolean): boolean {\n\treturn Children.toArray(children).some((child) => {\n\t\tif (!isElement(child)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (match(childType(child))) {\n\t\t\treturn true;\n\t\t}\n\t\tif (childType(child) === Fragment) {\n\t\t\treturn hasSlot(child.props.children, match);\n\t\t}\n\t\treturn false;\n\t});\n}\n\nfunction decorateHeaders(children: ReactNode, divided: boolean): ReactNode {\n\tif (!divided) {\n\t\treturn children;\n\t}\n\treturn Children.map(children, (child) => {\n\t\tif (!isElement(child)) {\n\t\t\treturn child;\n\t\t}\n\t\tif (childType(child) === Fragment) {\n\t\t\treturn cloneElement(child, {\n\t\t\t\tchildren: decorateHeaders(child.props.children, divided),\n\t\t\t});\n\t\t}\n\t\tif (childType(child) === LayerCardHeader || childType(child) === LayerCardSecondary) {\n\t\t\tconst typed = child as ReactElement<{ className?: string }>;\n\t\t\treturn cloneElement(typed, {\n\t\t\t\tclassName: cn(typed.props.className, \"border-b border-basalt-border\"),\n\t\t\t});\n\t\t}\n\t\treturn child;\n\t});\n}\n\nconst LayerCardRoot = forwardRef<HTMLDivElement, LayerCardProps>(\n\t({ className, children, outlined = false, padding = \"md\", ...props }, ref) => {\n\t\tconst structured = hasSlot(children, (type) => STRUCTURED_TYPES.has(type));\n\t\tconst hasWell = hasSlot(\n\t\t\tchildren,\n\t\t\t(type) => type === LayerCardWell || type === LayerCardPrimary,\n\t\t);\n\t\tconst hasBody = hasSlot(children, (type) => type === LayerCardBody);\n\t\tconst headerDivided = hasBody && !hasWell;\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tdata-basalt-surface=\"\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\tROOT_CLASSES,\n\t\t\t\t\tstructured ? \"flex w-full flex-col\" : PADDING_CLASSES[padding],\n\t\t\t\t\toutlined && \"ring-1 ring-basalt-border/40\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{decorateHeaders(children, headerDivided)}\n\t\t\t</div>\n\t\t);\n\t},\n);\nLayerCardRoot.displayName = \"LayerCard\";\n\nfunction LayerCardHeader({ className, ...props }: LayerCardSectionProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex min-w-0 items-start justify-between gap-4 px-4 py-3 text-basalt-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\nLayerCardHeader.displayName = \"LayerCard.Header\";\n\nfunction LayerCardBody({ className, ...props }: LayerCardSectionProps) {\n\treturn <div className={cn(\"min-w-0 p-4\", className)} {...props} />;\n}\nLayerCardBody.displayName = \"LayerCard.Body\";\n\nfunction LayerCardWell({ className, outlined = false, ...props }: LayerCardWellProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-basalt-surface=\"\"\n\t\t\tclassName={cn(\"min-w-0 p-4\", outlined && \"ring-1 ring-basalt-border/40\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\nLayerCardWell.displayName = \"LayerCard.Well\";\n\nfunction LayerCardPrimary(props: LayerCardWellProps) {\n\treturn <LayerCardWell {...props} />;\n}\nLayerCardPrimary.displayName = \"LayerCard.Primary\";\n\nfunction LayerCardSecondary(props: LayerCardSectionProps) {\n\treturn <LayerCardHeader {...props} />;\n}\nLayerCardSecondary.displayName = \"LayerCard.Secondary\";\n\nfunction LayerCardFooter({ className, ...props }: LayerCardSectionProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-wrap items-center justify-end gap-2 border-t border-basalt-border px-4 py-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\nLayerCardFooter.displayName = \"LayerCard.Footer\";\n\nfunction LayerCardLoading({ label = \"Loading\", className, ...props }: LayerCardLoadingProps) {\n\treturn (\n\t\t<div role=\"status\" aria-label={label} className={cn(\"space-y-3 p-4\", className)} {...props}>\n\t\t\t<SkeletonLine minWidth={100} maxWidth={100} />\n\t\t\t<SkeletonLine minWidth={72} maxWidth={72} />\n\t\t\t<SkeletonLine minWidth={88} maxWidth={88} />\n\t\t</div>\n\t);\n}\nLayerCardLoading.displayName = \"LayerCard.Loading\";\n\nfunction LayerCardEmpty({\n\ttitle = \"No content\",\n\tdescription,\n\ticon,\n\taction,\n\tchildren,\n\tclassName,\n\t...props\n}: LayerCardEmptyProps) {\n\treturn (\n\t\t<Empty\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\ticon={icon}\n\t\t\taction={action}\n\t\t\tclassName={cn(\"p-8\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</Empty>\n\t);\n}\nLayerCardEmpty.displayName = \"LayerCard.Empty\";\n\nconst STRUCTURED_TYPES = new Set<unknown>([\n\tLayerCardHeader,\n\tLayerCardBody,\n\tLayerCardWell,\n\tLayerCardFooter,\n\tLayerCardLoading,\n\tLayerCardEmpty,\n\tLayerCardPrimary,\n\tLayerCardSecondary,\n]);\n\nexport const LayerCard = Object.assign(LayerCardRoot, {\n\tPrimary: LayerCardPrimary,\n\tSecondary: LayerCardSecondary,\n\tHeader: LayerCardHeader,\n\tBody: LayerCardBody,\n\tWell: LayerCardWell,\n\tFooter: LayerCardFooter,\n\tLoading: LayerCardLoading,\n\tEmpty: LayerCardEmpty,\n});\n"],"mappings":"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"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { type SVGAttributes } from "react";
|
|
2
|
-
export
|
|
2
|
+
export interface LoaderProps extends SVGAttributes<SVGSVGElement> {
|
|
3
|
+
/**
|
|
4
|
+
* Width and height of the loader spinner in pixels.
|
|
5
|
+
*
|
|
6
|
+
* Note: Controls both the SVG width and height dimensions.
|
|
7
|
+
*
|
|
8
|
+
* @default 24
|
|
9
|
+
*/
|
|
3
10
|
size?: number;
|
|
4
|
-
}
|
|
11
|
+
}
|
|
12
|
+
export declare function Loader({ className, size, ...props }: LoaderProps): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","names":[],"sources":["../../src/components/loader.tsx"],"sourcesContent":["import { type SVGAttributes, useId } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport
|
|
1
|
+
{"version":3,"file":"loader.js","names":[],"sources":["../../src/components/loader.tsx"],"sourcesContent":["import { type SVGAttributes, useId } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport interface LoaderProps extends SVGAttributes<SVGSVGElement> {\n\t/**\n\t * Width and height of the loader spinner in pixels.\n\t *\n\t * Note: Controls both the SVG width and height dimensions.\n\t *\n\t * @default 24\n\t */\n\tsize?: number;\n}\n\nexport function Loader({ className, size = 24, ...props }: LoaderProps) {\n\tconst gradientId = `basalt-loader-${useId().replace(/:/g, \"\")}`;\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\trole=\"status\"\n\t\t\taria-label=\"Loading\"\n\t\t\t{...props}\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tclassName={cn(\n\t\t\t\t\"origin-center animate-basalt-loader text-basalt-primary motion-reduce:animate-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<defs>\n\t\t\t\t<linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"currentColor\" stopOpacity=\"0\" />\n\t\t\t\t\t<stop offset=\"55%\" stopColor=\"currentColor\" stopOpacity=\"0.35\" />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"currentColor\" stopOpacity=\"1\" />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t\t<circle\n\t\t\t\tcx=\"12\"\n\t\t\t\tcy=\"12\"\n\t\t\t\tr=\"9.5\"\n\t\t\t\tfill=\"none\"\n\t\t\t\topacity=\"0.12\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"2.25\"\n\t\t\t/>\n\t\t\t<circle\n\t\t\t\tcx=\"12\"\n\t\t\t\tcy=\"12\"\n\t\t\t\tr=\"9.5\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={`url(#${gradientId})`}\n\t\t\t\tstrokeWidth=\"2.25\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeDasharray=\"36 60\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n"],"mappings":";;;;;AAcA,SAAgB,EAAO,EAAE,cAAW,UAAO,IAAI,GAAG,KAAsB;CACvE,IAAM,IAAa,iBAAiB,EAAM,CAAC,CAAC,QAAQ,MAAM,EAAE;CAC5D,OACC,kBAAC,OAAD;EACC,SAAQ;EACR,MAAK;EACL,cAAW;EACX,GAAI;EACJ,OAAO;EACP,QAAQ;EACR,WAAW,EACV,sFACA,CACD;EAVD,UAAA;GAYC,kBAAC,QAAD,EAAA,UACC,kBAAC,kBAAD;IAAgB,IAAI;IAAY,IAAG;IAAK,IAAG;IAAK,IAAG;IAAO,IAAG;IAA7D,UAAA;KACC,kBAAC,QAAD;MAAM,QAAO;MAAK,WAAU;MAAe,aAAY;KAAK,CAAA;KAC5D,kBAAC,QAAD;MAAM,QAAO;MAAM,WAAU;MAAe,aAAY;KAAQ,CAAA;KAChE,kBAAC,QAAD;MAAM,QAAO;MAAO,WAAU;MAAe,aAAY;KAAK,CAAA;IAC/C;GACX,CAAA,EAAA,CAAA;GACN,kBAAC,UAAD;IACC,IAAG;IACH,IAAG;IACH,GAAE;IACF,MAAK;IACL,SAAQ;IACR,QAAO;IACP,aAAY;GACZ,CAAA;GACD,kBAAC,UAAD;IACC,IAAG;IACH,IAAG;IACH,GAAE;IACF,MAAK;IACL,QAAQ,QAAQ,EAAW;IAC3B,aAAY;IACZ,eAAc;IACd,iBAAgB;GAChB,CAAA;EACG;;AAEP"}
|