Skip to content

feat(webui): Move timestamp presets into AntD date picker. #1734

Merged
davemarco merged 13 commits intoy-scope:mainfrom
davemarco:move_presets
Dec 15, 2025
Merged

feat(webui): Move timestamp presets into AntD date picker. #1734
davemarco merged 13 commits intoy-scope:mainfrom
davemarco:move_presets

Conversation

@davemarco
Copy link
Contributor

@davemarco davemarco commented Dec 5, 2025

Description

Moves presets into the Ant Design time selector.

AntD’s built-in presets feature couldn’t be used properly because it automatically triggers the onChange callback and isn’t asynchronous. Triggering onChange is problematic here — we use that callback to update the picker value when switching to a custom timestamp, but we don’t want it to fire when selecting a preset, since in that case we just want to display the preset label instead of the raw date/time values.

Implementation Details

To fix this, I rendered a fully custom preset component next to the AntD date picker. This prevents unwanted onChange triggers and supports asynchronous behavior.

When the user opens the picker, it shows the current timestamp value. I tried keeping the preset text visible inside the picker, but it made editing timestamps awkward and complicated the code. If the user doesn’t make any changes and simply closes the picker, the preset text reappears.

Screenshot 2025-12-12 at 10 24 35 AM

Checklist

  • The PR satisfies the contribution guidelines.
  • This is a breaking change and that has been indicated in the PR title, OR this isn't a
    breaking change.
  • Necessary docs have been updated, OR no docs need to be updated.

Validation performed

Presets change

Summary by CodeRabbit

  • New Features

    • Integrated range date picker with a dedicated preset panel for faster selection.
    • New preset panel presents common ranges alongside a date picker for quick picks.
  • Improvements

    • Input shows contextual text when picker is open and reflects current selection.
    • Editing a range auto-switches to a custom range; calendar selections normalized to UTC.
    • Improved focus/blur/change handling and refined panel styling for clearer presentation.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 5, 2025

Walkthrough

Replaces the Select-based preset UI with an Ant Design DatePicker.RangePicker and custom input; TimeDateInput now forwards native input events, accepts an isPickerOpen flag and reflects picker open state; adds a TimeRangePanel component and a minimal CSS module; removes prior CSS overrides for the input/picker.

Changes

Cohort / File(s) Summary
TimeDateInput changes
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx
Props now extend React.InputHTMLAttributes<HTMLInputElement> and add optional isPickerOpen. Component destructures onChange, onFocus, onBlur, isPickerOpen and collects remaining props. Display logic shows raw value when picker is open or when option is CUSTOM; adds handleChange to set option to CUSTOM then forward the native event; spreads remaining props onto the input, attaches forwarded onBlur, onFocus, onChange, and re-exports TimeDateInputProps.
TimeRangePanel new component & styles
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx, components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.module.css
Adds TimeRangePanel (default export) rendering preset time-range Menu items (excludes CUSTOM), maps presets → dayjs ranges via TIME_RANGE_OPTION_DAYJS_MAP, calls updateTimeRange with UTC-normalized dates and invokes onClose; logs conversion errors. Adds CSS module with .panelContainer and .presetList.
TimeRangeInput refactor & styles removed
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx, components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.module.css
Replaces Select-based preset UI with DatePicker.RangePicker; introduces isOpen state, panelRender wrapping TimeRangePanel, custom input via TimeDateInput, and handlers (handleOpenChange, handleClose, handleRangePickerChange) that auto-switch to TIME_RANGE_OPTION.CUSTOM on edits and normalize picked dates to UTC before updating time range. Removes previous CSS overrides enforcing select width and border-radius.

Sequence Diagram

sequenceDiagram
    actor User
    participant TimeDateInput
    participant RangePicker as DatePicker.RangePicker
    participant TimeRangePanel
    participant State as Time Range State

    User->>TimeDateInput: click / focus input
    TimeDateInput->>RangePicker: open picker
    RangePicker->>TimeRangePanel: panelRender → mount panel
    TimeRangePanel->>User: show preset options

    alt User selects preset
        User->>TimeRangePanel: click preset
        TimeRangePanel->>State: updateTimeRange(preset → UTC range)
        TimeRangePanel->>RangePicker: call onClose
        RangePicker->>TimeDateInput: close picker
        TimeDateInput->>User: display updated range
    else User edits dates manually
        User->>TimeDateInput: type/change input
        TimeDateInput->>RangePicker: propagate change → handleRangePickerChange
        RangePicker->>State: set option CUSTOM, normalize to UTC, updateTimeRange
        State->>TimeDateInput: new range state
        TimeDateInput->>User: show selected dates
    end

    User->>TimeDateInput: blur / click outside
    TimeDateInput->>RangePicker: blur → close picker
    RangePicker->>User: panel closed
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Review hotspots:
    • handleRangePickerChange in components/.../TimeRangeInput/index.tsx — confirm CUSTOM auto-switch and UTC normalization logic.
    • Event forwarding and prop spreading in TimeDateInput.tsx — ensure native event propagation and focus/blur interplay with RangePicker.
    • TimeRangePanel selection flow — validate TIME_RANGE_OPTION_DAYJS_MAP mappings, error handling, and reliable onClose invocation.
    • CSS removal in index.module.css — check visual/regression impact on border-radius, spacing and Select/RangePicker integration.

Possibly related PRs

Suggested reviewers

  • hoophalab
  • junhaoliao

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(webui): Move timestamp presets into AntD date picker' accurately summarizes the main change: relocating preset options from outside to within the date picker component.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4d008a5 and ba3e1a8.

📒 Files selected for processing (1)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{cpp,hpp,java,js,jsx,tpp,ts,tsx}

⚙️ CodeRabbit configuration file

  • Prefer false == <expression> rather than !<expression>.

Files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx
🧬 Code graph analysis (1)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx (1)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/utils.tsx (3)
  • TIME_RANGE_OPTION (202-202)
  • TIME_RANGE_OPTION_DAYJS_MAP (203-203)
  • TIME_RANGE_OPTION_NAMES (204-204)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: package-image
  • GitHub Check: build (macos-15)
  • GitHub Check: build (ubuntu-24.04)
  • GitHub Check: lint-check (ubuntu-24.04)
  • GitHub Check: lint-check (macos-15)
🔇 Additional comments (3)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx (3)

1-20: LGTM!

The imports and interface definition are clean and appropriate for the component's functionality.


22-29: LGTM!

The JSDoc comment clearly documents the component's purpose and parameters.


48-71: LGTM!

The render implementation correctly uses AntD's Menu component for preset selection, which handles keyboard accessibility and hover states natively. The filtering of the CUSTOM option and the selectedKeys synchronization with store state align well with the PR objectives.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@davemarco davemarco changed the title feat(webui): Move presets into AntD date picker. feat(webui): Move timestamp presets into AntD date picker. Dec 5, 2025
@davemarco davemarco marked this pull request as ready for review December 8, 2025 18:42
@davemarco davemarco requested a review from a team as a code owner December 8, 2025 18:42
@davemarco davemarco requested a review from hoophalab December 8, 2025 18:42
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c5e3fe0 and ffa5cb7.

📒 Files selected for processing (5)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx (2 hunks)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.module.css (1 hunks)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx (1 hunks)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.module.css (1 hunks)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx (4 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{cpp,hpp,java,js,jsx,tpp,ts,tsx}

⚙️ CodeRabbit configuration file

  • Prefer false == <expression> rather than !<expression>.

Files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
🧠 Learnings (3)
📚 Learning: 2025-05-29T20:33:40.653Z
Learnt from: junhaoliao
Repo: y-scope/clp PR: 937
File: components/log-viewer-webui/client/src/AntdApp.tsx:16-24
Timestamp: 2025-05-29T20:33:40.653Z
Learning: In components/log-viewer-webui React codebase: Return type annotations (like `: JSX.Element`) are unnecessary and not preferred for React components in JSX/TSX files.

Applied to files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
📚 Learning: 2025-07-18T20:00:50.288Z
Learnt from: hoophalab
Repo: y-scope/clp PR: 1108
File: components/webui/client/src/pages/SearchPage/SearchControls/Presto/SqlQueryInput/index.tsx:15-15
Timestamp: 2025-07-18T20:00:50.288Z
Learning: In the y-scope/clp React webui client codebase, for Zustand store usage: use `useStore.getState().method` for callbacks since the output is not reactive and doesn't need state as a dependency in the hook, and use `useStore((state) => state.property)` with proper selectors for reactive components that need to re-render when state changes.

Applied to files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
📚 Learning: 2025-04-08T22:32:05.366Z
Learnt from: davemarco
Repo: y-scope/clp PR: 797
File: components/log-viewer-webui/client/src/components/Layout/MainLayout.tsx:2-5
Timestamp: 2025-04-08T22:32:05.366Z
Learning: In this codebase using React Router v7.4.1, components should be imported directly from "react-router" (e.g., `import { Link, Outlet } from "react-router";`) rather than from "react-router-dom" as was common in previous versions of React Router.

Applied to files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
🧬 Code graph analysis (2)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx (1)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/utils.tsx (4)
  • DATE_RANGE_PROP_KEY (197-197)
  • DATE_RANGE_POSITION (196-196)
  • TIME_RANGE_OPTION (202-202)
  • TIME_RANGE_DISPLAY_TEXT_MAP (201-201)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx (5)
components/webui/client/src/config/index.ts (1)
  • SETTINGS_QUERY_ENGINE (23-23)
components/webui/common/src/config.ts (1)
  • CLP_QUERY_ENGINES (53-53)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/utils.tsx (2)
  • isValidDateRange (200-200)
  • TIME_RANGE_OPTION (202-202)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx (1)
  • TimeDateInputProps (65-65)
components/webui/client/src/pages/SearchPage/SearchState/typings.ts (1)
  • SEARCH_UI_STATE (31-31)
🪛 Biome (2.1.2)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.tsx

[error] 57-74: Enforce to have the onClick mouse event with the onKeyUp, the onKeyDown, or the onKeyPress keyboard event.

Actions triggered using mouse events should have corresponding keyboard events to account for keyboard-only navigation.

(lint/a11y/useKeyWithClickEvents)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: package-image
🔇 Additional comments (5)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeRangePanel/index.module.css (1)

1-18: LGTM!

The CSS module defines clean, minimal styles for the panel layout. Dynamic styles (padding, hover states) are appropriately handled via inline styles using antd design tokens in the corresponding TSX file.

components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.module.css (1)

1-8: LGTM!

The removal of Select-specific styling aligns well with the refactoring to DatePicker.RangePicker. The remaining styles appropriately support the new component structure.

components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx (1)

23-52: LGTM!

The event handling and display logic are well-implemented. The component correctly switches to CUSTOM mode when the user manually edits the input, and the display text appropriately shows preset labels when closed and actual values when the picker is open or in CUSTOM mode.

components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx (2)

40-92: LGTM!

The state management and callback handlers are well-implemented. The automatic switch to CUSTOM mode when users manually change dates (line 54) is a good UX decision. All useCallback dependencies are correctly specified, and the separation of concerns between panel rendering, input customization, and event handling is clean.


94-100: LGTM!

The footer rendering logic correctly follows the coding guideline by using false === isPrestoGuided rather than !isPrestoGuided.

hoophalab
hoophalab previously approved these changes Dec 11, 2025
Copy link
Contributor

@hoophalab hoophalab left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. two nitpicks

Validation: clicking presets changes the selected time range.

Comment on lines +68 to +73
onMouseEnter={(e) => {
e.currentTarget.style.backgroundColor = token.controlItemBgHover;
}}
onMouseLeave={(e) => {
e.currentTarget.style.backgroundColor = "transparent";
}}
Copy link
Contributor

@hoophalab hoophalab Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This part isn't reactive. I guess you've tried having a backgroundColor state and use that state in style={{...}}? There is a short delay?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is doing the hover effect. and u cant put on hover in style {}. I would put in css file, but then u cant use antD token

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i may not understand what u mean by your comment

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I didn't make myself clear. How about this:

@@ -9,6 +9,7 @@ import {
     TIME_RANGE_OPTION_NAMES,
 } from "../utils";
 import styles from "./index.module.css";
+import {Nullable} from "@webui/common/utility-types";
 
 
 interface TimeRangePanelProps {
@@ -42,6 +43,8 @@ const TimeRangePanel = ({panelNode, onClose}: TimeRangePanelProps) => {
             });
     };
 
+    const [activeOption, setActiveOption] = React.useState<Nullable<string>>(null);
+
     return (
         <div className={styles["panelContainer"]}>
             <ul
@@ -61,15 +64,13 @@ const TimeRangePanel = ({panelNode, onClose}: TimeRangePanelProps) => {
                                 borderRadius: token.borderRadiusSM,
                                 paddingInline: token.paddingXS,
                                 paddingBlock: token.paddingXXS,
+                                backgroundColor: option === activeOption ? token.controlItemBgHover : "transparent"
                             }}
                             onClick={() => {
                                 handlePresetClick(option);
                             }}
                             onMouseEnter={(e) => {
-                                e.currentTarget.style.backgroundColor = token.controlItemBgHover;
-                            }}
-                            onMouseLeave={(e) => {
-                                e.currentTarget.style.backgroundColor = "transparent";
+                                setActiveOption(option);
                             }}
                         >
                             {option}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might need to set option as null when mouse leaves

value={displayText}/>
{...restProps}
value={displayText}
onBlur={handleBlur}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we pass onblur and onfocus directly to input through restprops? This way we don't need the two handle.* delegates

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ffa5cb7 and 5566006.

📒 Files selected for processing (2)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx (2 hunks)
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx (4 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{cpp,hpp,java,js,jsx,tpp,ts,tsx}

⚙️ CodeRabbit configuration file

  • Prefer false == <expression> rather than !<expression>.

Files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
🧠 Learnings (3)
📚 Learning: 2025-05-29T20:33:40.653Z
Learnt from: junhaoliao
Repo: y-scope/clp PR: 937
File: components/log-viewer-webui/client/src/AntdApp.tsx:16-24
Timestamp: 2025-05-29T20:33:40.653Z
Learning: In components/log-viewer-webui React codebase: Return type annotations (like `: JSX.Element`) are unnecessary and not preferred for React components in JSX/TSX files.

Applied to files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx
  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
📚 Learning: 2025-07-18T20:00:50.288Z
Learnt from: hoophalab
Repo: y-scope/clp PR: 1108
File: components/webui/client/src/pages/SearchPage/SearchControls/Presto/SqlQueryInput/index.tsx:15-15
Timestamp: 2025-07-18T20:00:50.288Z
Learning: In the y-scope/clp React webui client codebase, for Zustand store usage: use `useStore.getState().method` for callbacks since the output is not reactive and doesn't need state as a dependency in the hook, and use `useStore((state) => state.property)` with proper selectors for reactive components that need to re-render when state changes.

Applied to files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
📚 Learning: 2025-04-08T22:32:05.366Z
Learnt from: davemarco
Repo: y-scope/clp PR: 797
File: components/log-viewer-webui/client/src/components/Layout/MainLayout.tsx:2-5
Timestamp: 2025-04-08T22:32:05.366Z
Learning: In this codebase using React Router v7.4.1, components should be imported directly from "react-router" (e.g., `import { Link, Outlet } from "react-router";`) rather than from "react-router-dom" as was common in previous versions of React Router.

Applied to files:

  • components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx
🧬 Code graph analysis (1)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx (1)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/utils.tsx (4)
  • DATE_RANGE_PROP_KEY (197-197)
  • DATE_RANGE_POSITION (196-196)
  • TIME_RANGE_OPTION (202-202)
  • TIME_RANGE_DISPLAY_TEXT_MAP (201-201)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: package-image
  • GitHub Check: build (ubuntu-24.04)
  • GitHub Check: build (macos-15)
🔇 Additional comments (2)
components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/TimeDateInput.tsx (1)

23-48: LGTM! Props are now correctly forwarded via rest spread.

The implementation properly addresses the previous review feedback by spreading restProps to pass onBlur, onFocus, and other native input attributes directly to the underlying <input> element. The display logic correctly shows the actual value when the picker is open or in custom mode, restoring the preset label otherwise.

components/webui/client/src/pages/SearchPage/SearchControls/TimeRangeInput/index.tsx (1)

82-92: LGTM! Custom panel and input component integration.

The panelRender and inputComponent callbacks are correctly memoized with appropriate dependencies. The inputComponent pattern properly injects isPickerOpen state into TimeDateInput, enabling the display logic to show actual values when the picker is open per the PR objectives.

@davemarco davemarco requested a review from hoophalab December 11, 2025 18:32
@davemarco
Copy link
Contributor Author

@hoophalab i realized i could use antd menu instead of custom list. From their docs looks like menu is for navigation, but turns out u can use anywhere. So it handles hover. I also changed it to keep highlight when selected preset, so it is a bit fancier

Copy link
Contributor

@hoophalab hoophalab left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. much cleaner than before!

@hoophalab hoophalab requested a review from junhaoliao December 12, 2025 16:39
Copy link
Member

@junhaoliao junhaoliao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

deferring to @hoophalab 's review

@davemarco davemarco merged commit 598e2b6 into y-scope:main Dec 15, 2025
19 checks passed
davidlion pushed a commit to davidlion/clp that referenced this pull request Jan 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants