@flanksource/clicky-ui 0.2.14 → 0.2.16
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/chat.cjs +20 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.d.ts +2 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +20 -0
- package/dist/chat.js.map +1 -0
- package/dist/components/Combobox.cjs +19 -9
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +10 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +19 -9
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +6 -1
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +11 -3
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +6 -1
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/Field.cjs +33 -0
- package/dist/components/Field.cjs.map +1 -0
- package/dist/components/Field.d.ts +27 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +33 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/FilterBar.cjs +49 -55
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +2 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +44 -50
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/FormatOptionsDropdown.cjs +2 -18
- package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -17
- package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
- package/dist/components/FormatOptionsDropdown.js +1 -17
- package/dist/components/FormatOptionsDropdown.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +128 -12
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +131 -15
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +2 -1
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts +5 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +2 -1
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +0 -1
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts +0 -2
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +1 -2
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/TreePickerField.cjs +137 -0
- package/dist/components/TreePickerField.cjs.map +1 -0
- package/dist/components/TreePickerField.d.ts +30 -0
- package/dist/components/TreePickerField.d.ts.map +1 -0
- package/dist/components/TreePickerField.js +137 -0
- package/dist/components/TreePickerField.js.map +1 -0
- package/dist/components/WorkloadPicker.cjs +6 -81
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +1 -20
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +3 -78
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/button-variants.cjs +30 -0
- package/dist/components/button-variants.cjs.map +1 -0
- package/dist/components/button-variants.d.ts +5 -0
- package/dist/components/button-variants.d.ts.map +1 -0
- package/dist/components/button-variants.js +30 -0
- package/dist/components/button-variants.js.map +1 -0
- package/dist/components/button.cjs +11 -82
- package/dist/components/button.cjs.map +1 -1
- package/dist/components/button.d.ts +1 -5
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +5 -76
- package/dist/components/button.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +37 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -0
- package/dist/components/filter-bar-utils.d.ts +4 -0
- package/dist/components/filter-bar-utils.d.ts.map +1 -0
- package/dist/components/filter-bar-utils.js +37 -0
- package/dist/components/filter-bar-utils.js.map +1 -0
- package/dist/components/format-options.cjs +20 -0
- package/dist/components/format-options.cjs.map +1 -0
- package/dist/components/format-options.d.ts +18 -0
- package/dist/components/format-options.d.ts.map +1 -0
- package/dist/components/format-options.js +20 -0
- package/dist/components/format-options.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +13 -17
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -2
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +97 -232
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +51 -6
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +89 -224
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +149 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -0
- package/dist/components/json-schema-form-object.d.ts +10 -0
- package/dist/components/json-schema-form-object.d.ts.map +1 -0
- package/dist/components/json-schema-form-object.js +149 -0
- package/dist/components/json-schema-form-object.js.map +1 -0
- package/dist/components/json-schema-form-preferences.cjs +41 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -0
- package/dist/components/json-schema-form-preferences.d.ts +10 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
- package/dist/components/json-schema-form-preferences.js +41 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +43 -72
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +5 -33
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +41 -70
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +9 -1
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +9 -1
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +59 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +96 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -0
- package/dist/components/json-schema-form-utils.d.ts +17 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -0
- package/dist/components/json-schema-form-utils.js +96 -0
- package/dist/components/json-schema-form-utils.js.map +1 -0
- package/dist/components/loading.cjs +109 -0
- package/dist/components/loading.cjs.map +1 -0
- package/dist/components/loading.d.ts +29 -0
- package/dist/components/loading.d.ts.map +1 -0
- package/dist/components/loading.js +109 -0
- package/dist/components/loading.js.map +1 -0
- package/dist/components/use-form.cjs +27 -0
- package/dist/components/use-form.cjs.map +1 -0
- package/dist/components/use-form.d.ts +30 -0
- package/dist/components/use-form.d.ts.map +1 -0
- package/dist/components/use-form.js +27 -0
- package/dist/components/use-form.js.map +1 -0
- package/dist/components/workload-picker-utils.cjs +88 -0
- package/dist/components/workload-picker-utils.cjs.map +1 -0
- package/dist/components/workload-picker-utils.d.ts +34 -0
- package/dist/components/workload-picker-utils.d.ts.map +1 -0
- package/dist/components/workload-picker-utils.js +88 -0
- package/dist/components/workload-picker-utils.js.map +1 -0
- package/dist/components.cjs +25 -6
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +14 -4
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +24 -5
- package/dist/components.js.map +1 -1
- package/dist/data/Badge.cjs +11 -91
- package/dist/data/Badge.cjs.map +1 -1
- package/dist/data/Badge.d.ts +1 -5
- package/dist/data/Badge.d.ts.map +1 -1
- package/dist/data/Badge.js +11 -91
- package/dist/data/Badge.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -3
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -3
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +161 -156
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +25 -4
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +140 -135
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FilterPill.cjs +3 -0
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +3 -0
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/Icon.cjs +7 -7
- package/dist/data/Icon.cjs.map +1 -1
- package/dist/data/Icon.js +7 -7
- package/dist/data/Icon.js.map +1 -1
- package/dist/data/LogDetails.cjs +5 -14
- package/dist/data/LogDetails.cjs.map +1 -1
- package/dist/data/LogDetails.d.ts +8 -4
- package/dist/data/LogDetails.d.ts.map +1 -1
- package/dist/data/LogDetails.js +4 -13
- package/dist/data/LogDetails.js.map +1 -1
- package/dist/data/LogsTable.cjs +6 -165
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +2 -15
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +6 -165
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.axes.js.map +1 -1
- package/dist/data/TreeNode.cjs +13 -7
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +13 -7
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/badge-variants.cjs +85 -0
- package/dist/data/badge-variants.cjs.map +1 -0
- package/dist/data/badge-variants.d.ts +6 -0
- package/dist/data/badge-variants.d.ts.map +1 -0
- package/dist/data/badge-variants.js +85 -0
- package/dist/data/badge-variants.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.js +59 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
- package/dist/data/cache-browser/CacheTree.cjs +189 -0
- package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
- package/dist/data/cache-browser/CacheTree.d.ts +27 -0
- package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheTree.js +189 -0
- package/dist/data/cache-browser/CacheTree.js.map +1 -0
- package/dist/data/cache-browser/CacheValue.cjs +86 -0
- package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
- package/dist/data/cache-browser/CacheValue.d.ts +11 -0
- package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheValue.js +86 -0
- package/dist/data/cache-browser/CacheValue.js.map +1 -0
- package/dist/data/cache-browser/adapter.cjs +52 -0
- package/dist/data/cache-browser/adapter.cjs.map +1 -0
- package/dist/data/cache-browser/adapter.d.ts +48 -0
- package/dist/data/cache-browser/adapter.d.ts.map +1 -0
- package/dist/data/cache-browser/adapter.js +52 -0
- package/dist/data/cache-browser/adapter.js.map +1 -0
- package/dist/data/cache-browser/api.cjs +42 -0
- package/dist/data/cache-browser/api.cjs.map +1 -0
- package/dist/data/cache-browser/api.d.ts +33 -0
- package/dist/data/cache-browser/api.d.ts.map +1 -0
- package/dist/data/cache-browser/api.js +42 -0
- package/dist/data/cache-browser/api.js.map +1 -0
- package/dist/data/cache-browser/index.d.ts +9 -0
- package/dist/data/cache-browser/index.d.ts.map +1 -0
- package/dist/data/cache-browser/types.cjs +7 -0
- package/dist/data/cache-browser/types.cjs.map +1 -0
- package/dist/data/cache-browser/types.d.ts +78 -0
- package/dist/data/cache-browser/types.d.ts.map +1 -0
- package/dist/data/cache-browser/types.js +7 -0
- package/dist/data/cache-browser/types.js.map +1 -0
- package/dist/data/cells/TagList.cjs +4 -101
- package/dist/data/cells/TagList.cjs.map +1 -1
- package/dist/data/cells/TagList.d.ts +1 -49
- package/dist/data/cells/TagList.d.ts.map +1 -1
- package/dist/data/cells/TagList.js +3 -100
- package/dist/data/cells/TagList.js.map +1 -1
- package/dist/data/cells/Timestamp.cjs +3 -192
- package/dist/data/cells/Timestamp.cjs.map +1 -1
- package/dist/data/cells/Timestamp.d.ts +1 -50
- package/dist/data/cells/Timestamp.d.ts.map +1 -1
- package/dist/data/cells/Timestamp.js +2 -191
- package/dist/data/cells/Timestamp.js.map +1 -1
- package/dist/data/cells/tag-utils.cjs +103 -0
- package/dist/data/cells/tag-utils.cjs.map +1 -0
- package/dist/data/cells/tag-utils.d.ts +51 -0
- package/dist/data/cells/tag-utils.d.ts.map +1 -0
- package/dist/data/cells/tag-utils.js +103 -0
- package/dist/data/cells/tag-utils.js.map +1 -0
- package/dist/data/cells/timestamp-format.cjs +193 -0
- package/dist/data/cells/timestamp-format.cjs.map +1 -0
- package/dist/data/cells/timestamp-format.d.ts +51 -0
- package/dist/data/cells/timestamp-format.d.ts.map +1 -0
- package/dist/data/cells/timestamp-format.js +193 -0
- package/dist/data/cells/timestamp-format.js.map +1 -0
- package/dist/data/chat/Chat.cjs +48 -0
- package/dist/data/chat/Chat.cjs.map +1 -0
- package/dist/data/chat/Chat.d.ts +26 -0
- package/dist/data/chat/Chat.d.ts.map +1 -0
- package/dist/data/chat/Chat.fixtures.d.ts +6 -0
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
- package/dist/data/chat/Chat.js +48 -0
- package/dist/data/chat/Chat.js.map +1 -0
- package/dist/data/chat/Conversation.cjs +34 -0
- package/dist/data/chat/Conversation.cjs.map +1 -0
- package/dist/data/chat/Conversation.d.ts +11 -0
- package/dist/data/chat/Conversation.d.ts.map +1 -0
- package/dist/data/chat/Conversation.js +34 -0
- package/dist/data/chat/Conversation.js.map +1 -0
- package/dist/data/chat/Message.cjs +44 -0
- package/dist/data/chat/Message.cjs.map +1 -0
- package/dist/data/chat/Message.d.ts +10 -0
- package/dist/data/chat/Message.d.ts.map +1 -0
- package/dist/data/chat/Message.js +44 -0
- package/dist/data/chat/Message.js.map +1 -0
- package/dist/data/chat/PromptInput.cjs +61 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -0
- package/dist/data/chat/PromptInput.d.ts +16 -0
- package/dist/data/chat/PromptInput.d.ts.map +1 -0
- package/dist/data/chat/PromptInput.js +61 -0
- package/dist/data/chat/PromptInput.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +92 -0
- package/dist/data/chat/ToolCall.cjs.map +1 -0
- package/dist/data/chat/ToolCall.d.ts +14 -0
- package/dist/data/chat/ToolCall.d.ts.map +1 -0
- package/dist/data/chat/ToolCall.js +92 -0
- package/dist/data/chat/ToolCall.js.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.js +73 -0
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
- package/dist/data/chat/index.d.ts +8 -0
- package/dist/data/chat/index.d.ts.map +1 -0
- package/dist/data/chat/types.cjs +18 -0
- package/dist/data/chat/types.cjs.map +1 -0
- package/dist/data/chat/types.d.ts +41 -0
- package/dist/data/chat/types.d.ts.map +1 -0
- package/dist/data/chat/types.js +18 -0
- package/dist/data/chat/types.js.map +1 -0
- package/dist/data/data-table-utils.cjs +55 -0
- package/dist/data/data-table-utils.cjs.map +1 -0
- package/dist/data/data-table-utils.d.ts +24 -0
- package/dist/data/data-table-utils.d.ts.map +1 -0
- package/dist/data/data-table-utils.js +55 -0
- package/dist/data/data-table-utils.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
- package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.js +2 -21
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
- package/dist/data/diagnostics/ThreadCard.cjs +3 -38
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +2 -37
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/state-styles.cjs +59 -0
- package/dist/data/diagnostics/state-styles.cjs.map +1 -0
- package/dist/data/diagnostics/state-styles.d.ts +5 -0
- package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
- package/dist/data/diagnostics/state-styles.js +59 -0
- package/dist/data/diagnostics/state-styles.js.map +1 -0
- package/dist/data/logs-normalize.cjs +166 -0
- package/dist/data/logs-normalize.cjs.map +1 -0
- package/dist/data/logs-normalize.d.ts +16 -0
- package/dist/data/logs-normalize.d.ts.map +1 -0
- package/dist/data/logs-normalize.js +166 -0
- package/dist/data/logs-normalize.js.map +1 -0
- package/dist/data/task-status.cjs +19 -19
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.js +19 -19
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +43 -18
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +11 -5
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +30 -5
- package/dist/data.js.map +1 -1
- package/dist/hooks/density-provider.cjs +38 -0
- package/dist/hooks/density-provider.cjs.map +1 -0
- package/dist/hooks/density-provider.d.ts +20 -0
- package/dist/hooks/density-provider.d.ts.map +1 -0
- package/dist/hooks/density-provider.js +38 -0
- package/dist/hooks/density-provider.js.map +1 -0
- package/dist/hooks/theme-provider.cjs +43 -0
- package/dist/hooks/theme-provider.cjs.map +1 -0
- package/dist/hooks/theme-provider.d.ts +9 -0
- package/dist/hooks/theme-provider.d.ts.map +1 -0
- package/dist/hooks/theme-provider.js +43 -0
- package/dist/hooks/theme-provider.js.map +1 -0
- package/dist/hooks/use-density.cjs +8 -37
- package/dist/hooks/use-density.cjs.map +1 -1
- package/dist/hooks/use-density.d.ts +5 -20
- package/dist/hooks/use-density.d.ts.map +1 -1
- package/dist/hooks/use-density.js +9 -38
- package/dist/hooks/use-density.js.map +1 -1
- package/dist/hooks/use-theme.cjs +10 -43
- package/dist/hooks/use-theme.cjs.map +1 -1
- package/dist/hooks/use-theme.d.ts +6 -9
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/hooks/use-theme.js +11 -44
- package/dist/hooks/use-theme.js.map +1 -1
- package/dist/hooks.cjs +5 -2
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +4 -2
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +5 -2
- package/dist/hooks.js.map +1 -1
- package/dist/icons/changeIconAliases.cjs +13 -13
- package/dist/icons/changeIconAliases.cjs.map +1 -1
- package/dist/icons/changeIconAliases.d.ts.map +1 -1
- package/dist/icons/changeIconAliases.js +13 -13
- package/dist/icons/changeIconAliases.js.map +1 -1
- package/dist/index.cjs +78 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +61 -13
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +2 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +3 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +2 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/Modal.cjs +38 -27
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +8 -2
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +38 -27
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.cjs +35 -0
- package/dist/overlay/modalStack.cjs.map +1 -0
- package/dist/overlay/modalStack.d.ts +13 -0
- package/dist/overlay/modalStack.d.ts.map +1 -0
- package/dist/overlay/modalStack.js +35 -0
- package/dist/overlay/modalStack.js.map +1 -0
- package/dist/rpc/AcceptPicker.cjs +2 -18
- package/dist/rpc/AcceptPicker.cjs.map +1 -1
- package/dist/rpc/AcceptPicker.d.ts +1 -41
- package/dist/rpc/AcceptPicker.d.ts.map +1 -1
- package/dist/rpc/AcceptPicker.js +2 -18
- package/dist/rpc/AcceptPicker.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +1 -1
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.js +1 -1
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EndpointList.cjs +1 -1
- package/dist/rpc/EndpointList.cjs.map +1 -1
- package/dist/rpc/EndpointList.js +1 -1
- package/dist/rpc/EndpointList.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +4 -4
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.js +4 -4
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +38 -60
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -3
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +40 -62
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/accept-options.cjs +20 -0
- package/dist/rpc/accept-options.cjs.map +1 -0
- package/dist/rpc/accept-options.d.ts +42 -0
- package/dist/rpc/accept-options.d.ts.map +1 -0
- package/dist/rpc/accept-options.js +20 -0
- package/dist/rpc/accept-options.js.map +1 -0
- package/dist/rpc/classify.cjs +15 -4
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +15 -4
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +13 -3
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +2 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +14 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -3
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -3
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc.cjs +3 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -1
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +16 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ModalStackPosition = {
|
|
2
|
+
/** Whether this modal is the topmost open one and should own global affordances. */
|
|
3
|
+
isTop: boolean;
|
|
4
|
+
/** Zero-based depth in the stack; drives the stacking order of nested modals. */
|
|
5
|
+
depth: number;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Registers a modal in the global stack while `open`, returning its live
|
|
9
|
+
* position. Used so a nested modal sits above its opener and only the topmost
|
|
10
|
+
* modal closes on Escape.
|
|
11
|
+
*/
|
|
12
|
+
export declare function useModalStack(open: boolean): ModalStackPosition;
|
|
13
|
+
//# sourceMappingURL=modalStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modalStack.d.ts","sourceRoot":"","sources":["../../src/overlay/modalStack.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,oFAAoF;IACpF,KAAK,EAAE,OAAO,CAAC;IACf,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,CAiB/D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useId, useSyncExternalStore, useEffect } from "react";
|
|
2
|
+
const stack = [];
|
|
3
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
4
|
+
function emit() {
|
|
5
|
+
for (const listener of listeners) listener();
|
|
6
|
+
}
|
|
7
|
+
function subscribe(listener) {
|
|
8
|
+
listeners.add(listener);
|
|
9
|
+
return () => {
|
|
10
|
+
listeners.delete(listener);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function getSnapshot() {
|
|
14
|
+
return stack.join("\0");
|
|
15
|
+
}
|
|
16
|
+
function useModalStack(open) {
|
|
17
|
+
const id = useId();
|
|
18
|
+
useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!open) return;
|
|
21
|
+
stack.push(id);
|
|
22
|
+
emit();
|
|
23
|
+
return () => {
|
|
24
|
+
const index = stack.indexOf(id);
|
|
25
|
+
if (index !== -1) stack.splice(index, 1);
|
|
26
|
+
emit();
|
|
27
|
+
};
|
|
28
|
+
}, [open, id]);
|
|
29
|
+
const depth = stack.indexOf(id);
|
|
30
|
+
return { isTop: depth === stack.length - 1, depth: depth === -1 ? 0 : depth };
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
useModalStack
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=modalStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modalStack.js","sources":["../../src/overlay/modalStack.ts"],"sourcesContent":["import { useEffect, useId, useSyncExternalStore } from \"react\";\n\n// A process-wide stack of the currently open modals, topmost last. Modals mount\n// independently (no shared provider), so the stack lives at module scope and is\n// shared through useSyncExternalStore. It lets nested modals cooperate: only the\n// topmost reacts to Escape, and each renders above the one it opened over.\nconst stack: string[] = [];\nconst listeners = new Set<() => void>();\n\nfunction emit() {\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n// The snapshot is the stack identity; it only changes when an entry is pushed or\n// popped, so subscribers re-render exactly when their position could have moved.\nfunction getSnapshot() {\n return stack.join(\"\u0000\");\n}\n\nexport type ModalStackPosition = {\n /** Whether this modal is the topmost open one and should own global affordances. */\n isTop: boolean;\n /** Zero-based depth in the stack; drives the stacking order of nested modals. */\n depth: number;\n};\n\n/**\n * Registers a modal in the global stack while `open`, returning its live\n * position. Used so a nested modal sits above its opener and only the topmost\n * modal closes on Escape.\n */\nexport function useModalStack(open: boolean): ModalStackPosition {\n const id = useId();\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n useEffect(() => {\n if (!open) return;\n stack.push(id);\n emit();\n return () => {\n const index = stack.indexOf(id);\n if (index !== -1) stack.splice(index, 1);\n emit();\n };\n }, [open, id]);\n\n const depth = stack.indexOf(id);\n return { isTop: depth === stack.length - 1, depth: depth === -1 ? 0 : depth };\n}\n"],"names":[],"mappings":";AAMA,MAAM,QAAkB,CAAA;AACxB,MAAM,gCAAgB,IAAA;AAEtB,SAAS,OAAO;AACd,aAAW,YAAY,UAAW,UAAA;AACpC;AAEA,SAAS,UAAU,UAAsB;AACvC,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AACX,cAAU,OAAO,QAAQ;AAAA,EAC3B;AACF;AAIA,SAAS,cAAc;AACrB,SAAO,MAAM,KAAK,IAAG;AACvB;AAcO,SAAS,cAAc,MAAmC;AAC/D,QAAM,KAAK,MAAA;AACX,uBAAqB,WAAW,aAAa,WAAW;AAExD,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,KAAK,EAAE;AACb,SAAA;AACA,WAAO,MAAM;AACX,YAAM,QAAQ,MAAM,QAAQ,EAAE;AAC9B,UAAI,UAAU,GAAI,OAAM,OAAO,OAAO,CAAC;AACvC,WAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,EAAE,CAAC;AAEb,QAAM,QAAQ,MAAM,QAAQ,EAAE;AAC9B,SAAO,EAAE,OAAO,UAAU,MAAM,SAAS,GAAG,OAAO,UAAU,KAAK,IAAI,MAAA;AACxE;"}
|
|
@@ -5,23 +5,9 @@ const react = require("react");
|
|
|
5
5
|
const button = require("../components/button.cjs");
|
|
6
6
|
const Icon = require("../data/Icon.cjs");
|
|
7
7
|
const utils = require("../lib/utils.cjs");
|
|
8
|
+
const acceptOptions = require("./accept-options.cjs");
|
|
8
9
|
const UiEllipsis = require("../icons/components/UiEllipsis.cjs");
|
|
9
10
|
const UiCheck = require("../icons/components/UiCheck.cjs");
|
|
10
|
-
const ACCEPT_OPTIONS = [
|
|
11
|
-
{ value: "application/json", label: "JSON" },
|
|
12
|
-
{ value: "application/clicky+json", label: "Clicky" },
|
|
13
|
-
{ value: "text/markdown", label: "Markdown" },
|
|
14
|
-
{ value: "text/html", label: "HTML" },
|
|
15
|
-
{ value: "application/x-yaml", label: "YAML" },
|
|
16
|
-
{ value: "text/csv", label: "CSV" },
|
|
17
|
-
{ value: "application/pdf", label: "PDF" },
|
|
18
|
-
{ value: "text/plain", label: "Pretty" }
|
|
19
|
-
];
|
|
20
|
-
const VIEW_OPTIONS = [
|
|
21
|
-
{ value: "application/json", label: "JSON" },
|
|
22
|
-
{ value: "application/clicky+json", label: "Clicky" },
|
|
23
|
-
{ value: "application/pdf", label: "PDF" }
|
|
24
|
-
];
|
|
25
11
|
const PREVIEW_OPTIONS = [
|
|
26
12
|
{ value: "curl", label: "Show cURL preview" },
|
|
27
13
|
{ value: "cli", label: "Show CLI preview" },
|
|
@@ -31,7 +17,7 @@ function AcceptPicker({
|
|
|
31
17
|
value,
|
|
32
18
|
onChange,
|
|
33
19
|
size = "md",
|
|
34
|
-
options = ACCEPT_OPTIONS,
|
|
20
|
+
options = acceptOptions.ACCEPT_OPTIONS,
|
|
35
21
|
previewMode = "hidden",
|
|
36
22
|
onPreviewModeChange,
|
|
37
23
|
className
|
|
@@ -122,7 +108,5 @@ function AcceptPicker({
|
|
|
122
108
|
] })
|
|
123
109
|
] });
|
|
124
110
|
}
|
|
125
|
-
exports.ACCEPT_OPTIONS = ACCEPT_OPTIONS;
|
|
126
111
|
exports.AcceptPicker = AcceptPicker;
|
|
127
|
-
exports.VIEW_OPTIONS = VIEW_OPTIONS;
|
|
128
112
|
//# sourceMappingURL=AcceptPicker.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcceptPicker.cjs","sources":["../../src/rpc/AcceptPicker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiEllipsis, UiCheck } from \"../icons\";\nimport { cn } from \"../lib/utils\";\
|
|
1
|
+
{"version":3,"file":"AcceptPicker.cjs","sources":["../../src/rpc/AcceptPicker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiEllipsis, UiCheck } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport {\n ACCEPT_OPTIONS,\n type AcceptOption,\n type OperationPreviewMode,\n} from \"./accept-options\";\n\nexport type AcceptPickerProps = {\n value: string;\n onChange: (value: string) => void;\n size?: \"sm\" | \"md\";\n options?: readonly AcceptOption[];\n previewMode?: OperationPreviewMode;\n onPreviewModeChange?: (mode: OperationPreviewMode) => void;\n className?: string;\n};\n\nconst PREVIEW_OPTIONS: Array<{ value: OperationPreviewMode; label: string }> = [\n { value: \"curl\", label: \"Show cURL preview\" },\n { value: \"cli\", label: \"Show CLI preview\" },\n { value: \"hidden\", label: \"Hide preview\" },\n];\n\nexport function AcceptPicker({\n value,\n onChange,\n size = \"md\",\n options = ACCEPT_OPTIONS,\n previewMode = \"hidden\",\n onPreviewModeChange,\n className,\n}: AcceptPickerProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const pad = size === \"sm\" ? \"px-2 py-0.5\" : \"px-2.5 py-1\";\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={rootRef} className={cn(\"relative flex flex-wrap gap-1\", className)}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"rounded-md border text-xs transition-colors\",\n pad,\n value === opt.value\n ? \"border-emerald-500 bg-emerald-50 font-medium text-emerald-700 dark:border-emerald-600 dark:bg-emerald-950/30 dark:text-emerald-400\"\n : \"text-muted-foreground hover:border-foreground/20 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n {onPreviewModeChange && (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Open preview menu\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className={cn(\"h-auto\", pad)}\n onClick={() => setOpen((current) => !current)}\n >\n <Icon icon={UiEllipsis} />\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label=\"Preview options\"\n className=\"absolute right-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5\"\n >\n {PREVIEW_OPTIONS.map((option) => {\n const active = option.value === previewMode;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors\",\n \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none\",\n )}\n onClick={() => {\n onPreviewModeChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"min-w-0 flex-1\">{option.label}</span>\n {active ? <Icon icon={UiCheck} className=\"shrink-0\" /> : null}\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":["ACCEPT_OPTIONS","useRef","useState","useEffect","jsxs","cn","jsx","Fragment","Button","Icon","UiEllipsis","UiCheck"],"mappings":"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"}
|
|
@@ -1,44 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
readonly value: "application/json";
|
|
3
|
-
readonly label: "JSON";
|
|
4
|
-
}, {
|
|
5
|
-
readonly value: "application/clicky+json";
|
|
6
|
-
readonly label: "Clicky";
|
|
7
|
-
}, {
|
|
8
|
-
readonly value: "text/markdown";
|
|
9
|
-
readonly label: "Markdown";
|
|
10
|
-
}, {
|
|
11
|
-
readonly value: "text/html";
|
|
12
|
-
readonly label: "HTML";
|
|
13
|
-
}, {
|
|
14
|
-
readonly value: "application/x-yaml";
|
|
15
|
-
readonly label: "YAML";
|
|
16
|
-
}, {
|
|
17
|
-
readonly value: "text/csv";
|
|
18
|
-
readonly label: "CSV";
|
|
19
|
-
}, {
|
|
20
|
-
readonly value: "application/pdf";
|
|
21
|
-
readonly label: "PDF";
|
|
22
|
-
}, {
|
|
23
|
-
readonly value: "text/plain";
|
|
24
|
-
readonly label: "Pretty";
|
|
25
|
-
}];
|
|
26
|
-
export declare const VIEW_OPTIONS: readonly [{
|
|
27
|
-
readonly value: "application/json";
|
|
28
|
-
readonly label: "JSON";
|
|
29
|
-
}, {
|
|
30
|
-
readonly value: "application/clicky+json";
|
|
31
|
-
readonly label: "Clicky";
|
|
32
|
-
}, {
|
|
33
|
-
readonly value: "application/pdf";
|
|
34
|
-
readonly label: "PDF";
|
|
35
|
-
}];
|
|
36
|
-
export type AcceptOption = {
|
|
37
|
-
value: string;
|
|
38
|
-
label: string;
|
|
39
|
-
};
|
|
40
|
-
export type AcceptValue = (typeof ACCEPT_OPTIONS)[number]["value"];
|
|
41
|
-
export type OperationPreviewMode = "hidden" | "curl" | "cli";
|
|
1
|
+
import { AcceptOption, OperationPreviewMode } from './accept-options';
|
|
42
2
|
export type AcceptPickerProps = {
|
|
43
3
|
value: string;
|
|
44
4
|
onChange: (value: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcceptPicker.d.ts","sourceRoot":"","sources":["../../src/rpc/AcceptPicker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AcceptPicker.d.ts","sourceRoot":"","sources":["../../src/rpc/AcceptPicker.tsx"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,IAAW,EACX,OAAwB,EACxB,WAAsB,EACtB,mBAAmB,EACnB,SAAS,GACV,EAAE,iBAAiB,2CAyFnB"}
|
package/dist/rpc/AcceptPicker.js
CHANGED
|
@@ -3,23 +3,9 @@ import { useRef, useState, useEffect } from "react";
|
|
|
3
3
|
import { Button } from "../components/button.js";
|
|
4
4
|
import { Icon } from "../data/Icon.js";
|
|
5
5
|
import { cn } from "../lib/utils.js";
|
|
6
|
+
import { ACCEPT_OPTIONS } from "./accept-options.js";
|
|
6
7
|
import { UiEllipsis } from "../icons/components/UiEllipsis.js";
|
|
7
8
|
import { UiCheck } from "../icons/components/UiCheck.js";
|
|
8
|
-
const ACCEPT_OPTIONS = [
|
|
9
|
-
{ value: "application/json", label: "JSON" },
|
|
10
|
-
{ value: "application/clicky+json", label: "Clicky" },
|
|
11
|
-
{ value: "text/markdown", label: "Markdown" },
|
|
12
|
-
{ value: "text/html", label: "HTML" },
|
|
13
|
-
{ value: "application/x-yaml", label: "YAML" },
|
|
14
|
-
{ value: "text/csv", label: "CSV" },
|
|
15
|
-
{ value: "application/pdf", label: "PDF" },
|
|
16
|
-
{ value: "text/plain", label: "Pretty" }
|
|
17
|
-
];
|
|
18
|
-
const VIEW_OPTIONS = [
|
|
19
|
-
{ value: "application/json", label: "JSON" },
|
|
20
|
-
{ value: "application/clicky+json", label: "Clicky" },
|
|
21
|
-
{ value: "application/pdf", label: "PDF" }
|
|
22
|
-
];
|
|
23
9
|
const PREVIEW_OPTIONS = [
|
|
24
10
|
{ value: "curl", label: "Show cURL preview" },
|
|
25
11
|
{ value: "cli", label: "Show CLI preview" },
|
|
@@ -121,8 +107,6 @@ function AcceptPicker({
|
|
|
121
107
|
] });
|
|
122
108
|
}
|
|
123
109
|
export {
|
|
124
|
-
|
|
125
|
-
AcceptPicker,
|
|
126
|
-
VIEW_OPTIONS
|
|
110
|
+
AcceptPicker
|
|
127
111
|
};
|
|
128
112
|
//# sourceMappingURL=AcceptPicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcceptPicker.js","sources":["../../src/rpc/AcceptPicker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiEllipsis, UiCheck } from \"../icons\";\nimport { cn } from \"../lib/utils\";\
|
|
1
|
+
{"version":3,"file":"AcceptPicker.js","sources":["../../src/rpc/AcceptPicker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiEllipsis, UiCheck } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport {\n ACCEPT_OPTIONS,\n type AcceptOption,\n type OperationPreviewMode,\n} from \"./accept-options\";\n\nexport type AcceptPickerProps = {\n value: string;\n onChange: (value: string) => void;\n size?: \"sm\" | \"md\";\n options?: readonly AcceptOption[];\n previewMode?: OperationPreviewMode;\n onPreviewModeChange?: (mode: OperationPreviewMode) => void;\n className?: string;\n};\n\nconst PREVIEW_OPTIONS: Array<{ value: OperationPreviewMode; label: string }> = [\n { value: \"curl\", label: \"Show cURL preview\" },\n { value: \"cli\", label: \"Show CLI preview\" },\n { value: \"hidden\", label: \"Hide preview\" },\n];\n\nexport function AcceptPicker({\n value,\n onChange,\n size = \"md\",\n options = ACCEPT_OPTIONS,\n previewMode = \"hidden\",\n onPreviewModeChange,\n className,\n}: AcceptPickerProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const pad = size === \"sm\" ? \"px-2 py-0.5\" : \"px-2.5 py-1\";\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={rootRef} className={cn(\"relative flex flex-wrap gap-1\", className)}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"rounded-md border text-xs transition-colors\",\n pad,\n value === opt.value\n ? \"border-emerald-500 bg-emerald-50 font-medium text-emerald-700 dark:border-emerald-600 dark:bg-emerald-950/30 dark:text-emerald-400\"\n : \"text-muted-foreground hover:border-foreground/20 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n {onPreviewModeChange && (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Open preview menu\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className={cn(\"h-auto\", pad)}\n onClick={() => setOpen((current) => !current)}\n >\n <Icon icon={UiEllipsis} />\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label=\"Preview options\"\n className=\"absolute right-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5\"\n >\n {PREVIEW_OPTIONS.map((option) => {\n const active = option.value === previewMode;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors\",\n \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none\",\n )}\n onClick={() => {\n onPreviewModeChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"min-w-0 flex-1\">{option.label}</span>\n {active ? <Icon icon={UiCheck} className=\"shrink-0\" /> : null}\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAqBA,MAAM,kBAAyE;AAAA,EAC7E,EAAE,OAAO,QAAQ,OAAO,oBAAA;AAAA,EACxB,EAAE,OAAO,OAAO,OAAO,mBAAA;AAAA,EACvB,EAAE,OAAO,UAAU,OAAO,eAAA;AAC5B;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,UAAU,OAAuB,IAAI;AAC3C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,MAAM,SAAS,OAAO,gBAAgB;AAE5C,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,UAAwB;;AAC7C,UAAI,GAAC,aAAQ,YAAR,mBAAiB,SAAS,MAAM,UAAiB;AACpD,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,SAAU,SAAQ,KAAK;AAAA,IAC3C;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,aAAa;AACzD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,SACE,qBAAC,SAAI,KAAK,SAAS,WAAW,GAAG,iCAAiC,SAAS,GACxE,UAAA;AAAA,IAAA,QAAQ,IAAI,CAAC,QACZ;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,IAAI,KAAK;AAAA,QACjC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,UAAU,IAAI,QACV,uIACA;AAAA,QAAA;AAAA,QAGL,UAAA,IAAI;AAAA,MAAA;AAAA,MAXA,IAAI;AAAA,IAAA,CAaZ;AAAA,IACA,uBACC,qBAAA,UAAA,EACE,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,cAAW;AAAA,UACX,iBAAc;AAAA,UACd,iBAAe;AAAA,UACf,WAAW,GAAG,UAAU,GAAG;AAAA,UAC3B,SAAS,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO;AAAA,UAE5C,UAAA,oBAAC,MAAA,EAAK,MAAM,WAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAEzB,QACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAU;AAAA,UAET,UAAA,gBAAgB,IAAI,CAAC,WAAW;AAC/B,kBAAM,SAAS,OAAO,UAAU;AAChC,mBACE;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,gBAAc;AAAA,gBACd,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAEF,SAAS,MAAM;AACb,sCAAoB,OAAO,KAAK;AAChC,0BAAQ,KAAK;AAAA,gBACf;AAAA,gBAEA,UAAA;AAAA,kBAAA,oBAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA,OAAO,OAAM;AAAA,kBAC9C,SAAS,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,YAAW,IAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAdpD,OAAO;AAAA,YAAA;AAAA,UAiBlB,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandOutput.cjs","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-white\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":["useMemo","jsx","jsxs","cn","parseClickyData","Clicky","DataTable","useState","useEffect","JsonView"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommandOutput.cjs","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":["useMemo","jsx","jsxs","cn","parseClickyData","Clicky","DataTable","useState","useEffect","JsonView"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandOutput.js","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-white\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommandOutput.js","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ function EndpointList({
|
|
|
42
42
|
return renderLink({
|
|
43
43
|
key: `${op.method}:${op.path}`,
|
|
44
44
|
to: getCommandHref(operationId, op),
|
|
45
|
-
className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50",
|
|
45
|
+
className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10",
|
|
46
46
|
children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
47
47
|
/* @__PURE__ */ jsxRuntime.jsx(MethodBadge.MethodBadge, { method: op.method }),
|
|
48
48
|
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "text-sm", children: op.path }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EndpointList.cjs","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":["useState","useMemo","jsxs","jsx","Fragment","MethodBadge"],"mappings":";;;;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,EAAE;AAEvC,QAAM,WAAWC,MAAAA,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,qCACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,mCAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACED,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,UAAAD,2BAAAA,IAACE,YAAAA,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChCF,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZA,2BAAAA,IAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;;"}
|
|
1
|
+
{"version":3,"file":"EndpointList.cjs","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":["useState","useMemo","jsxs","jsx","Fragment","MethodBadge"],"mappings":";;;;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,EAAE;AAEvC,QAAM,WAAWC,MAAAA,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,qCACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,mCAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACED,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,UAAAD,2BAAAA,IAACE,YAAAA,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChCF,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZA,2BAAAA,IAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;;"}
|
package/dist/rpc/EndpointList.js
CHANGED
|
@@ -40,7 +40,7 @@ function EndpointList({
|
|
|
40
40
|
return renderLink({
|
|
41
41
|
key: `${op.method}:${op.path}`,
|
|
42
42
|
to: getCommandHref(operationId, op),
|
|
43
|
-
className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50",
|
|
43
|
+
className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10",
|
|
44
44
|
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
45
45
|
/* @__PURE__ */ jsx(MethodBadge, { method: op.method }),
|
|
46
46
|
/* @__PURE__ */ jsx("code", { className: "text-sm", children: op.path }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EndpointList.js","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AAEvC,QAAM,WAAW,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACE,qBAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,0BACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,wBAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACE,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA,oBAAC,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChC,oBAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZ,oBAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"EndpointList.js","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AAEvC,QAAM,WAAW,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACE,qBAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,0BACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,wBAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACE,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA,oBAAC,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChC,oBAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZ,oBAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
|
package/dist/rpc/FilterForm.cjs
CHANGED
|
@@ -169,7 +169,7 @@ function renderParameterInput(filter, id) {
|
|
|
169
169
|
disabled: filter.disabled,
|
|
170
170
|
onChange: (event) => filter.onChange(event.target.value),
|
|
171
171
|
children: [
|
|
172
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: filter.placeholder ??
|
|
172
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: filter.placeholder ?? "" }),
|
|
173
173
|
filter.options.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: option.label ?? option.value }, option.value))
|
|
174
174
|
]
|
|
175
175
|
}
|
|
@@ -199,7 +199,7 @@ function renderParameterInput(filter, id) {
|
|
|
199
199
|
type: filter.inputType === "number" ? "number" : "text",
|
|
200
200
|
"aria-label": filter.label,
|
|
201
201
|
className: inputClassName,
|
|
202
|
-
placeholder: filter.placeholder
|
|
202
|
+
...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
|
|
203
203
|
value: filter.value,
|
|
204
204
|
list: listId,
|
|
205
205
|
disabled: filter.disabled,
|
|
@@ -227,7 +227,7 @@ function renderParameterInput(filter, id) {
|
|
|
227
227
|
type: "text",
|
|
228
228
|
"aria-label": filter.label,
|
|
229
229
|
className: inputClassName,
|
|
230
|
-
placeholder: filter.placeholder
|
|
230
|
+
...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
|
|
231
231
|
value: filter.value.join(", "),
|
|
232
232
|
list: listId,
|
|
233
233
|
disabled: filter.disabled,
|
|
@@ -256,7 +256,7 @@ function renderParameterInput(filter, id) {
|
|
|
256
256
|
type: "text",
|
|
257
257
|
"aria-label": filter.label,
|
|
258
258
|
className: inputClassName,
|
|
259
|
-
placeholder: filter.placeholder
|
|
259
|
+
...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
|
|
260
260
|
value: filter.value,
|
|
261
261
|
disabled: filter.disabled,
|
|
262
262
|
onChange: (event) => filter.onChange(event.target.value)
|