mito-ai 0.1.58__py3-none-any.whl → 0.1.60__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. mito_ai/__init__.py +5 -2
  2. mito_ai/_version.py +1 -1
  3. mito_ai/completions/prompt_builders/agent_system_message.py +7 -1
  4. mito_ai/completions/prompt_builders/chat_system_message.py +4 -0
  5. mito_ai/completions/prompt_builders/prompt_constants.py +17 -0
  6. mito_ai/constants.py +25 -3
  7. mito_ai/enterprise/litellm_client.py +12 -5
  8. mito_ai/enterprise/utils.py +16 -2
  9. mito_ai/openai_client.py +26 -6
  10. mito_ai/provider_manager.py +34 -2
  11. mito_ai/rules/handlers.py +46 -12
  12. mito_ai/rules/utils.py +170 -6
  13. mito_ai/tests/message_history/test_generate_short_chat_name.py +35 -4
  14. mito_ai/tests/open_ai_utils_test.py +34 -36
  15. mito_ai/tests/providers/test_azure.py +2 -2
  16. mito_ai/tests/providers/test_providers.py +5 -5
  17. mito_ai/tests/rules/rules_test.py +100 -4
  18. mito_ai/tests/test_constants.py +90 -0
  19. mito_ai/tests/test_enterprise_mode.py +55 -0
  20. mito_ai/tests/test_model_utils.py +116 -25
  21. mito_ai/utils/anthropic_utils.py +1 -2
  22. mito_ai/utils/model_utils.py +130 -53
  23. mito_ai/utils/open_ai_utils.py +29 -33
  24. mito_ai/utils/provider_utils.py +13 -7
  25. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/build_log.json +1 -1
  26. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/package.json +2 -2
  27. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/package.json.orig +1 -1
  28. mito_ai-0.1.58.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.03302cc521d72eb56b00.js → mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.dccfa541c464ee0e5cd4.js +1064 -175
  29. mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.dccfa541c464ee0e5cd4.js.map +1 -0
  30. mito_ai-0.1.58.data/data/share/jupyter/labextensions/mito_ai/static/style_index_js.f5d476ac514294615881.js → mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_css-loader_dist_cjs_js_style_base_css.3594c54c9d209e1ed56e.js +2 -460
  31. mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_css-loader_dist_cjs_js_style_base_css.3594c54c9d209e1ed56e.js.map +1 -0
  32. mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_sourceMaps_j-49e54d.3972dd8e7542bba478ad.js +463 -0
  33. mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_sourceMaps_j-49e54d.3972dd8e7542bba478ad.js.map +1 -0
  34. mito_ai-0.1.58.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.570df809a692f53a7ab7.js → mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.9735d9bfc8891147fee0.js +6 -6
  35. mito_ai-0.1.60.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.9735d9bfc8891147fee0.js.map +1 -0
  36. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/themes/mito_ai/index.css +78 -78
  37. {mito_ai-0.1.58.dist-info → mito_ai-0.1.60.dist-info}/METADATA +1 -1
  38. {mito_ai-0.1.58.dist-info → mito_ai-0.1.60.dist-info}/RECORD +61 -59
  39. mito_ai-0.1.58.data/data/share/jupyter/labextensions/mito_ai/static/lib_index_js.03302cc521d72eb56b00.js.map +0 -1
  40. mito_ai-0.1.58.data/data/share/jupyter/labextensions/mito_ai/static/remoteEntry.570df809a692f53a7ab7.js.map +0 -1
  41. mito_ai-0.1.58.data/data/share/jupyter/labextensions/mito_ai/static/style_index_js.f5d476ac514294615881.js.map +0 -1
  42. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/etc/jupyter/jupyter_server_config.d/mito_ai.json +0 -0
  43. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/schemas/mito_ai/toolbar-buttons.json +0 -0
  44. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js +0 -0
  45. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/node_modules_process_browser_js.4b128e94d31a81ebd209.js.map +0 -0
  46. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/style.js +0 -0
  47. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_apis_signOut_mjs-node_module-75790d.688c25857e7b81b1740f.js +0 -0
  48. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_apis_signOut_mjs-node_module-75790d.688c25857e7b81b1740f.js.map +0 -0
  49. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js +0 -0
  50. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_auth_dist_esm_providers_cognito_tokenProvider_tokenProvider_-72f1c8.a917210f057fcfe224ad.js.map +0 -0
  51. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js +0 -0
  52. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_dist_esm_index_mjs.6bac1a8c4cc93f15f6b7.js.map +0 -0
  53. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js +0 -0
  54. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_aws-amplify_ui-react_dist_esm_index_mjs.4fcecd65bef9e9847609.js.map +0 -0
  55. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_react-dom_client_js-node_modules_aws-amplify_ui-react_dist_styles_css.b43d4249e4d3dac9ad7b.js +0 -0
  56. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_react-dom_client_js-node_modules_aws-amplify_ui-react_dist_styles_css.b43d4249e4d3dac9ad7b.js.map +0 -0
  57. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js +0 -0
  58. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_semver_index_js.3f6754ac5116d47de76b.js.map +0 -0
  59. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js +0 -0
  60. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/static/vendors-node_modules_vscode-diff_dist_index_js.ea55f1f9346638aafbcf.js.map +0 -0
  61. {mito_ai-0.1.58.data → mito_ai-0.1.60.data}/data/share/jupyter/labextensions/mito_ai/themes/mito_ai/index.js +0 -0
  62. {mito_ai-0.1.58.dist-info → mito_ai-0.1.60.dist-info}/WHEEL +0 -0
  63. {mito_ai-0.1.58.dist-info → mito_ai-0.1.60.dist-info}/entry_points.txt +0 -0
  64. {mito_ai-0.1.58.dist-info → mito_ai-0.1.60.dist-info}/licenses/LICENSE +0 -0
@@ -1060,7 +1060,7 @@ const ChatDropdown = ({ options, onSelect, filterText, isDropdownFromButton = fa
1060
1060
  // Rules first
1061
1061
  ...rules.map((rule) => ({
1062
1062
  type: 'rule',
1063
- rule: rule
1063
+ rule: rule.name
1064
1064
  })),
1065
1065
  // Cells second (when user types @Cell or @cell)
1066
1066
  ...cellReferences.map((cell) => ({
@@ -1109,17 +1109,18 @@ const ChatDropdown = ({ options, onSelect, filterText, isDropdownFromButton = fa
1109
1109
  })),
1110
1110
  ];
1111
1111
  let searchFilteredOptions = allOptions.filter((option) => {
1112
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
1112
1113
  if (option.type === 'variable') {
1113
- return option.variable.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase()) &&
1114
+ return ((_b = (_a = option.variable.variable_name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== null && _b !== void 0 ? _b : '').includes(effectiveFilterText.toLowerCase()) &&
1114
1115
  option.variable.type !== "<class 'module'>" &&
1115
1116
  option.variable.variable_name !== "FUNCTIONS"; // This is default exported from mitosheet when you run from mitosheet import * as FUNCTIONS
1116
1117
  }
1117
1118
  else if (option.type === 'file') {
1118
- return option.file.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase());
1119
+ return ((_d = (_c = option.file.variable_name) === null || _c === void 0 ? void 0 : _c.toLowerCase()) !== null && _d !== void 0 ? _d : '').includes(effectiveFilterText.toLowerCase());
1119
1120
  }
1120
1121
  else if (option.type === 'db') {
1121
- return option.variable.variable_name.toLowerCase().includes(effectiveFilterText.toLowerCase()) ||
1122
- option.variable.value.toLowerCase().includes(effectiveFilterText.toLowerCase());
1122
+ return ((_f = (_e = option.variable.variable_name) === null || _e === void 0 ? void 0 : _e.toLowerCase()) !== null && _f !== void 0 ? _f : '').includes(effectiveFilterText.toLowerCase()) ||
1123
+ ((_h = (_g = option.variable.value) === null || _g === void 0 ? void 0 : _g.toLowerCase()) !== null && _h !== void 0 ? _h : '').includes(effectiveFilterText.toLowerCase());
1123
1124
  }
1124
1125
  else if (option.type === 'cell') {
1125
1126
  // Match "CellN" (no space)
@@ -1129,7 +1130,7 @@ const ChatDropdown = ({ options, onSelect, filterText, isDropdownFromButton = fa
1129
1130
  numberText.includes(effectiveFilterText.toLowerCase());
1130
1131
  }
1131
1132
  else {
1132
- return option.rule.toLowerCase().includes(effectiveFilterText.toLowerCase());
1133
+ return ((_k = (_j = option.rule) === null || _j === void 0 ? void 0 : _j.toLowerCase()) !== null && _k !== void 0 ? _k : '').includes(effectiveFilterText.toLowerCase());
1133
1134
  }
1134
1135
  });
1135
1136
  // If user is searching (has filter text), show all matches
@@ -2162,6 +2163,7 @@ const MarkdownBlock = ({ markdown, renderMimeRegistry, notebookTracker }) => {
2162
2163
  // This ensures re-renders when cells are reordered (even if count stays the same)
2163
2164
  const cellOrderKey = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {
2164
2165
  return Array.from(cellOrder.entries())
2166
+ .filter(([cellId]) => cellId != null) // Filter out entries with undefined/null keys
2165
2167
  .sort((a, b) => a[0].localeCompare(b[0])) // Sort by cellId for stable string
2166
2168
  .map(([cellId, cellNumber]) => `${cellId}:${cellNumber}`)
2167
2169
  .join(',');
@@ -7629,8 +7631,7 @@ __webpack_require__.r(__webpack_exports__);
7629
7631
 
7630
7632
 
7631
7633
  const ChartWizardButton = ({ onButtonClick }) => {
7632
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
7633
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { icon: _icons_MagicWand__WEBPACK_IMPORTED_MODULE_10__["default"], text: "Chart Wizard", title: "Chart Wizard", onClick: onButtonClick, variant: 'purple', width: 'fit-contents', iconPosition: 'left' })));
7634
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TextAndIconButton__WEBPACK_IMPORTED_MODULE_9__["default"], { icon: _icons_MagicWand__WEBPACK_IMPORTED_MODULE_10__["default"], text: "Chart Wizard", title: "Chart Wizard", onClick: onButtonClick, variant: "purple", width: "fit-contents", iconPosition: "left" }));
7634
7635
  };
7635
7636
  const ChartWizardPlugin = {
7636
7637
  id: 'mito-ai:chart-wizard',
@@ -7817,16 +7818,18 @@ __webpack_require__.r(__webpack_exports__);
7817
7818
  /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ "webpack/sharing/consume/default/@jupyterlab/apputils");
7818
7819
  /* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);
7819
7820
  /* harmony import */ var _utils_parser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/parser */ "./lib/Extensions/ChartWizard/utils/parser.js");
7821
+ /* harmony import */ var _utils_chartExport__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/chartExport */ "./lib/Extensions/ChartWizard/utils/chartExport.js");
7820
7822
  /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
7821
7823
  /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/strings */ "./lib/utils/strings.js");
7822
- /* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
7823
- /* harmony import */ var _AddFieldButton__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./AddFieldButton */ "./lib/Extensions/ChartWizard/AddFieldButton.js");
7824
- /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/BooleanInputRow.js");
7825
- /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/TupleInputRow.js");
7826
- /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/NumberInputRow.js");
7827
- /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/utils.js");
7828
- /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/ColorInputRow.js");
7829
- /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/StringInputRow.js");
7824
+ /* harmony import */ var _components_LoadingDots__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../components/LoadingDots */ "./lib/components/LoadingDots.js");
7825
+ /* harmony import */ var _components_ToggleButton__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../components/ToggleButton */ "./lib/components/ToggleButton.js");
7826
+ /* harmony import */ var _AddFieldButton__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./AddFieldButton */ "./lib/Extensions/ChartWizard/AddFieldButton.js");
7827
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/BooleanInputRow.js");
7828
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/TupleInputRow.js");
7829
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/NumberInputRow.js");
7830
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/utils.js");
7831
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/ColorInputRow.js");
7832
+ /* harmony import */ var _inputs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./inputs */ "./lib/Extensions/ChartWizard/inputs/StringInputRow.js");
7830
7833
  /* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks */ "./lib/Extensions/ChartWizard/hooks/useChartConfig.js");
7831
7834
  /* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks */ "./lib/Extensions/ChartWizard/hooks/useDebouncedNotebookUpdate.js");
7832
7835
  /* harmony import */ var _utils_notebook__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/notebook */ "./lib/utils/notebook.js");
@@ -7846,6 +7849,8 @@ __webpack_require__.r(__webpack_exports__);
7846
7849
 
7847
7850
 
7848
7851
 
7852
+
7853
+
7849
7854
  /**
7850
7855
  * Formats a variable name into a human-readable label.
7851
7856
  * Converts snake_case to Title Case (e.g., "figure_size" -> "Figure Size").
@@ -7863,6 +7868,7 @@ const ChartWizardContent = ({ chartData }) => {
7863
7868
  const widgetRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
7864
7869
  const [overlayHeight, setOverlayHeight] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);
7865
7870
  const [isActiveCellMismatch, setIsActiveCellMismatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
7871
+ const [exportFormat, setExportFormat] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('png');
7866
7872
  // Reset currentSourceCode when switching to a different chart
7867
7873
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
7868
7874
  setCurrentSourceCode(null);
@@ -7995,6 +8001,18 @@ const ChartWizardContent = ({ chartData }) => {
7995
8001
  // Update the cell with the updated code
7996
8002
  updateNotebookCell(updatedCode);
7997
8003
  }, [updateNotebookCell]);
8004
+ /**
8005
+ * Exports the chart image to disk via the chartExport utility; shows a notification on error.
8006
+ */
8007
+ const handleExportChart = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {
8008
+ void (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_7__.logEvent)('chart_wizard_export_clicked');
8009
+ if (!chartData)
8010
+ return;
8011
+ const result = await (0,_utils_chartExport__WEBPACK_IMPORTED_MODULE_9__.exportChartImage)(chartData, exportFormat);
8012
+ if (!result.success) {
8013
+ _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Notification.emit(result.error, 'error', { autoClose: 5000 });
8014
+ }
8015
+ }, [chartData, exportFormat]);
7998
8016
  /**
7999
8017
  * Renders the appropriate input field component based on variable type.
8000
8018
  */
@@ -8007,22 +8025,22 @@ const ChartWizardContent = ({ chartData }) => {
8007
8025
  };
8008
8026
  switch (variable.type) {
8009
8027
  case 'boolean':
8010
- return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_9__.BooleanInputRow, { key: variable.name, ...commonProps });
8028
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_10__.BooleanInputRow, { key: variable.name, ...commonProps });
8011
8029
  case 'tuple':
8012
- return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_10__.TupleInputRow, { key: variable.name, ...commonProps });
8030
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_11__.TupleInputRow, { key: variable.name, ...commonProps });
8013
8031
  case 'number':
8014
- return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_11__.NumberInputRow, { key: variable.name, ...commonProps });
8032
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_12__.NumberInputRow, { key: variable.name, ...commonProps });
8015
8033
  case 'string': {
8016
8034
  // String input - check if it's a hex color
8017
8035
  const stringValue = variable.value;
8018
- const isColor = (0,_inputs__WEBPACK_IMPORTED_MODULE_12__.isHexColor)(stringValue);
8036
+ const isColor = (0,_inputs__WEBPACK_IMPORTED_MODULE_13__.isHexColor)(stringValue);
8019
8037
  if (isColor) {
8020
- return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_13__.ColorInputRow, { key: variable.name, ...commonProps });
8038
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_14__.ColorInputRow, { key: variable.name, ...commonProps });
8021
8039
  }
8022
- return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_14__.StringInputRow, { key: variable.name, ...commonProps });
8040
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_15__.StringInputRow, { key: variable.name, ...commonProps });
8023
8041
  }
8024
8042
  default:
8025
- return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_14__.StringInputRow, { key: variable.name, ...commonProps });
8043
+ return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_inputs__WEBPACK_IMPORTED_MODULE_15__.StringInputRow, { key: variable.name, ...commonProps });
8026
8044
  }
8027
8045
  }, [handleVariableChange]);
8028
8046
  // Memoize input fields to prevent unnecessary re-renders
@@ -8061,7 +8079,12 @@ const ChartWizardContent = ({ chartData }) => {
8061
8079
  hasConfig ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-config-container" },
8062
8080
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "chart-wizard-config-description" }, "Edit values below to customize your chart. Changes will be reflected in the notebook."),
8063
8081
  inputFields,
8064
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AddFieldButton__WEBPACK_IMPORTED_MODULE_15__["default"], { code: currentSourceCode || (chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode) || null, onFieldAdded: handleFieldAdded, clearPendingUpdate: clearPendingUpdate, onLoadingStateChange: setIsAddingField }))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-no-config" },
8082
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AddFieldButton__WEBPACK_IMPORTED_MODULE_16__["default"], { code: currentSourceCode || (chartData === null || chartData === void 0 ? void 0 : chartData.sourceCode) || null, onFieldAdded: handleFieldAdded, clearPendingUpdate: clearPendingUpdate, onLoadingStateChange: setIsAddingField }),
8083
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-export-section" },
8084
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", { className: "chart-wizard-section-heading" }, "Export"),
8085
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-export-format-row" },
8086
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_ToggleButton__WEBPACK_IMPORTED_MODULE_17__["default"], { leftText: "PNG", rightText: "JPG", isLeftSelected: exportFormat === 'png', onChange: (isPng) => setExportFormat(isPng ? 'png' : 'jpeg') })),
8087
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base button-purple add-field-button", type: "button", title: "Save chart image to file", onClick: handleExportChart }, "Export image")))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-no-config" },
8065
8088
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null,
8066
8089
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("strong", null, "This chart isn't ready for Chart Wizard yet."),
8067
8090
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("br", null),
@@ -8070,13 +8093,13 @@ const ChartWizardContent = ({ chartData }) => {
8070
8093
  "Converting",
8071
8094
  ' ',
8072
8095
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "chart-wizard-loading-dots" },
8073
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_16__["default"], null)))) : ('Convert')))),
8096
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_18__["default"], null)))) : ('Convert')))),
8074
8097
  isAddingField && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-overlay", style: { height: overlayHeight > 0 ? `${overlayHeight}px` : '100%' } },
8075
8098
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-overlay-text" },
8076
8099
  "Adding new field",
8077
8100
  ' ',
8078
8101
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "chart-wizard-loading-dots" },
8079
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_16__["default"], null)))))));
8102
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingDots__WEBPACK_IMPORTED_MODULE_18__["default"], null)))))));
8080
8103
  };
8081
8104
  class ChartWizardWidget extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ReactWidget {
8082
8105
  constructor() {
@@ -8321,10 +8344,46 @@ __webpack_require__.r(__webpack_exports__);
8321
8344
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8322
8345
  */
8323
8346
 
8347
+ function clamp(value, min, max) {
8348
+ return Math.min(Math.max(value, min), max);
8349
+ }
8350
+ /** Use slider when range is small and decimal-friendly (e.g. opacity 0–1). */
8351
+ const SLIDER_RANGE_THRESHOLD = 2;
8352
+ /** Step for decimal ranges: fine for 0–1, coarser for 1–2. */
8353
+ function decimalStep(min, max) {
8354
+ const range = max - min;
8355
+ return range <= 1 ? 0.01 : 0.1;
8356
+ }
8357
+ const SliderWithNumberInput = ({ value, min, max, step, label, onChange }) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-number-slider-row" },
8358
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "range", min: min, max: max, step: step, value: value, onChange: (e) => onChange(clamp(parseFloat(e.target.value), min, max)), className: "chart-wizard-range-slider", "aria-label": label }),
8359
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", min: min, max: max, step: step, value: value, onChange: (e) => {
8360
+ let v = parseFloat(e.target.value);
8361
+ if (Number.isNaN(v))
8362
+ v = min;
8363
+ onChange(clamp(v, min, max));
8364
+ }, className: "chart-wizard-number-input chart-wizard-number-input-narrow", "aria-label": `${label} (number)` })));
8365
+ const NumberInputOnly = ({ value, min, max, step, onChange }) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: value, min: min, max: max, step: step, onChange: (e) => {
8366
+ let v = parseFloat(e.target.value);
8367
+ if (Number.isNaN(v))
8368
+ v = min !== null && min !== void 0 ? min : 0;
8369
+ if (min !== undefined && max !== undefined)
8370
+ v = clamp(v, min, max);
8371
+ onChange(v);
8372
+ }, className: "chart-wizard-number-input" }));
8324
8373
  const NumberInputRow = ({ variable, label, onVariableChange }) => {
8374
+ const numValue = variable.value;
8375
+ const min = variable.min;
8376
+ const max = variable.max;
8377
+ const hasRange = min !== undefined && max !== undefined;
8378
+ const rangeSpan = hasRange ? max - min : 0;
8379
+ const useSlider = hasRange && rangeSpan <= SLIDER_RANGE_THRESHOLD;
8380
+ const step = useSlider ? decimalStep(min, max) : 1;
8381
+ const handleChange = (value) => {
8382
+ onVariableChange(variable.name, value);
8383
+ };
8325
8384
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: variable.name, className: "chart-wizard-input-row" },
8326
8385
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-input-label" }, label),
8327
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: variable.value, onChange: (e) => onVariableChange(variable.name, parseFloat(e.target.value) || 0), className: "chart-wizard-number-input" })));
8386
+ useSlider && min !== undefined && max !== undefined ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SliderWithNumberInput, { value: numValue, min: min, max: max, step: step, label: label, onChange: handleChange })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(NumberInputOnly, { value: numValue, min: min, max: max, step: step, onChange: handleChange }))));
8328
8387
  };
8329
8388
 
8330
8389
 
@@ -8374,20 +8433,31 @@ __webpack_require__.r(__webpack_exports__);
8374
8433
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8375
8434
  */
8376
8435
 
8436
+ function clamp(value, min, max) {
8437
+ return Math.min(Math.max(value, min), max);
8438
+ }
8377
8439
  const TupleInputRow = ({ variable, label, onVariableChange }) => {
8378
8440
  const tupleValue = variable.value;
8441
+ const min = variable.min;
8442
+ const max = variable.max;
8443
+ const clampOrIdentity = (v, fallback) => {
8444
+ if (min !== undefined && max !== undefined) {
8445
+ return clamp(v, min, max);
8446
+ }
8447
+ return Number.isNaN(v) ? fallback : v;
8448
+ };
8379
8449
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: variable.name, className: "chart-wizard-input-row" },
8380
8450
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "chart-wizard-input-label" }, label),
8381
8451
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "chart-wizard-tuple-container" },
8382
8452
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "("),
8383
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: tupleValue[0], onChange: (e) => {
8384
- const newValue = [parseFloat(e.target.value) || 0, tupleValue[1]];
8385
- onVariableChange(variable.name, newValue);
8453
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: tupleValue[0], min: min, max: max, step: min !== undefined && max !== undefined && max - min <= 1 ? 'any' : 1, onChange: (e) => {
8454
+ const v = clampOrIdentity(parseFloat(e.target.value), 0);
8455
+ onVariableChange(variable.name, [v, tupleValue[1]]);
8386
8456
  }, className: "chart-wizard-tuple-input" }),
8387
8457
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, ","),
8388
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: tupleValue[1], onChange: (e) => {
8389
- const newValue = [tupleValue[0], parseFloat(e.target.value) || 0];
8390
- onVariableChange(variable.name, newValue);
8458
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", value: tupleValue[1], min: min, max: max, step: min !== undefined && max !== undefined && max - min <= 1 ? 'any' : 1, onChange: (e) => {
8459
+ const v = clampOrIdentity(parseFloat(e.target.value), 0);
8460
+ onVariableChange(variable.name, [tupleValue[0], v]);
8391
8461
  }, className: "chart-wizard-tuple-input" }),
8392
8462
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, ")"))));
8393
8463
  };
@@ -8442,6 +8512,263 @@ const normalizeHexColor = (value) => {
8442
8512
  };
8443
8513
 
8444
8514
 
8515
+ /***/ }),
8516
+
8517
+ /***/ "./lib/Extensions/ChartWizard/utils/chartExport.js":
8518
+ /*!*********************************************************!*\
8519
+ !*** ./lib/Extensions/ChartWizard/utils/chartExport.js ***!
8520
+ \*********************************************************/
8521
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8522
+
8523
+ __webpack_require__.r(__webpack_exports__);
8524
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8525
+ /* harmony export */ exportChartImage: () => (/* binding */ exportChartImage)
8526
+ /* harmony export */ });
8527
+ /* harmony import */ var _imageFinder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageFinder */ "./lib/Extensions/ChartWizard/utils/imageFinder.js");
8528
+ /* harmony import */ var _fileSaver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fileSaver */ "./lib/Extensions/ChartWizard/utils/fileSaver.js");
8529
+ /* harmony import */ var _download__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./download */ "./lib/Extensions/ChartWizard/utils/download.js");
8530
+ /*
8531
+ * Copyright (c) Saga Inc.
8532
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8533
+ */
8534
+
8535
+
8536
+
8537
+ /**
8538
+ * Exports the chart image to the user's disk. Uses File System Access API when available
8539
+ * so the user can choose the save location; otherwise triggers a download.
8540
+ *
8541
+ * @param chartData - Chart wizard data identifying the notebook panel and cell
8542
+ * @param format - Export format: 'png' or 'jpeg'
8543
+ * @returns Result indicating success or an error message for the UI to display
8544
+ */
8545
+ async function exportChartImage(chartData, format = 'png') {
8546
+ const found = (0,_imageFinder__WEBPACK_IMPORTED_MODULE_0__.findChartImageDataUrl)(chartData);
8547
+ if (!found.ok)
8548
+ return { success: false, error: found.error };
8549
+ if ((0,_fileSaver__WEBPACK_IMPORTED_MODULE_1__.isFileSystemAccessAvailable)()) {
8550
+ try {
8551
+ await (0,_fileSaver__WEBPACK_IMPORTED_MODULE_1__.saveWithFilePicker)(found.dataUrl, format);
8552
+ }
8553
+ catch (err) {
8554
+ if (err.name === 'AbortError') {
8555
+ return { success: true };
8556
+ }
8557
+ await (0,_download__WEBPACK_IMPORTED_MODULE_2__.downloadImage)(found.dataUrl, format);
8558
+ }
8559
+ }
8560
+ else {
8561
+ await (0,_download__WEBPACK_IMPORTED_MODULE_2__.downloadImage)(found.dataUrl, format);
8562
+ }
8563
+ return { success: true };
8564
+ }
8565
+
8566
+
8567
+ /***/ }),
8568
+
8569
+ /***/ "./lib/Extensions/ChartWizard/utils/download.js":
8570
+ /*!******************************************************!*\
8571
+ !*** ./lib/Extensions/ChartWizard/utils/download.js ***!
8572
+ \******************************************************/
8573
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8574
+
8575
+ __webpack_require__.r(__webpack_exports__);
8576
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8577
+ /* harmony export */ downloadImage: () => (/* binding */ downloadImage)
8578
+ /* harmony export */ });
8579
+ /* harmony import */ var _imageConverter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageConverter */ "./lib/Extensions/ChartWizard/utils/imageConverter.js");
8580
+ /*
8581
+ * Copyright (c) Saga Inc.
8582
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8583
+ */
8584
+
8585
+ const SUGGESTED_NAMES = {
8586
+ png: 'chart.png',
8587
+ jpeg: 'chart.jpg'
8588
+ };
8589
+ /**
8590
+ * Triggers a browser download of a URL.
8591
+ */
8592
+ function triggerDownload(url, filename) {
8593
+ const a = document.createElement('a');
8594
+ a.href = url;
8595
+ a.download = filename;
8596
+ a.click();
8597
+ }
8598
+ /**
8599
+ * Downloads an image using the browser's fallback download mechanism.
8600
+ */
8601
+ async function downloadImage(dataUrl, format) {
8602
+ if (format === 'jpeg') {
8603
+ const blob = await (0,_imageConverter__WEBPACK_IMPORTED_MODULE_0__.dataUrlToBlob)(dataUrl, format);
8604
+ const url = URL.createObjectURL(blob);
8605
+ triggerDownload(url, SUGGESTED_NAMES.jpeg);
8606
+ URL.revokeObjectURL(url);
8607
+ }
8608
+ else {
8609
+ triggerDownload(dataUrl, SUGGESTED_NAMES.png);
8610
+ }
8611
+ }
8612
+
8613
+
8614
+ /***/ }),
8615
+
8616
+ /***/ "./lib/Extensions/ChartWizard/utils/fileSaver.js":
8617
+ /*!*******************************************************!*\
8618
+ !*** ./lib/Extensions/ChartWizard/utils/fileSaver.js ***!
8619
+ \*******************************************************/
8620
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8621
+
8622
+ __webpack_require__.r(__webpack_exports__);
8623
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8624
+ /* harmony export */ isFileSystemAccessAvailable: () => (/* binding */ isFileSystemAccessAvailable),
8625
+ /* harmony export */ saveWithFilePicker: () => (/* binding */ saveWithFilePicker)
8626
+ /* harmony export */ });
8627
+ /* harmony import */ var _imageConverter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageConverter */ "./lib/Extensions/ChartWizard/utils/imageConverter.js");
8628
+ /*
8629
+ * Copyright (c) Saga Inc.
8630
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8631
+ */
8632
+
8633
+ const SUGGESTED_NAMES = {
8634
+ png: 'chart.png',
8635
+ jpeg: 'chart.jpg'
8636
+ };
8637
+ const FILE_PICKER_TYPES = {
8638
+ png: [{ description: 'PNG Image', accept: { 'image/png': ['.png'] } }],
8639
+ jpeg: [{ description: 'JPEG Image', accept: { 'image/jpeg': ['.jpg', '.jpeg'] } }]
8640
+ };
8641
+ /**
8642
+ * Checks if the File System Access API is available.
8643
+ */
8644
+ function isFileSystemAccessAvailable() {
8645
+ return ('showSaveFilePicker' in window &&
8646
+ typeof window.showSaveFilePicker ===
8647
+ 'function');
8648
+ }
8649
+ /**
8650
+ * Saves a blob to disk using the File System Access API.
8651
+ */
8652
+ async function writeBlobToFile(blob, handle) {
8653
+ const writable = await handle.createWritable();
8654
+ try {
8655
+ await writable.write(blob);
8656
+ }
8657
+ finally {
8658
+ await writable.close();
8659
+ }
8660
+ }
8661
+ /**
8662
+ * Saves an image to disk using the File System Access API.
8663
+ */
8664
+ async function saveWithFilePicker(dataUrl, format) {
8665
+ var _a, _b;
8666
+ const handle = await ((_b = (_a = window).showSaveFilePicker) === null || _b === void 0 ? void 0 : _b.call(_a, {
8667
+ suggestedName: SUGGESTED_NAMES[format],
8668
+ types: FILE_PICKER_TYPES[format]
8669
+ }));
8670
+ if (!handle)
8671
+ return;
8672
+ const blob = await (0,_imageConverter__WEBPACK_IMPORTED_MODULE_0__.dataUrlToBlob)(dataUrl, format);
8673
+ await writeBlobToFile(blob, handle);
8674
+ }
8675
+
8676
+
8677
+ /***/ }),
8678
+
8679
+ /***/ "./lib/Extensions/ChartWizard/utils/imageConverter.js":
8680
+ /*!************************************************************!*\
8681
+ !*** ./lib/Extensions/ChartWizard/utils/imageConverter.js ***!
8682
+ \************************************************************/
8683
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8684
+
8685
+ __webpack_require__.r(__webpack_exports__);
8686
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8687
+ /* harmony export */ dataUrlToBlob: () => (/* binding */ dataUrlToBlob),
8688
+ /* harmony export */ dataUrlToJpegBlob: () => (/* binding */ dataUrlToJpegBlob)
8689
+ /* harmony export */ });
8690
+ /*
8691
+ * Copyright (c) Saga Inc.
8692
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8693
+ */
8694
+ const JPEG_QUALITY = 1.0;
8695
+ /**
8696
+ * Converts a data URL image to a JPEG blob.
8697
+ */
8698
+ function dataUrlToJpegBlob(dataUrl) {
8699
+ return new Promise((resolve, reject) => {
8700
+ const img = new Image();
8701
+ img.crossOrigin = 'anonymous';
8702
+ img.onload = () => {
8703
+ const canvas = document.createElement('canvas');
8704
+ canvas.width = img.naturalWidth;
8705
+ canvas.height = img.naturalHeight;
8706
+ const ctx = canvas.getContext('2d');
8707
+ if (!ctx) {
8708
+ reject(new Error('Could not get canvas context'));
8709
+ return;
8710
+ }
8711
+ ctx.drawImage(img, 0, 0);
8712
+ canvas.toBlob((blob) => (blob ? resolve(blob) : reject(new Error('toBlob failed'))), 'image/jpeg', JPEG_QUALITY);
8713
+ };
8714
+ img.onerror = () => reject(new Error('Failed to load image'));
8715
+ img.src = dataUrl;
8716
+ });
8717
+ }
8718
+ /**
8719
+ * Converts a data URL to a blob in the specified format.
8720
+ */
8721
+ async function dataUrlToBlob(dataUrl, format) {
8722
+ if (format === 'jpeg') {
8723
+ return dataUrlToJpegBlob(dataUrl);
8724
+ }
8725
+ return fetch(dataUrl).then((r) => r.blob());
8726
+ }
8727
+
8728
+
8729
+ /***/ }),
8730
+
8731
+ /***/ "./lib/Extensions/ChartWizard/utils/imageFinder.js":
8732
+ /*!*********************************************************!*\
8733
+ !*** ./lib/Extensions/ChartWizard/utils/imageFinder.js ***!
8734
+ \*********************************************************/
8735
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8736
+
8737
+ __webpack_require__.r(__webpack_exports__);
8738
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8739
+ /* harmony export */ findChartImageDataUrl: () => (/* binding */ findChartImageDataUrl)
8740
+ /* harmony export */ });
8741
+ /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/cells */ "webpack/sharing/consume/default/@jupyterlab/cells");
8742
+ /* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__);
8743
+ /*
8744
+ * Copyright (c) Saga Inc.
8745
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
8746
+ */
8747
+
8748
+ /**
8749
+ * Finds the chart image data URL from the notebook cell output.
8750
+ */
8751
+ function findChartImageDataUrl(chartData) {
8752
+ const notebookPanel = chartData.notebookTracker.find((panel) => panel.id === chartData.notebookPanelId);
8753
+ if (!notebookPanel) {
8754
+ return { ok: false, error: 'Could not find the notebook.' };
8755
+ }
8756
+ const cellWidget = notebookPanel.content.widgets.find((cell) => cell.model.id === chartData.cellId);
8757
+ if (!(cellWidget instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_0__.CodeCell)) {
8758
+ return { ok: false, error: 'Could not find the chart cell.' };
8759
+ }
8760
+ const outputNode = cellWidget.outputArea.node;
8761
+ const img = outputNode.querySelector('.jp-RenderedImage img[src^="data:image"]');
8762
+ if (!img || !img.src || !img.src.startsWith('data:image')) {
8763
+ return {
8764
+ ok: false,
8765
+ error: 'No chart image found. Re-run the chart cell and try again.'
8766
+ };
8767
+ }
8768
+ return { ok: true, dataUrl: img.src };
8769
+ }
8770
+
8771
+
8445
8772
  /***/ }),
8446
8773
 
8447
8774
  /***/ "./lib/Extensions/ChartWizard/utils/parser.js":
@@ -8473,9 +8800,21 @@ function parseChartConfig(sourceCode) {
8473
8800
  }
8474
8801
  const configSection = sourceCode.substring(startIndex + configStartMarker.length, endIndex).trim();
8475
8802
  const lines = configSection.split('\n').map(line => line.trim()).filter(line => line.length > 0);
8803
+ // First pass: collect # RANGE lines (format: # RANGE VARIABLE_NAME MIN MAX)
8804
+ const rangeByVar = new Map();
8805
+ const rangeRegex = /^#\s*RANGE\s+([A-Z_][A-Z0-9_]*)\s+(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)\s*$/;
8806
+ for (const line of lines) {
8807
+ const rangeMatch = line.match(rangeRegex);
8808
+ if (rangeMatch && rangeMatch[1] && rangeMatch[2] !== undefined && rangeMatch[3] !== undefined) {
8809
+ const varName = rangeMatch[1];
8810
+ const minVal = parseFloat(rangeMatch[2]);
8811
+ const maxVal = parseFloat(rangeMatch[3]);
8812
+ rangeByVar.set(varName, { min: minVal, max: maxVal });
8813
+ }
8814
+ }
8476
8815
  const variables = [];
8477
8816
  for (const line of lines) {
8478
- // Skip comment lines
8817
+ // Skip comment-only lines (RANGE lines already processed above)
8479
8818
  if (line.startsWith('#')) {
8480
8819
  continue;
8481
8820
  }
@@ -8486,10 +8825,12 @@ function parseChartConfig(sourceCode) {
8486
8825
  const valueStr = match[2];
8487
8826
  const parsed = parseValue(valueStr.trim());
8488
8827
  if (parsed) {
8828
+ const range = rangeByVar.get(varName);
8489
8829
  variables.push({
8490
8830
  name: varName,
8491
8831
  value: parsed.value,
8492
- type: parsed.type
8832
+ type: parsed.type,
8833
+ ...(range && { min: range.min, max: range.max })
8493
8834
  });
8494
8835
  }
8495
8836
  }
@@ -8642,6 +8983,9 @@ function updateChartConfig(sourceCode, variables) {
8642
8983
  // Use updated variables if available, otherwise keep original
8643
8984
  const variablesToWrite = parsed.variables.map(v => varMap.get(v.name) || v);
8644
8985
  for (const variable of variablesToWrite) {
8986
+ if (variable.min !== undefined && variable.max !== undefined) {
8987
+ newConfigSection += `# RANGE ${variable.name} ${variable.min} ${variable.max}\n`;
8988
+ }
8645
8989
  const formattedValue = formatValue(variable.value, variable.type);
8646
8990
  newConfigSection += `${variable.name} = ${formattedValue}\n`;
8647
8991
  }
@@ -9306,10 +9650,10 @@ const getFullErrorMessageFromTraceback = (tracebackArray) => {
9306
9650
 
9307
9651
  /***/ }),
9308
9652
 
9309
- /***/ "./lib/Extensions/MitoThemeLight/index.js":
9310
- /*!************************************************!*\
9311
- !*** ./lib/Extensions/MitoThemeLight/index.js ***!
9312
- \************************************************/
9653
+ /***/ "./lib/Extensions/MitoThemes/index.js":
9654
+ /*!********************************************!*\
9655
+ !*** ./lib/Extensions/MitoThemes/index.js ***!
9656
+ \********************************************/
9313
9657
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9314
9658
 
9315
9659
  __webpack_require__.r(__webpack_exports__);
@@ -9326,8 +9670,9 @@ __webpack_require__.r(__webpack_exports__);
9326
9670
  /* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_3__);
9327
9671
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
9328
9672
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
9329
- /* harmony import */ var _components_RunCellButton__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/RunCellButton */ "./lib/components/RunCellButton.js");
9330
- /* harmony import */ var _utils_lineNumbers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../utils/lineNumbers */ "./lib/utils/lineNumbers.js");
9673
+ /* harmony import */ var _components_RunCellButton__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../components/RunCellButton */ "./lib/components/RunCellButton.js");
9674
+ /* harmony import */ var _utils_lineNumbers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/lineNumbers */ "./lib/utils/lineNumbers.js");
9675
+ /* harmony import */ var _palettes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./palettes */ "./lib/Extensions/MitoThemes/palettes.js");
9331
9676
  /* harmony import */ var _style_RunCellButton_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../style/RunCellButton.css */ "./style/RunCellButton.css");
9332
9677
  /*
9333
9678
  * Copyright (c) Saga Inc.
@@ -9341,6 +9686,7 @@ __webpack_require__.r(__webpack_exports__);
9341
9686
 
9342
9687
 
9343
9688
 
9689
+
9344
9690
  /**
9345
9691
  * Updates cell numbers for all cells in a notebook.
9346
9692
  * Uses notebook.widgets which is always in the correct order.
@@ -9378,6 +9724,8 @@ function setupCellNumbering(notebookPanel) {
9378
9724
  updateAllCellNumbers(notebookPanel);
9379
9725
  });
9380
9726
  observer.observe(notebook.node, { childList: true, subtree: true });
9727
+ // Initial update
9728
+ updateAllCellNumbers(notebookPanel);
9381
9729
  // Return cleanup function
9382
9730
  return () => {
9383
9731
  var _a;
@@ -9394,20 +9742,24 @@ function setupCellNumbering(notebookPanel) {
9394
9742
  };
9395
9743
  }
9396
9744
  /**
9397
- * A plugin for the Mito Light Theme.
9745
+ * A plugin for the Mito Themes (Light and Dark).
9398
9746
  *
9399
- * The Run Cell Button, cell numbering, and hidden default toolbar buttons only apply
9400
- * when the Mito Light theme is active.
9747
+ * Registers both Mito Light and Mito Dark themes.
9748
+ * The Run Cell Button, cell numbering, and hidden default toolbar buttons apply
9749
+ * when either Mito theme is active.
9401
9750
  */
9402
9751
  const plugin = {
9403
- id: 'mito_ai:theme',
9404
- description: 'Adds the Mito Light theme.',
9752
+ id: 'mito_ai:themes',
9753
+ description: 'Adds the Mito Light and Dark themes.',
9405
9754
  requires: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.IThemeManager, _jupyterlab_translation__WEBPACK_IMPORTED_MODULE_1__.ITranslator, _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_2__.INotebookTracker],
9406
9755
  activate: (app, manager, translator, notebookTracker) => {
9407
9756
  const trans = translator.load('jupyterlab');
9757
+ // CSS path - single CSS file for both themes (uses CSS variables set by palettes)
9408
9758
  const style = 'mito_ai/index.css';
9409
- // Store connection for cleanup
9410
- let widgetAddedConnection = null;
9759
+ const palettes = new _palettes__WEBPACK_IMPORTED_MODULE_6__.MitoPalettes();
9760
+ // Store connections for cleanup
9761
+ let lightWidgetAddedConnection = null;
9762
+ let darkWidgetAddedConnection = null;
9411
9763
  // Store cell numbering cleanup functions for each notebook
9412
9764
  const cellNumberingCleanups = new Map();
9413
9765
  // Add Run Cell button to notebook toolbar
@@ -9428,7 +9780,7 @@ const plugin = {
9428
9780
  this.addClass('mito-run-cell-button-widget');
9429
9781
  }
9430
9782
  render() {
9431
- return react__WEBPACK_IMPORTED_MODULE_4___default().createElement(_components_RunCellButton__WEBPACK_IMPORTED_MODULE_6__["default"], { notebookPanel: this.panel });
9783
+ return react__WEBPACK_IMPORTED_MODULE_4___default().createElement(_components_RunCellButton__WEBPACK_IMPORTED_MODULE_7__["default"], { notebookPanel: this.panel });
9432
9784
  }
9433
9785
  }
9434
9786
  const runCellWidget = new RunCellButtonWidget(notebookPanel);
@@ -9467,54 +9819,65 @@ const plugin = {
9467
9819
  cellNumberingCleanups.delete(notebookPanel);
9468
9820
  }
9469
9821
  };
9470
- // Add buttons and cell numbering to all notebooks
9471
- const addButtonsToAllNotebooks = () => {
9822
+ // Add cell numbering to a notebook panel (guard against duplicates)
9823
+ const addCellNumbering = (notebookPanel) => {
9824
+ if (cellNumberingCleanups.has(notebookPanel)) {
9825
+ return;
9826
+ }
9827
+ const cleanup = setupCellNumbering(notebookPanel);
9828
+ if (cleanup) {
9829
+ cellNumberingCleanups.set(notebookPanel, cleanup);
9830
+ // Also cleanup when notebook is disposed
9831
+ notebookPanel.disposed.connect(() => {
9832
+ cellNumberingCleanups.delete(notebookPanel);
9833
+ });
9834
+ }
9835
+ };
9836
+ // Add buttons and cell numbering to all notebooks (for a specific theme)
9837
+ const addButtonsToAllNotebooks = (themeName) => {
9472
9838
  notebookTracker.forEach(widget => {
9473
9839
  addRunCellButton(widget);
9474
9840
  // Enable line numbers if needed
9475
- void (0,_utils_lineNumbers__WEBPACK_IMPORTED_MODULE_7__.enableLineNumbersIfNeeded)(app, widget);
9841
+ void (0,_utils_lineNumbers__WEBPACK_IMPORTED_MODULE_8__.enableLineNumbersIfNeeded)(app, widget);
9476
9842
  // Setup cell numbering
9477
- const cleanup = setupCellNumbering(widget);
9478
- if (cleanup) {
9479
- cellNumberingCleanups.set(widget, cleanup);
9480
- // Also cleanup when notebook is disposed
9481
- widget.disposed.connect(() => {
9482
- cellNumberingCleanups.delete(widget);
9483
- });
9484
- }
9843
+ addCellNumbering(widget);
9485
9844
  });
9486
9845
  // Connect to new notebooks
9487
- widgetAddedConnection = (sender, widget) => {
9846
+ const widgetAddedHandler = (sender, widget) => {
9488
9847
  setTimeout(() => {
9489
9848
  // Check if widget is still valid before proceeding
9490
9849
  if (widget.isDisposed) {
9491
9850
  return;
9492
9851
  }
9493
- // Only add if Mito Light theme is still active
9494
- if (manager.theme === 'Mito Light') {
9852
+ // Only add if the specified theme is still active
9853
+ if (manager.theme === themeName) {
9495
9854
  addRunCellButton(widget);
9496
9855
  // Enable line numbers if needed
9497
- void (0,_utils_lineNumbers__WEBPACK_IMPORTED_MODULE_7__.enableLineNumbersIfNeeded)(app, widget);
9856
+ void (0,_utils_lineNumbers__WEBPACK_IMPORTED_MODULE_8__.enableLineNumbersIfNeeded)(app, widget);
9498
9857
  // Setup cell numbering
9499
- const cleanup = setupCellNumbering(widget);
9500
- if (cleanup) {
9501
- cellNumberingCleanups.set(widget, cleanup);
9502
- // Also cleanup when notebook is disposed
9503
- widget.disposed.connect(() => {
9504
- cellNumberingCleanups.delete(widget);
9505
- });
9506
- }
9858
+ addCellNumbering(widget);
9507
9859
  }
9508
9860
  }, 100);
9509
9861
  };
9510
- notebookTracker.widgetAdded.connect(widgetAddedConnection);
9862
+ if (themeName === 'Mito Light') {
9863
+ lightWidgetAddedConnection = widgetAddedHandler;
9864
+ notebookTracker.widgetAdded.connect(lightWidgetAddedConnection);
9865
+ }
9866
+ else if (themeName === 'Mito Dark') {
9867
+ darkWidgetAddedConnection = widgetAddedHandler;
9868
+ notebookTracker.widgetAdded.connect(darkWidgetAddedConnection);
9869
+ }
9511
9870
  };
9512
9871
  // Remove buttons and cell numbering from all notebooks
9513
9872
  const removeButtonsFromAllNotebooks = () => {
9514
9873
  // Disconnect from new notebooks
9515
- if (widgetAddedConnection) {
9516
- notebookTracker.widgetAdded.disconnect(widgetAddedConnection);
9517
- widgetAddedConnection = null;
9874
+ if (lightWidgetAddedConnection) {
9875
+ notebookTracker.widgetAdded.disconnect(lightWidgetAddedConnection);
9876
+ lightWidgetAddedConnection = null;
9877
+ }
9878
+ if (darkWidgetAddedConnection) {
9879
+ notebookTracker.widgetAdded.disconnect(darkWidgetAddedConnection);
9880
+ darkWidgetAddedConnection = null;
9518
9881
  }
9519
9882
  // Remove from all existing notebooks
9520
9883
  notebookTracker.forEach(widget => {
@@ -9524,33 +9887,323 @@ const plugin = {
9524
9887
  // Clear all cleanup functions
9525
9888
  cellNumberingCleanups.clear();
9526
9889
  };
9890
+ // Register Mito Light theme
9527
9891
  manager.register({
9528
9892
  name: 'Mito Light',
9529
9893
  displayName: trans.__('Mito Light'),
9530
9894
  isLight: true,
9531
9895
  themeScrollbars: false,
9532
9896
  load: async () => {
9533
- // Load theme CSS (hides default buttons)
9897
+ // Set CSS variables for light theme before loading CSS
9898
+ palettes.setColorsLight();
9899
+ // Load theme CSS (hides default buttons, applies light theme variables)
9534
9900
  await manager.loadCSS(style);
9535
9901
  // Add Run Cell buttons to all notebooks and enable line numbers
9536
- addButtonsToAllNotebooks();
9902
+ addButtonsToAllNotebooks('Mito Light');
9537
9903
  },
9538
9904
  unload: async () => {
9539
9905
  // Remove Run Cell buttons from all notebooks
9540
9906
  removeButtonsFromAllNotebooks();
9541
9907
  }
9542
9908
  });
9543
- // Set Mito Light as default theme if user hasn't explicitly chosen a different theme
9544
- // This runs after registration so the theme is available
9545
- if (manager.theme === 'JupyterLab Light' || !manager.theme) {
9546
- void manager.setTheme('Mito Light');
9547
- }
9909
+ // Register Mito Dark theme
9910
+ manager.register({
9911
+ name: 'Mito Dark',
9912
+ displayName: trans.__('Mito Dark'),
9913
+ isLight: false,
9914
+ themeScrollbars: false,
9915
+ load: async () => {
9916
+ // Set CSS variables for dark theme before loading CSS
9917
+ palettes.setColorsDark();
9918
+ // Load theme CSS (hides default buttons, applies dark theme variables)
9919
+ await manager.loadCSS(style);
9920
+ // Add Run Cell buttons to all notebooks and enable line numbers
9921
+ addButtonsToAllNotebooks('Mito Dark');
9922
+ },
9923
+ unload: async () => {
9924
+ // Remove Run Cell buttons from all notebooks
9925
+ removeButtonsFromAllNotebooks();
9926
+ }
9927
+ });
9928
+ // Flag to prevent infinite recursion when we convert themes
9929
+ let isConvertingTheme = false;
9930
+ // Helper function to convert non-Mito themes to corresponding Mito theme
9931
+ const convertToMitoTheme = (themeName) => {
9932
+ // Prevent infinite recursion - if we're already converting, don't do it again
9933
+ if (isConvertingTheme) {
9934
+ return;
9935
+ }
9936
+ if (!themeName) {
9937
+ // No theme set, default to Mito Light
9938
+ isConvertingTheme = true;
9939
+ void manager.setTheme('Mito Light').finally(() => {
9940
+ isConvertingTheme = false;
9941
+ });
9942
+ return;
9943
+ }
9944
+ const isMitoTheme = themeName === 'Mito Light' || themeName === 'Mito Dark';
9945
+ if (isMitoTheme) {
9946
+ // Already a Mito theme, don't change - this ensures user's Mito theme preference is preserved
9947
+ return;
9948
+ }
9949
+ // Convert non-Mito themes to corresponding Mito theme
9950
+ isConvertingTheme = true;
9951
+ if (themeName === 'JupyterLab Dark' || themeName.includes('Dark')) {
9952
+ void manager.setTheme('Mito Dark').finally(() => {
9953
+ isConvertingTheme = false;
9954
+ });
9955
+ }
9956
+ else {
9957
+ // Default to light theme for any other non-Mito theme (including JupyterLab Light)
9958
+ void manager.setTheme('Mito Light').finally(() => {
9959
+ isConvertingTheme = false;
9960
+ });
9961
+ }
9962
+ };
9963
+ // Wait for app restoration to complete before checking/setting theme
9964
+ // This ensures saved theme preferences are loaded first
9965
+ void app.restored.then(() => {
9966
+ // Convert theme on initial load if needed
9967
+ convertToMitoTheme(manager.theme);
9968
+ });
9969
+ // Listen for theme changes and automatically convert to Mito theme
9970
+ // This ensures that when users switch themes, they get converted to Mito themes
9971
+ // and the preference is saved properly
9972
+ manager.themeChanged.connect(() => {
9973
+ // Use manager.theme to get the current theme after the change
9974
+ convertToMitoTheme(manager.theme);
9975
+ });
9548
9976
  },
9549
9977
  autoStart: true
9550
9978
  };
9551
9979
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (plugin);
9552
9980
 
9553
9981
 
9982
+ /***/ }),
9983
+
9984
+ /***/ "./lib/Extensions/MitoThemes/palettes.js":
9985
+ /*!***********************************************!*\
9986
+ !*** ./lib/Extensions/MitoThemes/palettes.js ***!
9987
+ \***********************************************/
9988
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9989
+
9990
+ __webpack_require__.r(__webpack_exports__);
9991
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9992
+ /* harmony export */ MitoPalettes: () => (/* binding */ MitoPalettes)
9993
+ /* harmony export */ });
9994
+ /*
9995
+ * Copyright (c) Saga Inc.
9996
+ * Distributed under the terms of the GNU Affero General Public License v3.0 License.
9997
+ */
9998
+ /**
9999
+ * MitoPalettes class sets CSS variables for light and dark themes.
10000
+ * Similar to catppuccin's approach, this allows a single CSS file to work
10001
+ * for both themes by setting different variable values before loading CSS.
10002
+ */
10003
+ class MitoPalettes {
10004
+ /**
10005
+ * Set CSS variables for the light theme
10006
+ */
10007
+ setColorsLight() {
10008
+ // Border colors
10009
+ document.documentElement.style.setProperty('--mito-theme-border-color0', '#bdbdbd');
10010
+ document.documentElement.style.setProperty('--mito-theme-border-color1', '#bdbdbd');
10011
+ document.documentElement.style.setProperty('--mito-theme-border-color2', '#e0e0e0');
10012
+ document.documentElement.style.setProperty('--mito-theme-border-color3', '#eee');
10013
+ document.documentElement.style.setProperty('--mito-theme-inverse-border-color', '#757575');
10014
+ // UI Font colors
10015
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color0', 'rgba(0, 0, 0, 1)');
10016
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color1', 'rgba(0, 0, 0, 0.87)');
10017
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color2', 'rgba(0, 0, 0, 0.54)');
10018
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color3', 'rgba(0, 0, 0, 0.38)');
10019
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color0', 'rgba(255, 255, 255, 1)');
10020
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color1', 'rgba(255, 255, 255, 1)');
10021
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color2', 'rgba(255, 255, 255, 0.7)');
10022
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color3', 'rgba(255, 255, 255, 0.5)');
10023
+ // Content Font colors
10024
+ document.documentElement.style.setProperty('--mito-theme-content-font-color0', 'rgba(0, 0, 0, 1)');
10025
+ document.documentElement.style.setProperty('--mito-theme-content-font-color1', 'rgba(0, 0, 0, 0.87)');
10026
+ document.documentElement.style.setProperty('--mito-theme-content-font-color2', 'rgba(0, 0, 0, 0.54)');
10027
+ document.documentElement.style.setProperty('--mito-theme-content-font-color3', 'rgba(0, 0, 0, 0.38)');
10028
+ document.documentElement.style.setProperty('--mito-theme-content-link-color', '#0d47a1');
10029
+ document.documentElement.style.setProperty('--mito-theme-content-link-visited-color', '#7b1fa2');
10030
+ // Layout colors
10031
+ document.documentElement.style.setProperty('--mito-theme-layout-color0', 'white');
10032
+ document.documentElement.style.setProperty('--mito-theme-layout-color1', 'white');
10033
+ document.documentElement.style.setProperty('--mito-theme-layout-color2', '#eee');
10034
+ document.documentElement.style.setProperty('--mito-theme-layout-color3', '#bdbdbd');
10035
+ document.documentElement.style.setProperty('--mito-theme-layout-color4', '#757575');
10036
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color0', '#111');
10037
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color1', '#212121');
10038
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color2', '#424242');
10039
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color3', '#616161');
10040
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color4', '#757575');
10041
+ // Brand colors (using purple variables from light theme)
10042
+ document.documentElement.style.setProperty('--mito-theme-brand-color0', 'var(--purple-900)');
10043
+ document.documentElement.style.setProperty('--mito-theme-brand-color1', 'var(--purple-700)');
10044
+ document.documentElement.style.setProperty('--mito-theme-brand-color2', 'var(--purple-500)');
10045
+ document.documentElement.style.setProperty('--mito-theme-brand-color3', 'var(--purple-300)');
10046
+ document.documentElement.style.setProperty('--mito-theme-brand-color4', 'var(--purple-300)');
10047
+ // Primary button colors (light mode: blue theme to avoid pinkish-purple)
10048
+ document.documentElement.style.setProperty('--mito-theme-button-background', 'var(--blue-300)');
10049
+ document.documentElement.style.setProperty('--mito-theme-button-border', 'var(--blue-900)');
10050
+ document.documentElement.style.setProperty('--mito-theme-button-text', 'var(--blue-900)');
10051
+ document.documentElement.style.setProperty('--mito-theme-button-hover-background', 'var(--blue-400)');
10052
+ // Cell editor colors
10053
+ document.documentElement.style.setProperty('--mito-theme-cell-editor-background', '#f5f5f5');
10054
+ document.documentElement.style.setProperty('--mito-theme-cell-editor-border-color', '#e0e0e0');
10055
+ document.documentElement.style.setProperty('--mito-theme-cell-editor-active-background', 'var(--mito-theme-layout-color0)');
10056
+ document.documentElement.style.setProperty('--mito-theme-cell-prompt-not-active-font-color', '#616161');
10057
+ document.documentElement.style.setProperty('--mito-theme-cell-outprompt-font-color', '#bf5b3d');
10058
+ // Notebook colors
10059
+ document.documentElement.style.setProperty('--mito-theme-notebook-select-background', 'var(--mito-theme-layout-color1)');
10060
+ document.documentElement.style.setProperty('--mito-theme-notebook-multiselected-color', '#e3f2fd');
10061
+ // Rendermime colors
10062
+ document.documentElement.style.setProperty('--mito-theme-rendermime-error-background', '#fdd');
10063
+ document.documentElement.style.setProperty('--mito-theme-rendermime-table-row-background', '#ebebeb');
10064
+ document.documentElement.style.setProperty('--mito-theme-rendermime-table-row-hover-background', '#e1f5fe');
10065
+ // Dialog colors
10066
+ document.documentElement.style.setProperty('--mito-theme-dialog-background', 'rgba(0, 0, 0, 0.25)');
10067
+ // Input field colors
10068
+ document.documentElement.style.setProperty('--mito-theme-input-background', '#f5f5f5');
10069
+ document.documentElement.style.setProperty('--mito-theme-input-border-color', 'var(--mito-theme-inverse-border-color)');
10070
+ // Editor colors
10071
+ document.documentElement.style.setProperty('--mito-theme-editor-selected-background', '#d9d9d9');
10072
+ document.documentElement.style.setProperty('--mito-theme-editor-selected-focused-background', '#d7d4f0');
10073
+ document.documentElement.style.setProperty('--mito-theme-editor-cursor-color', 'var(--mito-theme-ui-font-color0)');
10074
+ // Line number colors (grey/white/blue instead of pink)
10075
+ document.documentElement.style.setProperty('--mito-theme-line-number-color', '#92999F');
10076
+ // Code mirror colors
10077
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-keyword-color', '#008000');
10078
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-atom-color', '#88f');
10079
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-number-color', '#080');
10080
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-def-color', '#00f');
10081
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-variable-color', '#212121');
10082
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-variable-2-color', 'rgb(0, 54, 109)');
10083
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-variable-3-color', '#085');
10084
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-punctuation-color', '#05a');
10085
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-property-color', '#05a');
10086
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-operator-color', '#7800c2');
10087
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-comment-color', '#408080');
10088
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-string-color', '#ba2121');
10089
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-string-2-color', '#708');
10090
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-meta-color', '#a2f');
10091
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-qualifier-color', '#555');
10092
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-builtin-color', '#008000');
10093
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-bracket-color', '#997');
10094
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-tag-color', '#170');
10095
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-attribute-color', '#00c');
10096
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-header-color', 'blue');
10097
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-quote-color', '#090');
10098
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-link-color', '#00c');
10099
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-error-color', '#f00');
10100
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-hr-color', '#999');
10101
+ // Vega colors
10102
+ document.documentElement.style.setProperty('--mito-theme-vega-background', 'white');
10103
+ }
10104
+ /**
10105
+ * Set CSS variables for the dark theme
10106
+ */
10107
+ setColorsDark() {
10108
+ // Border colors
10109
+ document.documentElement.style.setProperty('--mito-theme-border-color0', '#3c3c3c');
10110
+ document.documentElement.style.setProperty('--mito-theme-border-color1', '#3c3c3c');
10111
+ document.documentElement.style.setProperty('--mito-theme-border-color2', '#2d2d2d');
10112
+ document.documentElement.style.setProperty('--mito-theme-border-color3', '#252526');
10113
+ document.documentElement.style.setProperty('--mito-theme-inverse-border-color', '#5a5a5a');
10114
+ // UI Font colors
10115
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color0', 'rgba(255, 255, 255, 1)');
10116
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color1', 'rgba(255, 255, 255, 0.87)');
10117
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color2', 'rgba(255, 255, 255, 0.6)');
10118
+ document.documentElement.style.setProperty('--mito-theme-ui-font-color3', 'rgba(255, 255, 255, 0.4)');
10119
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color0', 'rgba(0, 0, 0, 1)');
10120
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color1', 'rgba(0, 0, 0, 0.87)');
10121
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color2', 'rgba(0, 0, 0, 0.6)');
10122
+ document.documentElement.style.setProperty('--mito-theme-ui-inverse-font-color3', 'rgba(0, 0, 0, 0.4)');
10123
+ // Content Font colors
10124
+ document.documentElement.style.setProperty('--mito-theme-content-font-color0', 'rgba(255, 255, 255, 1)');
10125
+ document.documentElement.style.setProperty('--mito-theme-content-font-color1', 'rgba(255, 255, 255, 0.87)');
10126
+ document.documentElement.style.setProperty('--mito-theme-content-font-color2', 'rgba(255, 255, 255, 0.6)');
10127
+ document.documentElement.style.setProperty('--mito-theme-content-font-color3', 'rgba(255, 255, 255, 0.4)');
10128
+ document.documentElement.style.setProperty('--mito-theme-content-link-color', '#7c93ee');
10129
+ document.documentElement.style.setProperty('--mito-theme-content-link-visited-color', '#b39ddb');
10130
+ // Layout colors
10131
+ document.documentElement.style.setProperty('--mito-theme-layout-color0', '#1a1a1a');
10132
+ document.documentElement.style.setProperty('--mito-theme-layout-color1', '#1e1e1e');
10133
+ document.documentElement.style.setProperty('--mito-theme-layout-color2', '#252526');
10134
+ document.documentElement.style.setProperty('--mito-theme-layout-color3', '#2d2d2d');
10135
+ document.documentElement.style.setProperty('--mito-theme-layout-color4', '#3c3c3c');
10136
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color0', '#ffffff');
10137
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color1', '#f0f0f0');
10138
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color2', '#d4d4d4');
10139
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color3', '#a0a0a0');
10140
+ document.documentElement.style.setProperty('--mito-theme-inverse-layout-color4', '#6e6e6e');
10141
+ // Brand colors (pink-purple theme for dark, starting with #C65FAA)
10142
+ document.documentElement.style.setProperty('--mito-theme-brand-color0', '#C65FAA');
10143
+ document.documentElement.style.setProperty('--mito-theme-brand-color1', '#D97BC0');
10144
+ document.documentElement.style.setProperty('--mito-theme-brand-color2', '#E8A3D5');
10145
+ document.documentElement.style.setProperty('--mito-theme-brand-color3', '#F4D1EA');
10146
+ document.documentElement.style.setProperty('--mito-theme-brand-color4', '#FAE8F5');
10147
+ // Primary button colors (dark mode: lighter brand background, dark brand border)
10148
+ document.documentElement.style.setProperty('--mito-theme-button-background', '#F4D1EA');
10149
+ document.documentElement.style.setProperty('--mito-theme-button-border', '#C65FAA');
10150
+ document.documentElement.style.setProperty('--mito-theme-button-text', 'rgba(0, 0, 0, 0.87)');
10151
+ document.documentElement.style.setProperty('--mito-theme-button-hover-background', '#FAE8F5');
10152
+ // Cell editor colors
10153
+ document.documentElement.style.setProperty('--mito-theme-cell-editor-background', '#1e1e1e');
10154
+ document.documentElement.style.setProperty('--mito-theme-cell-editor-border-color', '#3c3c3c');
10155
+ document.documentElement.style.setProperty('--mito-theme-cell-editor-active-background', '#252526');
10156
+ document.documentElement.style.setProperty('--mito-theme-cell-prompt-not-active-font-color', '#6e6e6e');
10157
+ document.documentElement.style.setProperty('--mito-theme-cell-outprompt-font-color', '#f59e0b');
10158
+ // Notebook colors
10159
+ document.documentElement.style.setProperty('--mito-theme-notebook-select-background', '#2d2d2d');
10160
+ document.documentElement.style.setProperty('--mito-theme-notebook-multiselected-color', 'rgba(198, 95, 170, 0.2)');
10161
+ // Rendermime colors
10162
+ document.documentElement.style.setProperty('--mito-theme-rendermime-error-background', 'rgba(244, 67, 54, 0.2)');
10163
+ document.documentElement.style.setProperty('--mito-theme-rendermime-table-row-background', '#252526');
10164
+ document.documentElement.style.setProperty('--mito-theme-rendermime-table-row-hover-background', '#2d2d2d');
10165
+ // Dialog colors
10166
+ document.documentElement.style.setProperty('--mito-theme-dialog-background', 'rgba(0, 0, 0, 0.5)');
10167
+ // Input field colors
10168
+ document.documentElement.style.setProperty('--mito-theme-input-background', '#2d2d2d');
10169
+ document.documentElement.style.setProperty('--mito-theme-input-border-color', '#3c3c3c');
10170
+ // Editor colors
10171
+ document.documentElement.style.setProperty('--mito-theme-editor-selected-background', '#3c3c3c');
10172
+ document.documentElement.style.setProperty('--mito-theme-editor-selected-focused-background', '#3d4a5c');
10173
+ document.documentElement.style.setProperty('--mito-theme-editor-cursor-color', '#ffffff');
10174
+ // Line number colors (grey/white/blue instead of pink)
10175
+ document.documentElement.style.setProperty('--mito-theme-line-number-color', '#92999F');
10176
+ // Code mirror colors
10177
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-keyword-color', '#c586c0');
10178
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-atom-color', '#b5cea8');
10179
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-number-color', '#b5cea8');
10180
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-def-color', '#dcdcaa');
10181
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-variable-color', '#9cdcfe');
10182
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-variable-2-color', '#4fc1ff');
10183
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-variable-3-color', '#4ec9b0');
10184
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-punctuation-color', '#d4d4d4');
10185
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-property-color', '#9cdcfe');
10186
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-operator-color', '#d4d4d4');
10187
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-comment-color', '#6a9955');
10188
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-string-color', '#ce9178');
10189
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-string-2-color', '#ce9178');
10190
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-meta-color', '#d4d4d4');
10191
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-qualifier-color', '#d4d4d4');
10192
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-builtin-color', '#4ec9b0');
10193
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-bracket-color', '#ffd700');
10194
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-tag-color', '#569cd6');
10195
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-attribute-color', '#9cdcfe');
10196
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-header-color', '#569cd6');
10197
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-quote-color', '#6a9955');
10198
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-link-color', '#569cd6');
10199
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-error-color', '#f44747');
10200
+ document.documentElement.style.setProperty('--mito-theme-mirror-editor-hr-color', '#6e6e6e');
10201
+ // Vega colors
10202
+ document.documentElement.style.setProperty('--mito-theme-vega-background', '#1e1e1e');
10203
+ }
10204
+ }
10205
+
10206
+
9554
10207
  /***/ }),
9555
10208
 
9556
10209
  /***/ "./lib/Extensions/NotebookFooter/NotebookFooter.js":
@@ -10845,6 +11498,7 @@ __webpack_require__.r(__webpack_exports__);
10845
11498
 
10846
11499
 
10847
11500
  const RulesForm = ({ formData, formError, onInputChange, onSubmit, onClose, isEditing }) => {
11501
+ var _a;
10848
11502
  const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
10849
11503
  const handleSubmit = async (e) => {
10850
11504
  e.preventDefault();
@@ -10865,13 +11519,20 @@ const RulesForm = ({ formData, formError, onInputChange, onSubmit, onClose, isEd
10865
11519
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "text", id: "name", name: "name", value: formData.name, onChange: onInputChange, placeholder: "Enter rule name", required: true })),
10866
11520
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "form-group" },
10867
11521
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { htmlFor: "description" }, "Rule Content"),
10868
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { id: "description", name: "description", value: formData.description, onChange: onInputChange, placeholder: "Enter or paste rule content here", rows: 30, required: true, className: "form-textarea" })),
10869
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "form-actions" },
10870
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "button-base button-gray", onClick: onClose, disabled: isLoading }, "Cancel"),
10871
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "submit", className: "button-base button-purple", disabled: isLoading }, isLoading ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
10872
- "Saving Rule",
10873
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { color: 'var(--purple-700)' } },
10874
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_3__["default"], null)))) : (isEditing ? 'Update Rule' : 'Add Rule')))));
11522
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { id: "description", name: "description", value: formData.description, onChange: onInputChange, placeholder: "Enter or paste rule content here", rows: 10, required: true, className: "form-textarea" })),
11523
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "rules-form-footer" },
11524
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "rules-form-footer-left" },
11525
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "form-group-checkbox" },
11526
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "checkbox", id: "isDefault", name: "isDefault", checked: (_a = formData.isDefault) !== null && _a !== void 0 ? _a : false, onChange: onInputChange }),
11527
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { htmlFor: "isDefault" }, "Default rule")),
11528
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("sub", { className: "rules-form-footer-sub" },
11529
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Default rules are auto-applied to every prompt."))),
11530
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "form-actions" },
11531
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "button-base button-gray", onClick: onClose, disabled: isLoading }, "Cancel"),
11532
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "submit", className: "button-base button-purple", disabled: isLoading }, isLoading ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
11533
+ "Saving Rule",
11534
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { color: 'var(--purple-700)' } },
11535
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_LoadingCircle__WEBPACK_IMPORTED_MODULE_3__["default"], null)))) : (isEditing ? 'Update Rule' : 'Add Rule'))))));
10875
11536
  };
10876
11537
 
10877
11538
 
@@ -10889,9 +11550,10 @@ __webpack_require__.r(__webpack_exports__);
10889
11550
  /* harmony export */ });
10890
11551
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "webpack/sharing/consume/default/react");
10891
11552
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
10892
- /* harmony import */ var _RulesForm__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RulesForm */ "./lib/Extensions/SettingsManager/rules/RulesForm.js");
10893
- /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
10894
- /* harmony import */ var _utils_fileName__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/fileName */ "./lib/utils/fileName.js");
11553
+ /* harmony import */ var _RulesForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RulesForm */ "./lib/Extensions/SettingsManager/rules/RulesForm.js");
11554
+ /* harmony import */ var _restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../restAPI/RestAPI */ "./lib/restAPI/RestAPI.js");
11555
+ /* harmony import */ var _utils_fileName__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/fileName */ "./lib/utils/fileName.js");
11556
+ /* harmony import */ var _style_button_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../style/button.css */ "./style/button.css");
10895
11557
  /*
10896
11558
  * Copyright (c) Saga Inc.
10897
11559
  * Distributed under the terms of the GNU Affero General Public License v3.0 License.
@@ -10900,19 +11562,23 @@ __webpack_require__.r(__webpack_exports__);
10900
11562
 
10901
11563
 
10902
11564
 
11565
+
10903
11566
  const RulesPage = () => {
10904
11567
  const [modalStatus, setModalStatus] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(undefined);
10905
11568
  const [rules, setRules] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
10906
11569
  const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
11570
+ const [editingRuleName, setEditingRuleName] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
10907
11571
  const [formData, setFormData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({
10908
11572
  name: '',
10909
- description: ''
11573
+ description: '',
11574
+ isDefault: false
10910
11575
  });
10911
11576
  const [formError, setFormError] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
11577
+ const [filterDefaultOnly, setFilterDefaultOnly] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
10912
11578
  const fetchRules = async () => {
10913
11579
  try {
10914
- const rules = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.getRules)();
10915
- setRules(rules.sort());
11580
+ const rulesList = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.getRules)();
11581
+ setRules(rulesList.sort((a, b) => a.name.localeCompare(b.name)));
10916
11582
  }
10917
11583
  catch (err) {
10918
11584
  setError(err instanceof Error ? err.message : 'An error occurred');
@@ -10922,35 +11588,66 @@ const RulesPage = () => {
10922
11588
  void fetchRules();
10923
11589
  }, []);
10924
11590
  const handleInputChange = (e) => {
10925
- const { name, value } = e.target;
11591
+ const target = e.target;
11592
+ const name = target.name;
11593
+ const value = target.type === 'checkbox'
11594
+ ? target.checked
11595
+ : target.value;
10926
11596
  setFormData(prev => ({ ...prev, [name]: value }));
10927
11597
  };
10928
11598
  const handleSubmit = async (e) => {
10929
11599
  e.preventDefault();
10930
- // Make sure tha the rule is a valid file name
10931
- if (!(0,_utils_fileName__WEBPACK_IMPORTED_MODULE_2__.isValidFileName)(formData.name)) {
10932
- setFormError('Invalid rule name. Rules must contain only alphanumeric characters, underscores, or hyphens.');
11600
+ const slugifiedName = (0,_utils_fileName__WEBPACK_IMPORTED_MODULE_3__.slugifyRuleName)(formData.name);
11601
+ if (!slugifiedName) {
11602
+ setFormError('Rule name is required. Use letters, numbers, spaces, hyphens, or underscores.');
10933
11603
  return;
10934
11604
  }
10935
- else {
10936
- setFormError(null);
11605
+ setFormError(null);
11606
+ await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.setRule)(slugifiedName, formData.description, formData.isDefault);
11607
+ if (editingRuleName && editingRuleName !== slugifiedName) {
11608
+ await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.deleteRule)(editingRuleName);
10937
11609
  }
10938
- await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.setRule)(formData.name, formData.description);
10939
11610
  setModalStatus(undefined);
11611
+ setEditingRuleName(null);
10940
11612
  setFormData({
10941
11613
  name: '',
10942
- description: ''
11614
+ description: '',
11615
+ isDefault: false
10943
11616
  });
10944
11617
  void fetchRules();
10945
11618
  };
10946
- const handleRuleClick = async (rule) => {
10947
- const ruleContent = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_1__.getRule)(rule);
11619
+ const handleRuleClick = async (ruleName) => {
11620
+ const ruleFile = ruleName.includes('.md') ? ruleName : `${ruleName}.md`;
11621
+ const { content: ruleContent, isDefault } = await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.getRule)(ruleFile);
11622
+ const nameWithoutExt = (0,_utils_fileName__WEBPACK_IMPORTED_MODULE_3__.stripFileEnding)(ruleFile);
11623
+ setEditingRuleName(nameWithoutExt);
10948
11624
  setFormData({
10949
- name: (0,_utils_fileName__WEBPACK_IMPORTED_MODULE_2__.stripFileEnding)(rule),
10950
- description: ruleContent || ''
11625
+ name: nameWithoutExt,
11626
+ description: ruleContent || '',
11627
+ isDefault
10951
11628
  });
10952
11629
  setModalStatus('edit rule');
10953
11630
  };
11631
+ const handleDeleteRule = async (e, ruleItem) => {
11632
+ e.stopPropagation();
11633
+ const ruleName = (0,_utils_fileName__WEBPACK_IMPORTED_MODULE_3__.stripFileEnding)(ruleItem.name);
11634
+ if (!window.confirm(`Are you sure you want to delete the rule "${ruleName}"?`)) {
11635
+ return;
11636
+ }
11637
+ try {
11638
+ await (0,_restAPI_RestAPI__WEBPACK_IMPORTED_MODULE_2__.deleteRule)(ruleName);
11639
+ if (editingRuleName === ruleName) {
11640
+ setModalStatus(undefined);
11641
+ setEditingRuleName(null);
11642
+ setFormData({ name: '', description: '', isDefault: false });
11643
+ }
11644
+ void fetchRules();
11645
+ }
11646
+ catch (err) {
11647
+ setError(err instanceof Error ? err.message : 'Failed to delete rule');
11648
+ }
11649
+ };
11650
+ const displayedRules = filterDefaultOnly ? rules.filter(r => r.isDefault) : rules;
10954
11651
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null,
10955
11652
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "settings-header" },
10956
11653
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", null, "Rules"),
@@ -10958,20 +11655,29 @@ const RulesPage = () => {
10958
11655
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("b", null, "\uFF0B Add Rule"))),
10959
11656
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Rules provide more context to Ai models to help them follow your preferences, adhere to your organization's style guides, learn niche topics, and be a better colleague."),
10960
11657
  error && react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "error" }, error),
10961
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "rules-list" }, rules && rules.length > 0 ? rules.map((rule) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: rule, className: "rule-item", onClick: () => handleRuleClick(rule) },
11658
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "rules-list-filter" },
11659
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: !filterDefaultOnly ? 'button-base button-gray rules-list-filter-active' : 'button-base button-gray', onClick: () => setFilterDefaultOnly(false) }, "All"),
11660
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: filterDefaultOnly ? 'button-base button-gray rules-list-filter-active' : 'button-base button-gray', onClick: () => setFilterDefaultOnly(true) }, "Default only")),
11661
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "rules-list" }, displayedRules.length > 0 ? displayedRules.map((ruleItem) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: ruleItem.name, className: "rule-item", onClick: () => handleRuleClick(ruleItem.name) },
10962
11662
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "rule-content" },
10963
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h4", { className: "rule-name" }, (0,_utils_fileName__WEBPACK_IMPORTED_MODULE_2__.stripFileEnding)(rule)),
10964
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "rule-description" }, "Click update to edit this rule's description and settings.")),
11663
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h4", { className: "rule-name" },
11664
+ (0,_utils_fileName__WEBPACK_IMPORTED_MODULE_3__.stripFileEnding)(ruleItem.name),
11665
+ ruleItem.isDefault && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "rule-badge" }, "Default")))),
10965
11666
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "rule-actions" },
10966
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "button-base button-gray" }, "Update"))))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "empty-state" },
10967
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "No rules created yet. Add your first rule to get started!")))),
11667
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "button-base button-gray" }, "Update"),
11668
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "button-base button-red", onClick: e => handleDeleteRule(e, ruleItem) }, "Delete"))))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "empty-state" },
11669
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, filterDefaultOnly
11670
+ ? 'No default rules. Mark a rule as default in the form to see it here.'
11671
+ : 'No rules created yet. Add your first rule to get started!')))),
10968
11672
  modalStatus && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "modal-overlay" },
10969
11673
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "modal-content modal-content-large", onClick: e => e.stopPropagation() },
10970
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_RulesForm__WEBPACK_IMPORTED_MODULE_3__.RulesForm, { formData: formData, formError: formError, onInputChange: handleInputChange, onSubmit: handleSubmit, onClose: () => {
11674
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_RulesForm__WEBPACK_IMPORTED_MODULE_4__.RulesForm, { formData: formData, formError: formError, onInputChange: handleInputChange, onSubmit: handleSubmit, onClose: () => {
10971
11675
  setModalStatus(undefined);
11676
+ setEditingRuleName(null);
10972
11677
  setFormData({
10973
11678
  name: '',
10974
- description: ''
11679
+ description: '',
11680
+ isDefault: false
10975
11681
  });
10976
11682
  }, isEditing: modalStatus === 'edit rule' }))))));
10977
11683
  };
@@ -12626,16 +13332,6 @@ const MODEL_MAPPINGS = [
12626
13332
  speed: 'Fast',
12627
13333
  complexityHandling: 'Medium'
12628
13334
  },
12629
- {
12630
- displayName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_DISPLAY_NAME,
12631
- fullName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.CLAUDE_SONNET_MODEL_NAME,
12632
- type: 'smart',
12633
- goodFor: [...GOOD_FOR_SMART],
12634
- provider: 'Anthropic',
12635
- tokenLimit: '1M',
12636
- speed: 'Medium',
12637
- complexityHandling: 'High'
12638
- },
12639
13335
  {
12640
13336
  displayName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.GEMINI_3_FLASH_DISPLAY_NAME,
12641
13337
  fullName: _utils_models__WEBPACK_IMPORTED_MODULE_3__.GEMINI_3_FLASH_MODEL_NAME,
@@ -14686,7 +15382,7 @@ __webpack_require__.r(__webpack_exports__);
14686
15382
  /* harmony import */ var _Extensions_SettingsManager_SettingsManagerPlugin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Extensions/SettingsManager/SettingsManagerPlugin */ "./lib/Extensions/SettingsManager/SettingsManagerPlugin.js");
14687
15383
  /* harmony import */ var _Extensions_VersionCheck__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Extensions/VersionCheck */ "./lib/Extensions/VersionCheck/index.js");
14688
15384
  /* harmony import */ var _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Extensions/NotebookFooter */ "./lib/Extensions/NotebookFooter/index.js");
14689
- /* harmony import */ var _Extensions_MitoThemeLight__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Extensions/MitoThemeLight */ "./lib/Extensions/MitoThemeLight/index.js");
15385
+ /* harmony import */ var _Extensions_MitoThemes__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Extensions/MitoThemes */ "./lib/Extensions/MitoThemes/index.js");
14690
15386
  /* harmony import */ var _Extensions_AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Extensions/AppManager/ManageAppsPlugin */ "./lib/Extensions/AppManager/ManageAppsPlugin.js");
14691
15387
  /* harmony import */ var _Extensions_ChartWizard_ChartWizardPlugin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Extensions/ChartWizard/ChartWizardPlugin */ "./lib/Extensions/ChartWizard/ChartWizardPlugin.js");
14692
15388
  /*
@@ -14722,7 +15418,7 @@ __webpack_require__.r(__webpack_exports__);
14722
15418
  _Extensions_VersionCheck__WEBPACK_IMPORTED_MODULE_9__.versionCheckPlugin,
14723
15419
  _Extensions_NotebookFooter__WEBPACK_IMPORTED_MODULE_10__["default"],
14724
15420
  _Extensions_AppManager_ManageAppsPlugin__WEBPACK_IMPORTED_MODULE_11__["default"],
14725
- _Extensions_MitoThemeLight__WEBPACK_IMPORTED_MODULE_12__["default"],
15421
+ _Extensions_MitoThemes__WEBPACK_IMPORTED_MODULE_12__["default"],
14726
15422
  _Extensions_ChartWizard_ChartWizardPlugin__WEBPACK_IMPORTED_MODULE_13__["default"]
14727
15423
  ]);
14728
15424
 
@@ -14739,6 +15435,7 @@ __webpack_require__.r(__webpack_exports__);
14739
15435
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14740
15436
  /* harmony export */ addChartField: () => (/* binding */ addChartField),
14741
15437
  /* harmony export */ convertChartCode: () => (/* binding */ convertChartCode),
15438
+ /* harmony export */ deleteRule: () => (/* binding */ deleteRule),
14742
15439
  /* harmony export */ getChatHistoryThread: () => (/* binding */ getChatHistoryThread),
14743
15440
  /* harmony export */ getChatHistoryThreads: () => (/* binding */ getChatHistoryThreads),
14744
15441
  /* harmony export */ getDatabaseConnections: () => (/* binding */ getDatabaseConnections),
@@ -14804,10 +15501,14 @@ const updateSettings = async (settingsKey, settingsValue) => {
14804
15501
  RULES ENDPOINTS
14805
15502
 
14806
15503
  ************************************/
14807
- const setRule = async (ruleName, ruleContent) => {
15504
+ const setRule = async (ruleName, ruleContent, isDefault) => {
15505
+ const body = { content: ruleContent };
15506
+ if (isDefault !== undefined) {
15507
+ body.is_default = isDefault;
15508
+ }
14808
15509
  const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`rules/${ruleName}`, {
14809
15510
  method: 'PUT',
14810
- body: JSON.stringify({ content: ruleContent }),
15511
+ body: JSON.stringify(body),
14811
15512
  });
14812
15513
  if (resp.error) {
14813
15514
  throw new Error(resp.error.message);
@@ -14815,19 +15516,31 @@ const setRule = async (ruleName, ruleContent) => {
14815
15516
  return resp.data || '';
14816
15517
  };
14817
15518
  const getRule = async (ruleName) => {
14818
- var _a;
15519
+ var _a, _b;
14819
15520
  const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`rules/${ruleName}`);
14820
15521
  if (resp.error) {
14821
15522
  throw new Error(resp.error.message);
14822
15523
  }
14823
- return (_a = resp.data) === null || _a === void 0 ? void 0 : _a.content;
15524
+ return {
15525
+ content: (_a = resp.data) === null || _a === void 0 ? void 0 : _a.content,
15526
+ isDefault: Boolean((_b = resp.data) === null || _b === void 0 ? void 0 : _b.is_default)
15527
+ };
14824
15528
  };
14825
15529
  const getRules = async () => {
14826
15530
  const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`rules`);
14827
15531
  if (resp.error) {
14828
15532
  throw new Error(resp.error.message);
14829
15533
  }
14830
- return resp.data || [];
15534
+ const data = resp.data || [];
15535
+ return data.map(r => ({ name: r.name, isDefault: Boolean(r.is_default) }));
15536
+ };
15537
+ const deleteRule = async (ruleName) => {
15538
+ const resp = await (0,_utils__WEBPACK_IMPORTED_MODULE_0__.requestAPI)(`rules/${ruleName}`, {
15539
+ method: 'DELETE',
15540
+ });
15541
+ if (resp.error) {
15542
+ throw new Error(resp.error.message);
15543
+ }
14831
15544
  };
14832
15545
  /************************************
14833
15546
 
@@ -16154,6 +16867,7 @@ const isErrorFixupMessage = (promptType, message, messageContent) => {
16154
16867
  __webpack_require__.r(__webpack_exports__);
16155
16868
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
16156
16869
  /* harmony export */ isValidFileName: () => (/* binding */ isValidFileName),
16870
+ /* harmony export */ slugifyRuleName: () => (/* binding */ slugifyRuleName),
16157
16871
  /* harmony export */ stripFileEnding: () => (/* binding */ stripFileEnding)
16158
16872
  /* harmony export */ });
16159
16873
  /*
@@ -16165,6 +16879,19 @@ __webpack_require__.r(__webpack_exports__);
16165
16879
  const isValidFileName = (fileName) => {
16166
16880
  return /^[a-zA-Z0-9_-]+$/.test(fileName);
16167
16881
  };
16882
+ /**
16883
+ * Converts a rule name to a valid file-name slug: spaces and other separators
16884
+ * become hyphens, invalid characters removed, multiple hyphens collapsed.
16885
+ */
16886
+ const slugifyRuleName = (name) => {
16887
+ return name
16888
+ .trim()
16889
+ .replace(/\s+/g, '-')
16890
+ .replace(/[^a-zA-Z0-9_-]+/g, '-')
16891
+ .replace(/-+/g, '-')
16892
+ .replace(/^-|-$/g, '')
16893
+ .toLowerCase();
16894
+ };
16168
16895
  const stripFileEnding = (rule) => {
16169
16896
  return rule.replace('.md', '');
16170
16897
  };
@@ -16446,7 +17173,6 @@ async function getAvailableModels() {
16446
17173
  return [
16447
17174
  GPT_4_1_MODEL_NAME,
16448
17175
  GPT_5_2_MODEL_NAME,
16449
- CLAUDE_SONNET_MODEL_NAME,
16450
17176
  CLAUDE_HAIKU_MODEL_NAME,
16451
17177
  GEMINI_3_FLASH_MODEL_NAME,
16452
17178
  GEMINI_3_PRO_MODEL_NAME,
@@ -18411,8 +19137,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
18411
19137
 
18412
19138
  .add-field-container {
18413
19139
  margin-top: 16px;
18414
- padding-top: 16px;
18415
- border-top: 1px solid #e0e0e0;
18416
19140
  }
18417
19141
 
18418
19142
  .add-field-button {
@@ -18431,7 +19155,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
18431
19155
  font-family: inherit;
18432
19156
  box-sizing: border-box;
18433
19157
  }
18434
- `, "",{"version":3,"sources":["webpack://./style/AddFieldButton.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,gBAAgB;IAChB,iBAAiB;IACjB,6BAA6B;AACjC;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;AAC1B","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.add-field-container {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e0e0e0;\n}\n\n.add-field-button {\n width: 100%;\n}\n\n.add-field-dialog-textarea {\n width: 100%;\n padding: 8px;\n margin-top: 10px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 4px;\n min-height: 100px;\n resize: vertical;\n font-family: inherit;\n box-sizing: border-box;\n}\n"],"sourceRoot":""}]);
19158
+ `, "",{"version":3,"sources":["webpack://./style/AddFieldButton.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,gBAAgB;AACpB;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;AAC1B","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.add-field-container {\n margin-top: 16px;\n}\n\n.add-field-button {\n width: 100%;\n}\n\n.add-field-dialog-textarea {\n width: 100%;\n padding: 8px;\n margin-top: 10px;\n font-size: 14px;\n border: 1px solid #ccc;\n border-radius: 4px;\n min-height: 100px;\n resize: vertical;\n font-family: inherit;\n box-sizing: border-box;\n}\n"],"sourceRoot":""}]);
18435
19159
  // Exports
18436
19160
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
18437
19161
 
@@ -20217,6 +20941,63 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
20217
20941
  box-sizing: border-box;
20218
20942
  }
20219
20943
 
20944
+ .chart-wizard-number-slider-row {
20945
+ display: flex;
20946
+ align-items: center;
20947
+ gap: 12px;
20948
+ width: 100%;
20949
+ }
20950
+
20951
+ .chart-wizard-range-slider {
20952
+ flex: 1;
20953
+ min-width: 0;
20954
+ height: 6px;
20955
+ -webkit-appearance: none;
20956
+ appearance: none;
20957
+ background: var(--jp-border-color2);
20958
+ border-radius: 3px;
20959
+ outline: none;
20960
+ }
20961
+
20962
+ .chart-wizard-range-slider::-webkit-slider-thumb {
20963
+ -webkit-appearance: none;
20964
+ appearance: none;
20965
+ width: 16px;
20966
+ height: 16px;
20967
+ border-radius: 50%;
20968
+ background: var(--jp-brand-color1);
20969
+ cursor: pointer;
20970
+ border: none;
20971
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
20972
+ }
20973
+
20974
+ .chart-wizard-range-slider::-moz-range-thumb {
20975
+ width: 16px;
20976
+ height: 16px;
20977
+ border-radius: 50%;
20978
+ background: var(--jp-brand-color1);
20979
+ cursor: pointer;
20980
+ border: none;
20981
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
20982
+ }
20983
+
20984
+ .chart-wizard-range-slider:focus {
20985
+ outline: none;
20986
+ }
20987
+
20988
+ .chart-wizard-range-slider:focus::-webkit-slider-thumb {
20989
+ box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.25);
20990
+ }
20991
+
20992
+ .chart-wizard-range-slider:focus::-moz-range-thumb {
20993
+ box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.25);
20994
+ }
20995
+
20996
+ .chart-wizard-number-input-narrow {
20997
+ width: 72px;
20998
+ flex-shrink: 0;
20999
+ }
21000
+
20220
21001
  .chart-wizard-color-container {
20221
21002
  display: flex;
20222
21003
  gap: 8px;
@@ -20247,6 +21028,27 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
20247
21028
  min-height: 0;
20248
21029
  }
20249
21030
 
21031
+ .chart-wizard-export-section {
21032
+ margin-top: 24px;
21033
+ padding-top: 20px;
21034
+ border-top: 1px solid var(--jp-border-color2);
21035
+ }
21036
+
21037
+ .chart-wizard-export-format-row {
21038
+ margin-bottom: 12px;
21039
+ }
21040
+
21041
+ .chart-wizard-export-format-row .toggle-button-container {
21042
+ width: 100%;
21043
+ }
21044
+
21045
+ .chart-wizard-section-heading {
21046
+ font-size: 14px;
21047
+ font-weight: 600;
21048
+ margin: 0 0 12px 0;
21049
+ color: var(--jp-content-font-color1);
21050
+ }
21051
+
20250
21052
  .chart-wizard-empty-state,
20251
21053
  .chart-wizard-no-config {
20252
21054
  flex: 1;
@@ -20327,7 +21129,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
20327
21129
 
20328
21130
  .chart-wizard-warning-button:active {
20329
21131
  background-color: var(--yellow-300);
20330
- }`, "",{"version":3,"sources":["webpack://./style/ChartWizardWidget.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,aAAa;IACb,sBAAsB;IACtB,sBAAsB;AAC1B;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,mBAAmB;IACnB,QAAQ;AACZ;;AAEA;IACI,mBAAmB;IACnB,mBAAmB;IACnB,8BAA8B;IAC9B,mBAAmB;IACnB,SAAS;AACb;;AAEA;IACI,oCAAoC;IACpC,eAAe;IACf,gBAAgB;IAChB,oBAAoB;AACxB;;AAEA;IACI,OAAO;IACP,SAAS;IACT,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,eAAe;IACf,cAAc;AAClB;;AAEA;IACI,kBAAkB;IAClB,UAAU;IACV,eAAe;IACf,QAAQ;IACR,SAAS;IACT,SAAS;AACb;;AAEA;IACI,kBAAkB;IAClB,qBAAqB;IACrB,WAAW;IACX,YAAY;IACZ,yCAAyC;IACzC,mBAAmB;IACnB,sCAAsC;IACtC,sBAAsB;AAC1B;;AAEA;IACI,WAAW;IACX,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,uBAAuB;IACvB,kBAAkB;IAClB,+BAA+B;IAC/B,wCAAwC;AAC5C;;AAEA;IACI,wCAAwC;AAC5C;;AAEA;IACI,2BAA2B;AAC/B;;AAEA;IACI,6CAA6C;AACjD;;AAEA;IACI,yCAAyC;AAC7C;;AAEA;IACI,wCAAwC;AAC5C;;AAEA;;;;IAII,WAAW;IACX,sBAAsB;AAC1B;;AAEA;IACI,aAAa;IACb,QAAQ;IACR,WAAW;AACf;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,OAAO;AACX;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,QAAQ;IACR,WAAW;AACf;;AAEA;IACI,OAAO;AACX;;AAEA;IACI,OAAO;IACP,aAAa;AACjB;;AAEA;;IAEI,OAAO;IACP,aAAa;IACb,sBAAsB;IACtB,uBAAuB;AAC3B;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;AACpB;;AAEA;IACI,kBAAkB;IAClB,MAAM;IACN,OAAO;IACP,QAAQ;IACR,gFAAgF;IAChF,gBAAgB;IAChB,0CAA0C;IAC1C,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,aAAa;IACb,mBAAmB;AACvB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,WAAW;AACf;;AAEA;IACI,mCAAmC;IACnC,wBAAwB;IACxB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,eAAe;IACf,gBAAgB;IAChB,mCAAmC;IACnC,aAAa;IACb,sBAAsB;IACtB,SAAS;AACb;;AAEA;IACI,OAAO;AACX;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,mCAAmC;IACnC,wBAAwB;IACxB,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,sCAAsC;AAC1C;;AAEA;IACI,mCAAmC;AACvC;;AAEA;IACI,mCAAmC;AACvC","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.chart-wizard-widget {\n padding: 10px;\n height: 100%;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.chart-wizard-input-row {\n display: flex;\n flex-direction: column;\n margin-bottom: 15px;\n gap: 5px;\n}\n\n.chart-wizard-boolean-row {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n gap: 12px;\n}\n\n.chart-wizard-input-label {\n color: var(--jp-content-font-color2);\n font-size: 12px;\n font-weight: 500;\n text-transform: none;\n}\n\n.chart-wizard-boolean-label {\n flex: 1;\n margin: 0;\n cursor: pointer;\n}\n\n.chart-wizard-toggle-container {\n position: relative;\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.chart-wizard-toggle-input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n width: 0;\n height: 0;\n margin: 0;\n}\n\n.chart-wizard-toggle-slider {\n position: relative;\n display: inline-block;\n width: 44px;\n height: 24px;\n background-color: var(--jp-border-color2);\n border-radius: 12px;\n transition: background-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.chart-wizard-toggle-slider::before {\n content: '';\n position: absolute;\n width: 20px;\n height: 20px;\n left: 2px;\n top: 2px;\n background-color: white;\n border-radius: 50%;\n transition: transform 0.3s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider {\n background-color: var(--jp-brand-color1);\n}\n\n.chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider::before {\n transform: translateX(20px);\n}\n\n.chart-wizard-toggle-input:focus + .chart-wizard-toggle-slider {\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.2);\n}\n\n.chart-wizard-toggle-input:hover + .chart-wizard-toggle-slider {\n background-color: var(--jp-border-color1);\n}\n\n.chart-wizard-toggle-input:checked:hover + .chart-wizard-toggle-slider {\n background-color: var(--jp-brand-color0);\n}\n\n.chart-wizard-number-input,\n.chart-wizard-text-input,\n.chart-wizard-color-input,\n.chart-wizard-tuple-input {\n width: 100%;\n box-sizing: border-box;\n}\n\n.chart-wizard-color-container {\n display: flex;\n gap: 8px;\n width: 100%;\n}\n\n.chart-wizard-color-picker {\n flex-shrink: 0;\n}\n\n.chart-wizard-color-input {\n flex: 1;\n}\n\n.chart-wizard-tuple-container {\n display: flex;\n align-items: center;\n gap: 5px;\n width: 100%;\n}\n\n.chart-wizard-tuple-input {\n flex: 1;\n}\n\n.chart-wizard-config-container {\n flex: 1;\n min-height: 0;\n}\n\n.chart-wizard-empty-state,\n.chart-wizard-no-config {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.chart-wizard-no-config p {\n text-align: center;\n}\n\n.chart-wizard-loading-dots {\n display: inline-block;\n min-width: 1.5em;\n text-align: left;\n}\n\n.chart-wizard-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n /* Height is set dynamically via inline style to cover full scrollable content */\n min-height: 100%;\n background-color: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n pointer-events: all;\n}\n\n.chart-wizard-overlay-text {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n}\n\n.chart-wizard-warning {\n background-color: var(--yellow-100);\n color: var(--yellow-900);\n padding: 10px 12px;\n border-radius: 4px;\n margin-bottom: 15px;\n font-size: 13px;\n line-height: 1.4;\n border: 1px solid var(--yellow-300);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.chart-wizard-warning-content {\n flex: 1;\n}\n\n.chart-wizard-warning strong {\n font-weight: 600;\n}\n\n.chart-wizard-warning-button {\n background-color: var(--yellow-600);\n color: var(--yellow-900);\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n align-self: flex-start;\n transition: background-color 0.2s ease;\n}\n\n.chart-wizard-warning-button:hover {\n background-color: var(--yellow-500);\n}\n\n.chart-wizard-warning-button:active {\n background-color: var(--yellow-300);\n}"],"sourceRoot":""}]);
21132
+ }`, "",{"version":3,"sources":["webpack://./style/ChartWizardWidget.css"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.chart-wizard-widget {\n padding: 10px;\n height: 100%;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.chart-wizard-input-row {\n display: flex;\n flex-direction: column;\n margin-bottom: 15px;\n gap: 5px;\n}\n\n.chart-wizard-boolean-row {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n gap: 12px;\n}\n\n.chart-wizard-input-label {\n color: var(--jp-content-font-color2);\n font-size: 12px;\n font-weight: 500;\n text-transform: none;\n}\n\n.chart-wizard-boolean-label {\n flex: 1;\n margin: 0;\n cursor: pointer;\n}\n\n.chart-wizard-toggle-container {\n position: relative;\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.chart-wizard-toggle-input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n width: 0;\n height: 0;\n margin: 0;\n}\n\n.chart-wizard-toggle-slider {\n position: relative;\n display: inline-block;\n width: 44px;\n height: 24px;\n background-color: var(--jp-border-color2);\n border-radius: 12px;\n transition: background-color 0.3s ease;\n box-sizing: border-box;\n}\n\n.chart-wizard-toggle-slider::before {\n content: '';\n position: absolute;\n width: 20px;\n height: 20px;\n left: 2px;\n top: 2px;\n background-color: white;\n border-radius: 50%;\n transition: transform 0.3s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider {\n background-color: var(--jp-brand-color1);\n}\n\n.chart-wizard-toggle-input:checked + .chart-wizard-toggle-slider::before {\n transform: translateX(20px);\n}\n\n.chart-wizard-toggle-input:focus + .chart-wizard-toggle-slider {\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.2);\n}\n\n.chart-wizard-toggle-input:hover + .chart-wizard-toggle-slider {\n background-color: var(--jp-border-color1);\n}\n\n.chart-wizard-toggle-input:checked:hover + .chart-wizard-toggle-slider {\n background-color: var(--jp-brand-color0);\n}\n\n.chart-wizard-number-input,\n.chart-wizard-text-input,\n.chart-wizard-color-input,\n.chart-wizard-tuple-input {\n width: 100%;\n box-sizing: border-box;\n}\n\n.chart-wizard-number-slider-row {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n}\n\n.chart-wizard-range-slider {\n flex: 1;\n min-width: 0;\n height: 6px;\n -webkit-appearance: none;\n appearance: none;\n background: var(--jp-border-color2);\n border-radius: 3px;\n outline: none;\n}\n\n.chart-wizard-range-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--jp-brand-color1);\n cursor: pointer;\n border: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.chart-wizard-range-slider::-moz-range-thumb {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--jp-brand-color1);\n cursor: pointer;\n border: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.chart-wizard-range-slider:focus {\n outline: none;\n}\n\n.chart-wizard-range-slider:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.25);\n}\n\n.chart-wizard-range-slider:focus::-moz-range-thumb {\n box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.25);\n}\n\n.chart-wizard-number-input-narrow {\n width: 72px;\n flex-shrink: 0;\n}\n\n.chart-wizard-color-container {\n display: flex;\n gap: 8px;\n width: 100%;\n}\n\n.chart-wizard-color-picker {\n flex-shrink: 0;\n}\n\n.chart-wizard-color-input {\n flex: 1;\n}\n\n.chart-wizard-tuple-container {\n display: flex;\n align-items: center;\n gap: 5px;\n width: 100%;\n}\n\n.chart-wizard-tuple-input {\n flex: 1;\n}\n\n.chart-wizard-config-container {\n flex: 1;\n min-height: 0;\n}\n\n.chart-wizard-export-section {\n margin-top: 24px;\n padding-top: 20px;\n border-top: 1px solid var(--jp-border-color2);\n}\n\n.chart-wizard-export-format-row {\n margin-bottom: 12px;\n}\n\n.chart-wizard-export-format-row .toggle-button-container {\n width: 100%;\n}\n\n.chart-wizard-section-heading {\n font-size: 14px;\n font-weight: 600;\n margin: 0 0 12px 0;\n color: var(--jp-content-font-color1);\n}\n\n.chart-wizard-empty-state,\n.chart-wizard-no-config {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.chart-wizard-no-config p {\n text-align: center;\n}\n\n.chart-wizard-loading-dots {\n display: inline-block;\n min-width: 1.5em;\n text-align: left;\n}\n\n.chart-wizard-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n /* Height is set dynamically via inline style to cover full scrollable content */\n min-height: 100%;\n background-color: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n pointer-events: all;\n}\n\n.chart-wizard-overlay-text {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n}\n\n.chart-wizard-warning {\n background-color: var(--yellow-100);\n color: var(--yellow-900);\n padding: 10px 12px;\n border-radius: 4px;\n margin-bottom: 15px;\n font-size: 13px;\n line-height: 1.4;\n border: 1px solid var(--yellow-300);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.chart-wizard-warning-content {\n flex: 1;\n}\n\n.chart-wizard-warning strong {\n font-weight: 600;\n}\n\n.chart-wizard-warning-button {\n background-color: var(--yellow-600);\n color: var(--yellow-900);\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n align-self: flex-start;\n transition: background-color 0.2s ease;\n}\n\n.chart-wizard-warning-button:hover {\n background-color: var(--yellow-500);\n}\n\n.chart-wizard-warning-button:active {\n background-color: var(--yellow-300);\n}"],"sourceRoot":""}]);
20331
21133
  // Exports
20332
21134
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
20333
21135
 
@@ -22412,12 +23214,11 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
22412
23214
 
22413
23215
  .model-option:hover {
22414
23216
  background-color: var(--jp-layout-color2);
22415
- color: var(--purple-700);
22416
23217
  }
22417
23218
 
22418
23219
  .model-option.selected {
22419
23220
  background-color: var(--jp-layout-color2);
22420
- color: var(--purple-700);
23221
+ color: var(--jp-brand-color2);
22421
23222
  }
22422
23223
 
22423
23224
  /* When inside chat-controls - ensure proper alignment with other controls */
@@ -22573,7 +23374,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
22573
23374
 
22574
23375
  .model-tooltip-bullet-item:last-child {
22575
23376
  margin-bottom: 0;
22576
- }`, "",{"version":3,"sources":["webpack://./style/ModelSelector.css"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* ModelSelector.css - responsive design with compact mode */\n\n.model-selector {\n position: relative;\n flex: 0 0 auto;\n margin: 0 8px;\n height: 20px; /* Match height of other elements */\n display: flex;\n align-items: center; /* Center vertically */\n color: var(--jp-ui-font-color2);\n}\n\n.model-selector:hover {\n color: var(--jp-ui-font-color1);\n}\n\n.model-selector-dropdown {\n position: relative;\n height: 20px; /* Fixed height to match other elements */\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center; /* Ensure content is vertically centered */\n width: min-content;\n max-width: 18ch;\n}\n\n\n.selected-model {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 0 8px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n line-height: 1;\n}\n\n.dropdown-arrow {\n font-size: 8px;\n transition: transform 0.2s;\n margin-left: 4px;\n flex-shrink: 0; /* Prevent arrow from shrinking */\n}\n\n/* Model options dropdown */\n.model-options {\n position: absolute;\n bottom: 100%;\n max-height: 180px;\n overflow-y: auto;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 4px;\n margin-bottom: 4px;\n box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n width: auto;\n}\n\n.model-option {\n padding: 4px 8px;\n font-size: 12px;\n /* Keep this size for readability */\n color: var(--jp-content-font-color1);\n cursor: pointer;\n transition: background-color 0.2s;\n white-space: nowrap;\n /* Prevent text wrapping */\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.model-option-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-type-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n opacity: 0.7;\n}\n\n.model-option:hover {\n background-color: var(--jp-layout-color2);\n color: var(--purple-700);\n}\n\n.model-option.selected {\n background-color: var(--jp-layout-color2);\n color: var(--purple-700);\n}\n\n/* When inside chat-controls - ensure proper alignment with other controls */\n.chat-controls .model-selector {\n height: 20px;\n display: flex;\n align-items: center;\n}\n\n.chat-controls .model-selector-dropdown {\n height: 20px;\n align-self: center;\n}\n\n/* Ensure dropdown appears above other elements */\n.model-options {\n z-index: 1010;\n /* Higher z-index to ensure visibility */\n}\n\n.model-name {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: bottom;\n}\n\n/* On wider screens, show only the name of the model*/\n.model-icon {\n display: none;\n}\n\n.model-name {\n display: inline;\n}\n\n/* On compact screens, show only the icon */\n@container (max-width: 260px) {\n\n /* Shift the dropdown to the left to help prevent right-edge overflow */\n .model-options {\n left: -40px;\n }\n\n .model-icon {\n display: inline;\n }\n\n .model-name {\n display: none;\n }\n}\n\n/* Model tooltip - appears to the right of the dropdown, rendered via portal */\n.model-tooltip {\n position: fixed;\n top: var(--tooltip-top, 200px);\n left: var(--tooltip-left, 200px);\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 4px;\n padding: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10000; /* High z-index to appear above Jupyter notebook */\n width: 280px;\n pointer-events: none; /* Prevent tooltip from blocking mouse events */\n}\n\n.model-tooltip-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.model-tooltip-header {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.model-tooltip-title-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.model-tooltip-title-icon {\n flex-shrink: 0;\n opacity: 0.8;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.model-tooltip-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--jp-content-font-color1);\n line-height: 1.2;\n}\n\n.model-tooltip-metadata {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px 12px;\n font-size: 11px;\n}\n\n.model-tooltip-metadata-item {\n display: flex;\n gap: 4px;\n}\n\n.model-tooltip-metadata-label {\n color: var(--jp-content-font-color2);\n font-weight: 500;\n}\n\n.model-tooltip-metadata-value {\n color: var(--jp-content-font-color1);\n font-weight: 600;\n}\n\n.model-tooltip-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.model-tooltip-section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--jp-content-font-color1);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.model-tooltip-bullet-list {\n margin: 0;\n padding-left: 16px;\n list-style-type: disc;\n}\n\n.model-tooltip-bullet-item {\n font-size: 12px;\n color: var(--jp-content-font-color2);\n line-height: 1.5;\n margin-bottom: 4px;\n}\n\n.model-tooltip-bullet-item:last-child {\n margin-bottom: 0;\n}"],"sourceRoot":""}]);
23377
+ }`, "",{"version":3,"sources":["webpack://./style/ModelSelector.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF,4DAA4D;;AAE5D;EACE,kBAAkB;EAClB,cAAc;EACd,aAAa;EACb,YAAY,EAAE,mCAAmC;EACjD,aAAa;EACb,mBAAmB,EAAE,sBAAsB;EAC3C,+BAA+B;AACjC;;AAEA;EACE,+BAA+B;AACjC;;AAEA;EACE,kBAAkB;EAClB,YAAY,EAAE,yCAAyC;EACvD,kBAAkB;EAClB,eAAe;EACf,aAAa;EACb,mBAAmB,EAAE,0CAA0C;EAC/D,kBAAkB;EAClB,eAAe;AACjB;;;AAGA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,WAAW;EACX,YAAY;EACZ,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,WAAW;EACX,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,cAAc;EACd,0BAA0B;EAC1B,gBAAgB;EAChB,cAAc,EAAE,iCAAiC;AACnD;;AAEA,2BAA2B;AAC3B;EACE,kBAAkB;EAClB,YAAY;EACZ,iBAAiB;EACjB,gBAAgB;EAChB,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,kBAAkB;EAClB,yCAAyC;EACzC,aAAa;EACb,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,mCAAmC;EACnC,oCAAoC;EACpC,eAAe;EACf,iCAAiC;EACjC,mBAAmB;EACnB,0BAA0B;EAC1B,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,QAAQ;AACV;;AAEA;EACE,OAAO;EACP,YAAY;EACZ,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,cAAc;EACd,YAAY;AACd;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,yCAAyC;EACzC,6BAA6B;AAC/B;;AAEA,4EAA4E;AAC5E;EACE,YAAY;EACZ,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,YAAY;EACZ,kBAAkB;AACpB;;AAEA,iDAAiD;AACjD;EACE,aAAa;EACb,wCAAwC;AAC1C;;AAEA;EACE,qBAAqB;EACrB,gBAAgB;EAChB,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,sBAAsB;AACxB;;AAEA,qDAAqD;AACrD;EACE,aAAa;AACf;;AAEA;EACE,eAAe;AACjB;;AAEA,2CAA2C;AAC3C;;EAEE,uEAAuE;EACvE;IACE,WAAW;EACb;;EAEA;IACE,eAAe;EACjB;;EAEA;IACE,aAAa;EACf;AACF;;AAEA,8EAA8E;AAC9E;EACE,eAAe;EACf,8BAA8B;EAC9B,gCAAgC;EAChC,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,aAAa;EACb,yCAAyC;EACzC,cAAc,EAAE,kDAAkD;EAClE,YAAY;EACZ,oBAAoB,EAAE,+CAA+C;AACvE;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,SAAS;AACX;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,QAAQ;AACV;;AAEA;EACE,cAAc;EACd,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,cAAc;AAChB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,oCAAoC;EACpC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,8BAA8B;EAC9B,aAAa;EACb,eAAe;AACjB;;AAEA;EACE,aAAa;EACb,QAAQ;AACV;;AAEA;EACE,oCAAoC;EACpC,gBAAgB;AAClB;;AAEA;EACE,oCAAoC;EACpC,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,QAAQ;AACV;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,oCAAoC;EACpC,yBAAyB;EACzB,qBAAqB;AACvB;;AAEA;EACE,SAAS;EACT,kBAAkB;EAClB,qBAAqB;AACvB;;AAEA;EACE,eAAe;EACf,oCAAoC;EACpC,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* ModelSelector.css - responsive design with compact mode */\n\n.model-selector {\n position: relative;\n flex: 0 0 auto;\n margin: 0 8px;\n height: 20px; /* Match height of other elements */\n display: flex;\n align-items: center; /* Center vertically */\n color: var(--jp-ui-font-color2);\n}\n\n.model-selector:hover {\n color: var(--jp-ui-font-color1);\n}\n\n.model-selector-dropdown {\n position: relative;\n height: 20px; /* Fixed height to match other elements */\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center; /* Ensure content is vertically centered */\n width: min-content;\n max-width: 18ch;\n}\n\n\n.selected-model {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n padding: 0 8px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n line-height: 1;\n}\n\n.dropdown-arrow {\n font-size: 8px;\n transition: transform 0.2s;\n margin-left: 4px;\n flex-shrink: 0; /* Prevent arrow from shrinking */\n}\n\n/* Model options dropdown */\n.model-options {\n position: absolute;\n bottom: 100%;\n max-height: 180px;\n overflow-y: auto;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 4px;\n margin-bottom: 4px;\n box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n width: auto;\n}\n\n.model-option {\n padding: 4px 8px;\n font-size: 12px;\n /* Keep this size for readability */\n color: var(--jp-content-font-color1);\n cursor: pointer;\n transition: background-color 0.2s;\n white-space: nowrap;\n /* Prevent text wrapping */\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.model-option-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.model-type-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n opacity: 0.7;\n}\n\n.model-option:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.model-option.selected {\n background-color: var(--jp-layout-color2);\n color: var(--jp-brand-color2);\n}\n\n/* When inside chat-controls - ensure proper alignment with other controls */\n.chat-controls .model-selector {\n height: 20px;\n display: flex;\n align-items: center;\n}\n\n.chat-controls .model-selector-dropdown {\n height: 20px;\n align-self: center;\n}\n\n/* Ensure dropdown appears above other elements */\n.model-options {\n z-index: 1010;\n /* Higher z-index to ensure visibility */\n}\n\n.model-name {\n display: inline-block;\n max-width: 120px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n vertical-align: bottom;\n}\n\n/* On wider screens, show only the name of the model*/\n.model-icon {\n display: none;\n}\n\n.model-name {\n display: inline;\n}\n\n/* On compact screens, show only the icon */\n@container (max-width: 260px) {\n\n /* Shift the dropdown to the left to help prevent right-edge overflow */\n .model-options {\n left: -40px;\n }\n\n .model-icon {\n display: inline;\n }\n\n .model-name {\n display: none;\n }\n}\n\n/* Model tooltip - appears to the right of the dropdown, rendered via portal */\n.model-tooltip {\n position: fixed;\n top: var(--tooltip-top, 200px);\n left: var(--tooltip-left, 200px);\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 4px;\n padding: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 10000; /* High z-index to appear above Jupyter notebook */\n width: 280px;\n pointer-events: none; /* Prevent tooltip from blocking mouse events */\n}\n\n.model-tooltip-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.model-tooltip-header {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.model-tooltip-title-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.model-tooltip-title-icon {\n flex-shrink: 0;\n opacity: 0.8;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.model-tooltip-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--jp-content-font-color1);\n line-height: 1.2;\n}\n\n.model-tooltip-metadata {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px 12px;\n font-size: 11px;\n}\n\n.model-tooltip-metadata-item {\n display: flex;\n gap: 4px;\n}\n\n.model-tooltip-metadata-label {\n color: var(--jp-content-font-color2);\n font-weight: 500;\n}\n\n.model-tooltip-metadata-value {\n color: var(--jp-content-font-color1);\n font-weight: 600;\n}\n\n.model-tooltip-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.model-tooltip-section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--jp-content-font-color1);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.model-tooltip-bullet-list {\n margin: 0;\n padding-left: 16px;\n list-style-type: disc;\n}\n\n.model-tooltip-bullet-item {\n font-size: 12px;\n color: var(--jp-content-font-color2);\n line-height: 1.5;\n margin-bottom: 4px;\n}\n\n.model-tooltip-bullet-item:last-child {\n margin-bottom: 0;\n}"],"sourceRoot":""}]);
22577
23378
  // Exports
22578
23379
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
22579
23380
 
@@ -23378,10 +24179,13 @@ __webpack_require__.r(__webpack_exports__);
23378
24179
  /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
23379
24180
  /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
23380
24181
  /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
24182
+ /* harmony import */ var _node_modules_css_loader_dist_cjs_js_base_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! -!../node_modules/css-loader/dist/cjs.js!./base.css */ "./node_modules/css-loader/dist/cjs.js!./style/base.css");
23381
24183
  // Imports
23382
24184
 
23383
24185
 
24186
+
23384
24187
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
24188
+ ___CSS_LOADER_EXPORT___.i(_node_modules_css_loader_dist_cjs_js_base_css__WEBPACK_IMPORTED_MODULE_2__["default"]);
23385
24189
  // Module
23386
24190
  ___CSS_LOADER_EXPORT___.push([module.id, `/*
23387
24191
  * Copyright (c) Saga Inc.
@@ -23400,7 +24204,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23400
24204
  transition: border-color 0.2s;
23401
24205
  font-family: var(--jp-ui-font-family);
23402
24206
  resize: vertical;
23403
- min-height: 120px;
24207
+ min-height: 100px;
24208
+ max-height: 50vh;
23404
24209
  }
23405
24210
 
23406
24211
  .rules-form textarea:focus {
@@ -23416,29 +24221,96 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23416
24221
  display: block;
23417
24222
  }
23418
24223
 
24224
+ .rules-form .form-group-checkbox {
24225
+ display: flex;
24226
+ align-items: center;
24227
+ gap: 8px;
24228
+ }
24229
+
24230
+ .rules-form .form-group-checkbox input[type="checkbox"] {
24231
+ width: 16px;
24232
+ height: 16px;
24233
+ cursor: pointer;
24234
+ }
24235
+
24236
+ .rules-form .form-group-checkbox label {
24237
+ margin: 0;
24238
+ cursor: pointer;
24239
+ }
24240
+
24241
+ .rules-form-footer {
24242
+ display: flex;
24243
+ align-items: center;
24244
+ justify-content: space-between;
24245
+ gap: 16px;
24246
+ margin-top: 24px;
24247
+ flex-wrap: wrap;
24248
+ }
24249
+
24250
+ .rules-form-footer-left {
24251
+ display: flex;
24252
+ align-items: center;
24253
+ gap: 8px;
24254
+ flex-wrap: wrap;
24255
+ }
24256
+
24257
+ .rules-form-footer-left .form-group-checkbox {
24258
+ margin: 0;
24259
+ }
24260
+
24261
+ .rules-form-footer-sub {
24262
+ margin: 0;
24263
+ color: var(--jp-ui-font-color2);
24264
+ font-size: 12px;
24265
+ }
24266
+
24267
+ .rules-form .form-actions {
24268
+ border-top: none;
24269
+ margin-top: 0;
24270
+ padding-top: 0;
24271
+ }
24272
+
24273
+ /* Rules list filter */
24274
+ .rules-list-filter {
24275
+ display: flex;
24276
+ gap: 8px;
24277
+ margin-top: 16px;
24278
+ margin-bottom: 12px;
24279
+ }
24280
+
24281
+ .rules-list-filter .button-base {
24282
+ padding: 6px 12px;
24283
+ font-size: 13px;
24284
+ }
24285
+
24286
+ .rules-list-filter .rules-list-filter-active {
24287
+ background-color: var(--jp-layout-color2);
24288
+ font-weight: 500;
24289
+ }
24290
+
23419
24291
  /* Rules List Styling */
23420
24292
  .rules-list {
23421
- margin-top: 24px;
24293
+ margin-top: 0;
23422
24294
  display: flex;
23423
24295
  flex-direction: column;
23424
- gap: 16px;
23425
24296
  }
23426
24297
 
23427
24298
  .rules-list .rule-item {
23428
24299
  display: flex;
23429
24300
  justify-content: space-between;
23430
24301
  align-items: center;
23431
- padding: 20px;
23432
- border: 1px solid var(--jp-border-color1);
23433
- border-radius: 8px;
23434
- background: var(--jp-layout-color0);
23435
- transition: border-color 0.2s, box-shadow 0.2s;
24302
+ padding: 12px 0;
24303
+ border-bottom: 1px solid var(--jp-border-color1);
24304
+ transition: color 0.15s ease;
23436
24305
  cursor: pointer;
23437
24306
  }
23438
24307
 
23439
- .rules-list .rule-item:hover {
23440
- border-color: var(--jp-border-color2);
23441
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
24308
+ .rules-list .rule-item:last-child {
24309
+ border-bottom: none;
24310
+ }
24311
+
24312
+ .rules-list .rule-item:hover .rule-name {
24313
+ color: var(--purple-600);
23442
24314
  }
23443
24315
 
23444
24316
  .rules-list .rule-content {
@@ -23447,18 +24319,25 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23447
24319
  }
23448
24320
 
23449
24321
  .rules-list .rule-name {
23450
- margin: 0 0 8px 0;
24322
+ margin: 0;
23451
24323
  color: var(--jp-ui-font-color1);
23452
24324
  font-size: 14px;
23453
24325
  font-weight: 500;
23454
24326
  line-height: 1;
24327
+ display: flex;
24328
+ align-items: center;
24329
+ gap: 8px;
23455
24330
  }
23456
24331
 
23457
- .rules-list .rule-description {
23458
- margin: 0;
23459
- color: var(--jp-ui-font-color2);
23460
- font-size: 14px;
23461
- line-height: 1.5;
24332
+ .rules-list .rule-badge {
24333
+ display: inline-block;
24334
+ padding: 2px 6px;
24335
+ font-size: 11px;
24336
+ font-weight: 500;
24337
+ line-height: 1;
24338
+ border-radius: 3px;
24339
+ background-color: var(--purple-300);
24340
+ color: var(--purple-700);
23462
24341
  }
23463
24342
 
23464
24343
  .rules-list .rule-actions {
@@ -23477,7 +24356,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23477
24356
  margin: 0;
23478
24357
  font-size: 16px;
23479
24358
  }
23480
- `, "",{"version":3,"sources":["webpack://./style/RulesForm.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;IACI,WAAW;IACX,sBAAsB;IACtB,iBAAiB;IACjB,yCAAyC;IACzC,kBAAkB;IAClB,mCAAmC;IACnC,+BAA+B;IAC/B,eAAe;IACf,6BAA6B;IAC7B,qCAAqC;IACrC,gBAAgB;IAChB,iBAAiB;AACrB;;AAEA;IACI,aAAa;IACb,+BAA+B;IAC/B,6CAA6C;AACjD;;AAEA;IACI,+BAA+B;IAC/B,eAAe;IACf,kBAAkB;IAClB,cAAc;AAClB;;AAEA,uBAAuB;AACvB;IACI,gBAAgB;IAChB,aAAa;IACb,sBAAsB;IACtB,SAAS;AACb;;AAEA;IACI,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,aAAa;IACb,yCAAyC;IACzC,kBAAkB;IAClB,mCAAmC;IACnC,8CAA8C;IAC9C,eAAe;AACnB;;AAEA;IACI,qCAAqC;IACrC,wCAAwC;AAC5C;;AAEA;IACI,OAAO;IACP,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;IACjB,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;IAChB,cAAc;AAClB;;AAEA;IACI,SAAS;IACT,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,QAAQ;AACZ;;AAEA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,+BAA+B;IAC/B,kBAAkB;AACtB;;AAEA;IACI,SAAS;IACT,eAAe;AACnB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.rules-form textarea {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 12px;\n border: 1px solid var(--jp-border-color1);\n border-radius: 4px;\n background: var(--jp-layout-color0);\n color: var(--jp-ui-font-color1);\n font-size: 14px;\n transition: border-color 0.2s;\n font-family: var(--jp-ui-font-family);\n resize: vertical;\n min-height: 120px;\n}\n\n.rules-form textarea:focus {\n outline: none;\n border-color: var(--purple-500);\n box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.1);\n}\n\n.rules-form .form-group sub {\n color: var(--jp-ui-font-color2);\n margin-top: 4px;\n margin-bottom: 4px;\n display: block;\n}\n\n/* Rules List Styling */\n.rules-list {\n margin-top: 24px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.rules-list .rule-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px;\n border: 1px solid var(--jp-border-color1);\n border-radius: 8px;\n background: var(--jp-layout-color0);\n transition: border-color 0.2s, box-shadow 0.2s;\n cursor: pointer;\n}\n\n.rules-list .rule-item:hover {\n border-color: var(--jp-border-color2);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.rules-list .rule-content {\n flex: 1;\n margin-right: 16px;\n}\n\n.rules-list .rule-name {\n margin: 0 0 8px 0;\n color: var(--jp-ui-font-color1);\n font-size: 14px;\n font-weight: 500;\n line-height: 1;\n}\n\n.rules-list .rule-description {\n margin: 0;\n color: var(--jp-ui-font-color2);\n font-size: 14px;\n line-height: 1.5;\n}\n\n.rules-list .rule-actions {\n display: flex;\n gap: 8px;\n}\n\n.rules-list .empty-state {\n text-align: center;\n padding: 40px 20px;\n color: var(--jp-ui-font-color2);\n font-style: italic;\n}\n\n.rules-list .empty-state p {\n margin: 0;\n font-size: 16px;\n}\n"],"sourceRoot":""}]);
24359
+ `, "",{"version":3,"sources":["webpack://./style/RulesForm.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAIF;IACI,WAAW;IACX,sBAAsB;IACtB,iBAAiB;IACjB,yCAAyC;IACzC,kBAAkB;IAClB,mCAAmC;IACnC,+BAA+B;IAC/B,eAAe;IACf,6BAA6B;IAC7B,qCAAqC;IACrC,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,+BAA+B;IAC/B,6CAA6C;AACjD;;AAEA;IACI,+BAA+B;IAC/B,eAAe;IACf,kBAAkB;IAClB,cAAc;AAClB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,QAAQ;AACZ;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,eAAe;AACnB;;AAEA;IACI,SAAS;IACT,eAAe;AACnB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,8BAA8B;IAC9B,SAAS;IACT,gBAAgB;IAChB,eAAe;AACnB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,QAAQ;IACR,eAAe;AACnB;;AAEA;IACI,SAAS;AACb;;AAEA;IACI,SAAS;IACT,+BAA+B;IAC/B,eAAe;AACnB;;AAEA;IACI,gBAAgB;IAChB,aAAa;IACb,cAAc;AAClB;;AAEA,sBAAsB;AACtB;IACI,aAAa;IACb,QAAQ;IACR,gBAAgB;IAChB,mBAAmB;AACvB;;AAEA;IACI,iBAAiB;IACjB,eAAe;AACnB;;AAEA;IACI,yCAAyC;IACzC,gBAAgB;AACpB;;AAEA,uBAAuB;AACvB;IACI,aAAa;IACb,aAAa;IACb,sBAAsB;AAC1B;;AAEA;IACI,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,eAAe;IACf,gDAAgD;IAChD,4BAA4B;IAC5B,eAAe;AACnB;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,wBAAwB;AAC5B;;AAEA;IACI,OAAO;IACP,kBAAkB;AACtB;;AAEA;IACI,SAAS;IACT,+BAA+B;IAC/B,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,mBAAmB;IACnB,QAAQ;AACZ;;AAEA;IACI,qBAAqB;IACrB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,mCAAmC;IACnC,wBAAwB;AAC5B;;AAEA;IACI,aAAa;IACb,QAAQ;AACZ;;AAEA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,+BAA+B;IAC/B,kBAAkB;AACtB;;AAEA;IACI,SAAS;IACT,eAAe;AACnB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n@import url('base.css');\n\n.rules-form textarea {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 12px;\n border: 1px solid var(--jp-border-color1);\n border-radius: 4px;\n background: var(--jp-layout-color0);\n color: var(--jp-ui-font-color1);\n font-size: 14px;\n transition: border-color 0.2s;\n font-family: var(--jp-ui-font-family);\n resize: vertical;\n min-height: 100px;\n max-height: 50vh;\n}\n\n.rules-form textarea:focus {\n outline: none;\n border-color: var(--purple-500);\n box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.1);\n}\n\n.rules-form .form-group sub {\n color: var(--jp-ui-font-color2);\n margin-top: 4px;\n margin-bottom: 4px;\n display: block;\n}\n\n.rules-form .form-group-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rules-form .form-group-checkbox input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n\n.rules-form .form-group-checkbox label {\n margin: 0;\n cursor: pointer;\n}\n\n.rules-form-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-top: 24px;\n flex-wrap: wrap;\n}\n\n.rules-form-footer-left {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.rules-form-footer-left .form-group-checkbox {\n margin: 0;\n}\n\n.rules-form-footer-sub {\n margin: 0;\n color: var(--jp-ui-font-color2);\n font-size: 12px;\n}\n\n.rules-form .form-actions {\n border-top: none;\n margin-top: 0;\n padding-top: 0;\n}\n\n/* Rules list filter */\n.rules-list-filter {\n display: flex;\n gap: 8px;\n margin-top: 16px;\n margin-bottom: 12px;\n}\n\n.rules-list-filter .button-base {\n padding: 6px 12px;\n font-size: 13px;\n}\n\n.rules-list-filter .rules-list-filter-active {\n background-color: var(--jp-layout-color2);\n font-weight: 500;\n}\n\n/* Rules List Styling */\n.rules-list {\n margin-top: 0;\n display: flex;\n flex-direction: column;\n}\n\n.rules-list .rule-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n border-bottom: 1px solid var(--jp-border-color1);\n transition: color 0.15s ease;\n cursor: pointer;\n}\n\n.rules-list .rule-item:last-child {\n border-bottom: none;\n}\n\n.rules-list .rule-item:hover .rule-name {\n color: var(--purple-600);\n}\n\n.rules-list .rule-content {\n flex: 1;\n margin-right: 16px;\n}\n\n.rules-list .rule-name {\n margin: 0;\n color: var(--jp-ui-font-color1);\n font-size: 14px;\n font-weight: 500;\n line-height: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rules-list .rule-badge {\n display: inline-block;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 500;\n line-height: 1;\n border-radius: 3px;\n background-color: var(--purple-300);\n color: var(--purple-700);\n}\n\n.rules-list .rule-actions {\n display: flex;\n gap: 8px;\n}\n\n.rules-list .empty-state {\n text-align: center;\n padding: 40px 20px;\n color: var(--jp-ui-font-color2);\n font-style: italic;\n}\n\n.rules-list .empty-state p {\n margin: 0;\n font-size: 16px;\n}\n"],"sourceRoot":""}]);
23481
24360
  // Exports
23482
24361
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
23483
24362
 
@@ -23522,8 +24401,14 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23522
24401
  width: 100%;
23523
24402
  border-radius: 4px;
23524
24403
  overflow: hidden;
23525
- background-color: var(--blue-300);
23526
- border: 0.5px solid var(--blue-900);
24404
+ /* Theme-aware button colors set by Mito palettes */
24405
+ background-color: var(--mito-theme-button-background, var(--blue-300));
24406
+ border: 0.5px solid var(--mito-theme-button-border, var(--blue-900));
24407
+ transition: all 0.15s ease;
24408
+ }
24409
+
24410
+ .mito-run-cell-button-group:hover {
24411
+ background-color: var(--mito-theme-button-hover-background, var(--blue-400));
23527
24412
  }
23528
24413
 
23529
24414
  /* Shared button styles */
@@ -23534,7 +24419,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23534
24419
  padding: 0;
23535
24420
  border-radius: 0;
23536
24421
  cursor: pointer;
23537
- color: var(--blue-900);
24422
+ /* Theme-aware text color */
24423
+ color: var(--mito-theme-button-text, var(--blue-900));
23538
24424
  font-size: 13px;
23539
24425
  font-weight: 400;
23540
24426
  transition: background-color 0.15s ease;
@@ -23543,7 +24429,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23543
24429
  }
23544
24430
 
23545
24431
  .mito-run-cell-button:hover {
23546
- background-color: var(--blue-400);
24432
+ background-color: transparent;
23547
24433
  }
23548
24434
 
23549
24435
  /* Main button (left side - play icon + text) */
@@ -23560,8 +24446,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23560
24446
  background: linear-gradient(
23561
24447
  to bottom,
23562
24448
  transparent,
23563
- var(--blue-900) 20%,
23564
- var(--blue-900) 80%,
24449
+ var(--mito-theme-button-border, var(--blue-900)) 20%,
24450
+ var(--mito-theme-button-border, var(--blue-900)) 80%,
23565
24451
  transparent
23566
24452
  );
23567
24453
  opacity: 0.4;
@@ -23579,8 +24465,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23579
24465
 
23580
24466
  /* Play icon styling */
23581
24467
  .mito-run-cell-button-main > svg {
23582
- color: var(--blue-900);
23583
- fill: var(--blue-900);
24468
+ color: var(--mito-theme-button-text, var(--blue-900));
24469
+ fill: var(--mito-theme-button-text, var(--blue-900));
23584
24470
  width: 12px;
23585
24471
  height: 12px;
23586
24472
  flex-shrink: 0;
@@ -23590,7 +24476,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23590
24476
  .mito-run-cell-button-dropdown svg {
23591
24477
  width: 14px;
23592
24478
  height: 14px;
23593
- color: var(--blue-900);
24479
+ color: var(--mito-theme-button-text, var(--blue-900));
23594
24480
  }
23595
24481
 
23596
24482
  /* Ensure chevron path only uses stroke, not fill */
@@ -23601,6 +24487,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23601
24487
 
23602
24488
  .mito-run-cell-button-text {
23603
24489
  white-space: nowrap;
24490
+ color: var(--mito-theme-button-text, var(--blue-900));
23604
24491
  }
23605
24492
 
23606
24493
  /* Running state - applied to the group */
@@ -23738,7 +24625,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
23738
24625
  .jp-Notebook-toolbar {
23739
24626
  display: flex;
23740
24627
  align-items: center;
23741
- }`, "",{"version":3,"sources":["webpack://./style/RunCellButton.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;EACE,kBAAkB;EAClB,cAAc;EACd,YAAY;AACd;;AAEA,yCAAyC;AACzC;EACE,aAAa;EACb,mBAAmB;EACnB,oCAAoC;EACpC,WAAW;EACX,kBAAkB;EAClB,gBAAgB;EAChB,iCAAiC;EACjC,mCAAmC;AACrC;;AAEA,yBAAyB;AACzB;EACE,aAAa;EACb,mBAAmB;EACnB,YAAY;EACZ,UAAU;EACV,gBAAgB;EAChB,eAAe;EACf,sBAAsB;EACtB,eAAe;EACf,gBAAgB;EAChB,uCAAuC;EACvC,YAAY;EACZ,6BAA6B;AAC/B;;AAEA;EACE,iCAAiC;AACnC;;AAEA,+CAA+C;AAC/C;EACE,OAAO;EACP,QAAQ;EACR,eAAe;AACjB;;AAEA,4BAA4B;AAC5B;EACE,UAAU;EACV,YAAY;EACZ;;;;;;GAMC;EACD,YAAY;EACZ,cAAc;AAChB;;AAEA,2CAA2C;AAC3C;EACE,cAAc;EACd,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,gBAAgB;AAClB;;AAEA,sBAAsB;AACtB;EACE,sBAAsB;EACtB,qBAAqB;EACrB,WAAW;EACX,YAAY;EACZ,cAAc;AAChB;;AAEA,oBAAoB;AACpB;EACE,WAAW;EACX,YAAY;EACZ,sBAAsB;AACxB;;AAEA,mDAAmD;AACnD;EACE,UAAU;EACV,oBAAoB;AACtB;;AAEA;EACE,mBAAmB;AACrB;;AAEA,yCAAyC;AACzC;EACE,8BAA8B;AAChC;;AAEA;;EAEE,kCAAkC;EAClC,uBAAuB;AACzB;;AAEA;EACE,kCAAkC;AACpC;;AAEA;EACE;;;;;;GAMC;EACD,YAAY;AACd;;AAEA,uCAAuC;AACvC;EACE,uBAAuB;EACvB,sBAAsB;EACtB,WAAW;EACX,YAAY;AACd;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,kBAAkB;EAClB,qBAAqB;EACrB,QAAQ;EACR,aAAa;EACb,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,wCAAwC;EACxC,gBAAgB;EAChB,mBAAmB;EACnB,cAAc;AAChB;;AAEA;EACE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,0BAA0B;EAC1B,eAAe;EACf,gBAAgB;EAChB,+BAA+B;EAC/B,yBAAyB;EACzB,qBAAqB;AACvB;;AAEA;EACE,WAAW;EACX,yCAAyC;EACzC,aAAa;AACf;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,WAAW;EACX,iBAAiB;EACjB,gBAAgB;EAChB,YAAY;EACZ,gBAAgB;EAChB,+BAA+B;EAC/B,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,QAAQ;AACV;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,WAAW,EAAE,mCAAmC;EAChD,YAAY;EACZ,cAAc;EACd,+BAA+B;EAC/B,cAAc,EAAE,kDAAkD;AACpE;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,cAAc,EAAE,0BAA0B;EAC1C,cAAc,EAAE,qDAAqD;EACrE,+BAA+B;AACjC;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,+BAA+B;EAC/B,eAAe;EACf,iBAAiB;EACjB,YAAY;AACd;;AAEA,gEAAgE;AAChE;EACE,iBAAiB;EACjB,WAAW,EAAE,2BAA2B;AAC1C;;AAEA,qDAAqD;AACrD;EACE,aAAa;EACb,mBAAmB;AACrB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.mito-run-cell-button-container {\n position: relative;\n display: block;\n width: 160px;\n}\n\n/* Button group - contains both buttons */\n.mito-run-cell-button-group {\n display: flex;\n align-items: center;\n height: var(--toolbar-button-height);\n width: 100%;\n border-radius: 4px;\n overflow: hidden;\n background-color: var(--blue-300);\n border: 0.5px solid var(--blue-900);\n}\n\n/* Shared button styles */\n.mito-run-cell-button {\n display: flex;\n align-items: center;\n border: none;\n padding: 0;\n border-radius: 0;\n cursor: pointer;\n color: var(--blue-900);\n font-size: 13px;\n font-weight: 400;\n transition: background-color 0.15s ease;\n height: 100%;\n background-color: transparent;\n}\n\n.mito-run-cell-button:hover {\n background-color: var(--blue-400);\n}\n\n/* Main button (left side - play icon + text) */\n.mito-run-cell-button-main {\n flex: 1;\n gap: 6px;\n padding: 0 10px;\n}\n\n/* Divider between buttons */\n.mito-run-cell-button-divider {\n width: 1px;\n height: 14px;\n background: linear-gradient(\n to bottom,\n transparent,\n var(--blue-900) 20%,\n var(--blue-900) 80%,\n transparent\n );\n opacity: 0.4;\n flex-shrink: 0;\n}\n\n/* Dropdown button (right side - chevron) */\n.mito-run-cell-button-dropdown {\n padding: 0 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 0;\n}\n\n/* Play icon styling */\n.mito-run-cell-button-main > svg {\n color: var(--blue-900);\n fill: var(--blue-900);\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n}\n\n/* Chevron styling */\n.mito-run-cell-button-dropdown svg {\n width: 14px;\n height: 14px;\n color: var(--blue-900);\n}\n\n/* Ensure chevron path only uses stroke, not fill */\n.mito-run-cell-button-dropdown svg path {\n fill: none;\n stroke: currentColor;\n}\n\n.mito-run-cell-button-text {\n white-space: nowrap;\n}\n\n/* Running state - applied to the group */\n.mito-run-cell-button-running {\n border-color: var(--green-900);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button,\n.mito-run-cell-button-running .mito-run-cell-button-dropdown {\n background-color: var(--green-300);\n color: var(--green-900);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-dropdown:hover {\n background-color: var(--green-500);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-divider {\n background: linear-gradient(\n to bottom,\n transparent,\n var(--green-900) 20%,\n var(--green-900) 80%,\n transparent\n );\n opacity: 0.5;\n}\n\n/* LoadingCircle styling when running */\n.mito-run-cell-button-running .mito-run-cell-button-main > svg {\n color: var(--green-900);\n fill: var(--green-900);\n width: 16px;\n height: 16px;\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-text {\n color: var(--green-900);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-dropdown svg {\n color: var(--green-900);\n}\n\n.mito-run-cell-dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n z-index: 1000;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 3px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n min-width: 200px;\n white-space: nowrap;\n padding: 4px 0;\n}\n\n.mito-run-cell-dropdown-section {\n display: flex;\n flex-direction: column;\n}\n\n.mito-run-cell-dropdown-section-header {\n padding: 6px 12px 4px 12px;\n font-size: 11px;\n font-weight: 600;\n color: var(--jp-ui-font-color2);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.mito-run-cell-dropdown-separator {\n height: 1px;\n background-color: var(--jp-layout-color2);\n margin: 4px 0;\n}\n\n.mito-run-cell-dropdown-item {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 6px 12px;\n text-align: left;\n border: none;\n background: none;\n color: var(--jp-ui-font-color1);\n cursor: pointer;\n font-size: 13px;\n font-weight: 400;\n gap: 8px;\n}\n\n.mito-run-cell-dropdown-item:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.mito-run-cell-dropdown-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px; /* Fixed width to align all icons */\n height: 16px;\n flex-shrink: 0;\n color: var(--jp-ui-font-color1);\n line-height: 0; /* Remove extra line height for better alignment */\n}\n\n.mito-run-cell-dropdown-item-icon svg {\n width: 16px;\n height: 16px;\n display: block; /* Remove inline spacing */\n margin: 0 auto; /* Center the icon within the fixed width container */\n color: var(--jp-ui-font-color1); \n}\n\n.mito-run-cell-dropdown-item-label {\n flex: 1;\n}\n\n.mito-run-cell-dropdown-item-shortcut {\n color: var(--jp-ui-font-color2);\n font-size: 11px;\n margin-left: 10px;\n opacity: 0.7;\n}\n\n/* Position the button widget on the right side of the toolbar */\n.jp-Notebook-toolbar .mito-run-cell-button-widget {\n margin-left: auto;\n order: 9999; /* Ensure it appears last */\n}\n\n/* Ensure toolbar uses flexbox for proper alignment */\n.jp-Notebook-toolbar {\n display: flex;\n align-items: center;\n}"],"sourceRoot":""}]);
24628
+ }`, "",{"version":3,"sources":["webpack://./style/RunCellButton.css"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n.mito-run-cell-button-container {\n position: relative;\n display: block;\n width: 160px;\n}\n\n/* Button group - contains both buttons */\n.mito-run-cell-button-group {\n display: flex;\n align-items: center;\n height: var(--toolbar-button-height);\n width: 100%;\n border-radius: 4px;\n overflow: hidden;\n /* Theme-aware button colors set by Mito palettes */\n background-color: var(--mito-theme-button-background, var(--blue-300));\n border: 0.5px solid var(--mito-theme-button-border, var(--blue-900));\n transition: all 0.15s ease;\n}\n\n.mito-run-cell-button-group:hover {\n background-color: var(--mito-theme-button-hover-background, var(--blue-400));\n}\n\n/* Shared button styles */\n.mito-run-cell-button {\n display: flex;\n align-items: center;\n border: none;\n padding: 0;\n border-radius: 0;\n cursor: pointer;\n /* Theme-aware text color */\n color: var(--mito-theme-button-text, var(--blue-900));\n font-size: 13px;\n font-weight: 400;\n transition: background-color 0.15s ease;\n height: 100%;\n background-color: transparent;\n}\n\n.mito-run-cell-button:hover {\n background-color: transparent;\n}\n\n/* Main button (left side - play icon + text) */\n.mito-run-cell-button-main {\n flex: 1;\n gap: 6px;\n padding: 0 10px;\n}\n\n/* Divider between buttons */\n.mito-run-cell-button-divider {\n width: 1px;\n height: 14px;\n background: linear-gradient(\n to bottom,\n transparent,\n var(--mito-theme-button-border, var(--blue-900)) 20%,\n var(--mito-theme-button-border, var(--blue-900)) 80%,\n transparent\n );\n opacity: 0.4;\n flex-shrink: 0;\n}\n\n/* Dropdown button (right side - chevron) */\n.mito-run-cell-button-dropdown {\n padding: 0 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 0;\n}\n\n/* Play icon styling */\n.mito-run-cell-button-main > svg {\n color: var(--mito-theme-button-text, var(--blue-900));\n fill: var(--mito-theme-button-text, var(--blue-900));\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n}\n\n/* Chevron styling */\n.mito-run-cell-button-dropdown svg {\n width: 14px;\n height: 14px;\n color: var(--mito-theme-button-text, var(--blue-900));\n}\n\n/* Ensure chevron path only uses stroke, not fill */\n.mito-run-cell-button-dropdown svg path {\n fill: none;\n stroke: currentColor;\n}\n\n.mito-run-cell-button-text {\n white-space: nowrap;\n color: var(--mito-theme-button-text, var(--blue-900));\n}\n\n/* Running state - applied to the group */\n.mito-run-cell-button-running {\n border-color: var(--green-900);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button,\n.mito-run-cell-button-running .mito-run-cell-button-dropdown {\n background-color: var(--green-300);\n color: var(--green-900);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-dropdown:hover {\n background-color: var(--green-500);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-divider {\n background: linear-gradient(\n to bottom,\n transparent,\n var(--green-900) 20%,\n var(--green-900) 80%,\n transparent\n );\n opacity: 0.5;\n}\n\n/* LoadingCircle styling when running */\n.mito-run-cell-button-running .mito-run-cell-button-main > svg {\n color: var(--green-900);\n fill: var(--green-900);\n width: 16px;\n height: 16px;\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-text {\n color: var(--green-900);\n}\n\n.mito-run-cell-button-running .mito-run-cell-button-dropdown svg {\n color: var(--green-900);\n}\n\n.mito-run-cell-dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n z-index: 1000;\n background-color: var(--jp-layout-color1);\n border: 1px solid var(--jp-layout-color2);\n border-radius: 3px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n min-width: 200px;\n white-space: nowrap;\n padding: 4px 0;\n}\n\n.mito-run-cell-dropdown-section {\n display: flex;\n flex-direction: column;\n}\n\n.mito-run-cell-dropdown-section-header {\n padding: 6px 12px 4px 12px;\n font-size: 11px;\n font-weight: 600;\n color: var(--jp-ui-font-color2);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.mito-run-cell-dropdown-separator {\n height: 1px;\n background-color: var(--jp-layout-color2);\n margin: 4px 0;\n}\n\n.mito-run-cell-dropdown-item {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 6px 12px;\n text-align: left;\n border: none;\n background: none;\n color: var(--jp-ui-font-color1);\n cursor: pointer;\n font-size: 13px;\n font-weight: 400;\n gap: 8px;\n}\n\n.mito-run-cell-dropdown-item:hover {\n background-color: var(--jp-layout-color2);\n}\n\n.mito-run-cell-dropdown-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px; /* Fixed width to align all icons */\n height: 16px;\n flex-shrink: 0;\n color: var(--jp-ui-font-color1);\n line-height: 0; /* Remove extra line height for better alignment */\n}\n\n.mito-run-cell-dropdown-item-icon svg {\n width: 16px;\n height: 16px;\n display: block; /* Remove inline spacing */\n margin: 0 auto; /* Center the icon within the fixed width container */\n color: var(--jp-ui-font-color1); \n}\n\n.mito-run-cell-dropdown-item-label {\n flex: 1;\n}\n\n.mito-run-cell-dropdown-item-shortcut {\n color: var(--jp-ui-font-color2);\n font-size: 11px;\n margin-left: 10px;\n opacity: 0.7;\n}\n\n/* Position the button widget on the right side of the toolbar */\n.jp-Notebook-toolbar .mito-run-cell-button-widget {\n margin-left: auto;\n order: 9999; /* Ensure it appears last */\n}\n\n/* Ensure toolbar uses flexbox for proper alignment */\n.jp-Notebook-toolbar {\n display: flex;\n align-items: center;\n}"],"sourceRoot":""}]);
23742
24629
  // Exports
23743
24630
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
23744
24631
 
@@ -24622,14 +25509,16 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
24622
25509
  }
24623
25510
 
24624
25511
  .button-blue {
24625
- background-color: var(--blue-300);
24626
- color: var(--blue-900) !important;
24627
- border: 0.5px solid var(--blue-900);
25512
+ /* Theme-aware button colors set by Mito palettes */
25513
+ background-color: var(--mito-theme-button-background, var(--blue-300));
25514
+ color: var(--mito-theme-button-text, var(--blue-900)) !important;
25515
+ border: 0.5px solid var(--mito-theme-button-border, var(--blue-900));
24628
25516
  border-radius: 4px;
25517
+ transition: all 0.15s ease;
24629
25518
  }
24630
25519
 
24631
25520
  .button-blue:hover {
24632
- background-color: var(--blue-400);
25521
+ background-color: var(--mito-theme-button-hover-background, var(--blue-400));
24633
25522
  }
24634
25523
 
24635
25524
  .button-dark-purple {
@@ -24654,7 +25543,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/*
24654
25543
  font-size: 12px;
24655
25544
  padding: 2px 5px;
24656
25545
  }
24657
- `, "",{"version":3,"sources":["webpack://./style/button.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;;;;CAIC;;AAED;EACE,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,2EAA2E;EAC3E,mBAAmB;EACnB,iBAAiB;AACnB;;AAEA;EACE,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;AACtB;;AAEA;EACE,kCAAkC;EAClC,kCAAkC;AACpC;;AAEA;EACE,kCAAkC;AACpC;;AAEA;EACE,gCAAgC;EAChC,gCAAgC;AAClC;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,yCAAyC;EACzC,+CAA+C;AACjD;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mCAAmC;EACnC,mCAAmC;AACrC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,iCAAiC;EACjC,iCAAiC;EACjC,mCAAmC;EACnC,kBAAkB;AACpB;;AAEA;EACE,iCAAiC;AACnC;;AAEA;EACE,mCAAmC;EACnC,8BAA8B;AAChC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,oCAAoC;EACpC,eAAe;EACf,gBAAgB;AAClB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* \n Classes that can be used for any button, making it easier to keep \n the theme consistent. For example, use them to make a textButton or\n textAndIconButton green.\n*/\n\n.button-base {\n border: none;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n /* Make sure the button grows large enough so that the text does not wrap */\n white-space: nowrap;\n padding: 5px 10px;\n}\n\n.button-base:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.button-green {\n background-color: var(--green-400);\n color: var(--green-900) !important;\n}\n\n.button-green:hover {\n background-color: var(--green-500);\n}\n\n.button-red {\n background-color: var(--red-400);\n color: var(--red-900) !important;\n}\n\n.button-red:hover {\n background-color: var(--red-500);\n}\n\n.button-gray {\n background-color: var(--jp-layout-color2);\n color: var(--jp-content-font-color1) !important;\n}\n\n.button-gray:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.button-purple {\n background-color: var(--purple-300);\n color: var(--purple-700) !important;\n}\n\n.button-purple:hover {\n background-color: var(--purple-400);\n}\n\n.button-purple:disabled:hover {\n background-color: var(--purple-300);\n}\n\n.button-blue {\n background-color: var(--blue-300);\n color: var(--blue-900) !important;\n border: 0.5px solid var(--blue-900);\n border-radius: 4px;\n}\n\n.button-blue:hover {\n background-color: var(--blue-400);\n}\n\n.button-dark-purple {\n background-color: var(--purple-500);\n color: var(--white) !important;\n}\n\n.button-dark-purple:hover {\n background-color: var(--purple-600);\n}\n\n.button-width-block {\n width: 100%;\n}\n\n.button-width-fit-contents {\n width: fit-content;\n}\n\n.button-small {\n height: var(--toolbar-button-height);\n font-size: 12px;\n padding: 2px 5px;\n}\n"],"sourceRoot":""}]);
25546
+ `, "",{"version":3,"sources":["webpack://./style/button.css"],"names":[],"mappings":"AAAA;;;EAGE;;AAEF;;;;CAIC;;AAED;EACE,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,2EAA2E;EAC3E,mBAAmB;EACnB,iBAAiB;AACnB;;AAEA;EACE,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;AACtB;;AAEA;EACE,kCAAkC;EAClC,kCAAkC;AACpC;;AAEA;EACE,kCAAkC;AACpC;;AAEA;EACE,gCAAgC;EAChC,gCAAgC;AAClC;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,yCAAyC;EACzC,+CAA+C;AACjD;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,mCAAmC;EACnC,mCAAmC;AACrC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,mDAAmD;EACnD,sEAAsE;EACtE,gEAAgE;EAChE,oEAAoE;EACpE,kBAAkB;EAClB,0BAA0B;AAC5B;;AAEA;EACE,4EAA4E;AAC9E;;AAEA;EACE,mCAAmC;EACnC,8BAA8B;AAChC;;AAEA;EACE,mCAAmC;AACrC;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,oCAAoC;EACpC,eAAe;EACf,gBAAgB;AAClB","sourcesContent":["/*\n * Copyright (c) Saga Inc.\n * Distributed under the terms of the GNU Affero General Public License v3.0 License.\n */\n\n/* \n Classes that can be used for any button, making it easier to keep \n the theme consistent. For example, use them to make a textButton or\n textAndIconButton green.\n*/\n\n.button-base {\n border: none;\n border-radius: 3px;\n cursor: pointer;\n font-size: 14px;\n /* Make sure the button grows large enough so that the text does not wrap */\n white-space: nowrap;\n padding: 5px 10px;\n}\n\n.button-base:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.button-green {\n background-color: var(--green-400);\n color: var(--green-900) !important;\n}\n\n.button-green:hover {\n background-color: var(--green-500);\n}\n\n.button-red {\n background-color: var(--red-400);\n color: var(--red-900) !important;\n}\n\n.button-red:hover {\n background-color: var(--red-500);\n}\n\n.button-gray {\n background-color: var(--jp-layout-color2);\n color: var(--jp-content-font-color1) !important;\n}\n\n.button-gray:hover {\n background-color: var(--jp-layout-color3);\n}\n\n.button-purple {\n background-color: var(--purple-300);\n color: var(--purple-700) !important;\n}\n\n.button-purple:hover {\n background-color: var(--purple-400);\n}\n\n.button-purple:disabled:hover {\n background-color: var(--purple-300);\n}\n\n.button-blue {\n /* Theme-aware button colors set by Mito palettes */\n background-color: var(--mito-theme-button-background, var(--blue-300));\n color: var(--mito-theme-button-text, var(--blue-900)) !important;\n border: 0.5px solid var(--mito-theme-button-border, var(--blue-900));\n border-radius: 4px;\n transition: all 0.15s ease;\n}\n\n.button-blue:hover {\n background-color: var(--mito-theme-button-hover-background, var(--blue-400));\n}\n\n.button-dark-purple {\n background-color: var(--purple-500);\n color: var(--white) !important;\n}\n\n.button-dark-purple:hover {\n background-color: var(--purple-600);\n}\n\n.button-width-block {\n width: 100%;\n}\n\n.button-width-fit-contents {\n width: fit-content;\n}\n\n.button-small {\n height: var(--toolbar-button-height);\n font-size: 12px;\n padding: 2px 5px;\n}\n"],"sourceRoot":""}]);
24658
25547
  // Exports
24659
25548
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
24660
25549
 
@@ -24697,7 +25586,7 @@ module.exports = "<svg width=\"22\" height=\"17\" viewBox=\"0 0 22 17\" fill=\"n
24697
25586
  \********************************/
24698
25587
  /***/ ((module) => {
24699
25588
 
24700
- module.exports = "<svg width=\"19\" height=\"20\" viewBox=\"0 0 19 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.0626 4.8125C15.5466 4.8125 15.9376 5.20352 15.9376 5.6875C15.9376 6.17148 15.5466 6.5625 15.0626 6.5625C14.5787 6.5625 14.1876 6.17148 14.1876 5.6875C14.1876 5.20352 14.5787 4.8125 15.0626 4.8125ZM12.0001 4.8125C12.4841 4.8125 12.8751 5.20352 12.8751 5.6875C12.8751 6.17148 12.4841 6.5625 12.0001 6.5625C11.5162 6.5625 11.1251 6.17148 11.1251 5.6875C11.1251 5.20352 11.5162 4.8125 12.0001 4.8125ZM8.93764 4.8125C9.42162 4.8125 9.81264 5.20352 9.81264 5.6875C9.81264 6.17148 9.42162 6.5625 8.93764 6.5625C8.45365 6.5625 8.06264 6.17148 8.06264 5.6875C8.06264 5.20352 8.45365 4.8125 8.93764 4.8125ZM12.0001 0C15.8665 0 19.0001 2.5457 19.0001 5.6875C19.0001 6.98906 18.456 8.18125 17.5537 9.14102C17.9611 10.2184 18.8087 11.1316 18.8224 11.1426C19.0029 11.334 19.0521 11.6129 18.9482 11.8535C18.8443 12.0941 18.6064 12.25 18.3439 12.25C16.6622 12.25 15.3361 11.5473 14.5404 10.984C13.7501 11.2328 12.897 11.375 12.0001 11.375C8.13373 11.375 5.00014 8.8293 5.00014 5.6875C5.00014 2.5457 8.13373 0 12.0001 0ZM12.0001 10.0625C12.7302 10.0625 13.4521 9.95039 14.1439 9.73164L14.7646 9.53477L15.2978 9.91211C15.6888 10.1883 16.2247 10.4973 16.8701 10.7051C16.6705 10.3742 16.4763 10.0023 16.3259 9.60586L16.0361 8.8375L16.5994 8.24141C17.0943 7.71367 17.6876 6.84141 17.6876 5.6875C17.6876 3.27578 15.1365 1.3125 12.0001 1.3125C8.86381 1.3125 6.31264 3.27578 6.31264 5.6875C6.31264 8.09922 8.86381 10.0625 12.0001 10.0625Z\" fill=\"var(--purple-600)\" class=\"jp-icon-selectable\"/>\n <path d=\"M7 7C3.13359 7 0 9.5457 0 12.6875C0 14.0437 0.585156 15.2852 1.55859 16.2613C1.2168 17.6395 0.0738281 18.8672 0.0601563 18.8809C0 18.9438 -0.0164062 19.0367 0.0191406 19.1188C0.0546875 19.2008 0.13125 19.25 0.21875 19.25C2.03164 19.25 3.39063 18.3805 4.06328 17.8445C4.95742 18.1809 5.95 18.375 7 18.375C10.8664 18.375 14 15.8293 14 12.6875C14 9.5457 10.8664 7 7 7ZM3.5 13.5625C3.01602 13.5625 2.625 13.1715 2.625 12.6875C2.625 12.2035 3.01602 11.8125 3.5 11.8125C3.98398 11.8125 4.375 12.2035 4.375 12.6875C4.375 13.1715 3.98398 13.5625 3.5 13.5625ZM7 13.5625C6.51602 13.5625 6.125 13.1715 6.125 12.6875C6.125 12.2035 6.51602 11.8125 7 11.8125C7.48398 11.8125 7.875 12.2035 7.875 12.6875C7.875 13.1715 7.48398 13.5625 7 13.5625ZM10.5 13.5625C10.016 13.5625 9.625 13.1715 9.625 12.6875C9.625 12.2035 10.016 11.8125 10.5 11.8125C10.984 11.8125 11.375 12.2035 11.375 12.6875C11.375 13.1715 10.984 13.5625 10.5 13.5625Z\" fill=\"var(--purple-700)\" class=\"jp-icon-selectable\"/>\n</svg>\n";
25589
+ module.exports = "<svg width=\"19\" height=\"20\" viewBox=\"0 0 19 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.0626 4.8125C15.5466 4.8125 15.9376 5.20352 15.9376 5.6875C15.9376 6.17148 15.5466 6.5625 15.0626 6.5625C14.5787 6.5625 14.1876 6.17148 14.1876 5.6875C14.1876 5.20352 14.5787 4.8125 15.0626 4.8125ZM12.0001 4.8125C12.4841 4.8125 12.8751 5.20352 12.8751 5.6875C12.8751 6.17148 12.4841 6.5625 12.0001 6.5625C11.5162 6.5625 11.1251 6.17148 11.1251 5.6875C11.1251 5.20352 11.5162 4.8125 12.0001 4.8125ZM8.93764 4.8125C9.42162 4.8125 9.81264 5.20352 9.81264 5.6875C9.81264 6.17148 9.42162 6.5625 8.93764 6.5625C8.45365 6.5625 8.06264 6.17148 8.06264 5.6875C8.06264 5.20352 8.45365 4.8125 8.93764 4.8125ZM12.0001 0C15.8665 0 19.0001 2.5457 19.0001 5.6875C19.0001 6.98906 18.456 8.18125 17.5537 9.14102C17.9611 10.2184 18.8087 11.1316 18.8224 11.1426C19.0029 11.334 19.0521 11.6129 18.9482 11.8535C18.8443 12.0941 18.6064 12.25 18.3439 12.25C16.6622 12.25 15.3361 11.5473 14.5404 10.984C13.7501 11.2328 12.897 11.375 12.0001 11.375C8.13373 11.375 5.00014 8.8293 5.00014 5.6875C5.00014 2.5457 8.13373 0 12.0001 0ZM12.0001 10.0625C12.7302 10.0625 13.4521 9.95039 14.1439 9.73164L14.7646 9.53477L15.2978 9.91211C15.6888 10.1883 16.2247 10.4973 16.8701 10.7051C16.6705 10.3742 16.4763 10.0023 16.3259 9.60586L16.0361 8.8375L16.5994 8.24141C17.0943 7.71367 17.6876 6.84141 17.6876 5.6875C17.6876 3.27578 15.1365 1.3125 12.0001 1.3125C8.86381 1.3125 6.31264 3.27578 6.31264 5.6875C6.31264 8.09922 8.86381 10.0625 12.0001 10.0625Z\" fill=\"var(--jp-brand-color0)\" class=\"jp-icon-selectable\"/>\n <path d=\"M7 7C3.13359 7 0 9.5457 0 12.6875C0 14.0437 0.585156 15.2852 1.55859 16.2613C1.2168 17.6395 0.0738281 18.8672 0.0601563 18.8809C0 18.9438 -0.0164062 19.0367 0.0191406 19.1188C0.0546875 19.2008 0.13125 19.25 0.21875 19.25C2.03164 19.25 3.39063 18.3805 4.06328 17.8445C4.95742 18.1809 5.95 18.375 7 18.375C10.8664 18.375 14 15.8293 14 12.6875C14 9.5457 10.8664 7 7 7ZM3.5 13.5625C3.01602 13.5625 2.625 13.1715 2.625 12.6875C2.625 12.2035 3.01602 11.8125 3.5 11.8125C3.98398 11.8125 4.375 12.2035 4.375 12.6875C4.375 13.1715 3.98398 13.5625 3.5 13.5625ZM7 13.5625C6.51602 13.5625 6.125 13.1715 6.125 12.6875C6.125 12.2035 6.51602 11.8125 7 11.8125C7.48398 11.8125 7.875 12.2035 7.875 12.6875C7.875 13.1715 7.48398 13.5625 7 13.5625ZM10.5 13.5625C10.016 13.5625 9.625 13.1715 9.625 12.6875C9.625 12.2035 10.016 11.8125 10.5 11.8125C10.984 11.8125 11.375 12.2035 11.375 12.6875C11.375 13.1715 10.984 13.5625 10.5 13.5625Z\" fill=\"var(--jp-brand-color1)\" class=\"jp-icon-selectable\"/>\n</svg>\n";
24701
25590
 
24702
25591
  /***/ }),
24703
25592
 
@@ -27290,4 +28179,4 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
27290
28179
  /***/ })
27291
28180
 
27292
28181
  }]);
27293
- //# sourceMappingURL=lib_index_js.03302cc521d72eb56b00.js.map
28182
+ //# sourceMappingURL=lib_index_js.dccfa541c464ee0e5cd4.js.map