rtk.debug to true. Previously math.random() was used with a fixed seed, which significantly weakened random number generation for other uses.rtk.Window.onclose() event handler is now invoked on all script exit conditions if the window is openrtk.Window.w or rtk.Window.h attributes to nil (which denotes autosizing) within an event handler (#20)rtk.Image:blur() before the image has been loadedtable.tostring()halign / valign parameters for rtk.Window:open() sometimes not being respectedrtk.Entry.caret reflects the correct position before firing rtk.Entry.onchange (#19)xml module, which can be used to parse a subset of XML. The API is in preview and is not considered stable. Feedback appreciated.rtk.Slider's API has been promoted to stable (however vertical orientiation is not yet implemented)auto for rtk.Viewport.vscrollbar that will reserve space for the scrollbar if scrolling is required to see all contentrtk.Window now supports relative values (i.e. between 0 and 1.0 inclusive) for minw, minh, maxw, and maxh attributesrtk.Widget.hotzone attribute, which allows adjusting the area around the widget's normal boundary where mouse interactions will register. This can be useful to allow a widget to be clickable even if the user inadvertently clicks within the margin or spacing in a box, for example, which in particular can improve UX on touch screensonkeypress events when any descendant of the container is focusedrtk.Viewport.vscrollbar is set to hover (default) the scrollbar now becomes visible when the mouse enters anywhere within the viewport, rather than only when near the scrollbar gutterrtk.Window autosizing (i.e. when width or height is not set) when the window contains "greedy" widgets that want to fill their parent containers as much as possiblertk.Window:open() now defaults to center alignmentrtk.Widget.onclick, rtk.Widget.ondoubleclick, and rtk.Widget.onlongpress no longer require rtk.Widget.autofocus to be explicitly set or have a custom rtk.Widget.onmousedown handler to fire. They will be invoked on all widgets unless rtk.Widget.onmousedown explicitly returns false to disable this behaviorrtk.Widget.autofocus now defaults to true if an onclick is set on the widget, but it can be explicitly set to false to never autofocusrtk.Application.status textrtk.Text.textrtk.Image.icon() are no longer automatically recolored when the image is found in an image path that was registered without an explicit icon stylertk.Image.icon()rtk.Popup.onopen and rtk.Popup.onclose event handlersrtk.Popup.autoclose to be able to distinguish between clicks that occur outside the popup but still within the ReaScript window, or outside the window entirelyrtk.Popup.overlay to be themedcolorname#aa where colorname is the name of the color and aa is the hex code of the alpha channel. For example, bg='chartreuse#7f'rtk.Text.color which is now default. Unless the attribute is explicitly set, the text color will use rtk.themes.text from either the dark theme or the light theme, depending on the luminance of the background the text will be rendered overrtk.Entry.icon) to take into account parent's background when the widget has a translucent background such that it that would blend with the parent's background colorrtk.Widget.bg or rtk.Widget.ghost are set as these do not affect geometryrtk.tick that increments with each gfx update cycle, and add rtk.Event.tick to reflect the tick at which the event occurredminw/minh but the minimum size would exceed the allowed cell size in a boxmaxw cell attribute for expanded cells in rtk.HBoxrtk.Box.spacing was non-zerortk.Viewport.vscrollbar was set to alwaysrtk.ImageBox borders and background color is drawn even if rtk.ImageBox.image is nilrtk.ImageBox.bg, if set, when determining which luma-adaptive image variant to usertk.Widget.w and rtk.Widget.h to 0, or to rtk.Attribute.NIL (nil was already supported)rtk.Widget.bg to nilrtk.Window.x and rtk.Window.y with undocked windowsrtk.scale.value to rtk.Widget.minw, minh, maxw, and maxh when rtk.Widget.scalability allows itrtk.Button when the button label wrapsrtk.Window.title as the first positional value during initialization. In principle this is a breaking change however it never actually worked properly, so this just removes a broken feature.rtk.Window.onclose could fire multiple times when the window closesrtk.Window when the border attribute was setrtk.Window when REAPER's native UI scaling was enabledrtk.Window attributesrtk.Window padding is now accounted for by the resize grip when rtk.Window.borderless is truertk.Button would not always respect the parent container's bounding boxrtk.Popup.opened attribute which wasn't being properly updated to reflect current statertk.Popup.anchor is defined and rtk.scale.value is > 1rtk.Popup.autoclose enabled could inadvertently close when rtk.touchscroll was enabledrtk.Popup at the same time as its rtk.Popup.anchor widget is hiddenrtk.Entry could be drawn outside its boxrtk.Viewport even when rtk.Viewport.vscrollbar is set to neverrtk.Viewport has non-zero paddingrtk.FlowBox would only ever use a single column if it contained any greedy children (e.g. those using relative dimensions, or belonging to a box container with expand or fillw cell attributes set)rtk.FlowBox could layout with zero columnsrtk.Spacer failing to take into account padding when calculating its sizertk.Window to ensure widget draw functions that reference rtk.Window.in_window reflect the proper state visuallyrtk.Widget.cursor was not being respected when long-pressing over a widget with rtk.touchscroll enabledrtk.Widget.onclick no longer fires if rtk.Widget.onlongpress fires and its handler returns true to mark the event as handledrtk.Entry background when its parent container's background changestargetidx parameter for rtk.Container:reorder() previously required offseting the index by 1 of the target was after the widget's current cell position, which is now fixed. Technically this is a breaking API change, but the previous semantics were extremely counterintuitive and this API was not widely used by scripts so this is being slipped in as a bug fix.rtk.log timestampsrtk.touchscroll is enabledrtk.Window now supports automatic sizing based on its contents when rtk.Window.w and/or rtk.Window.h are nil at the time rtk.Window:open() is called, which is now the default behaviorrtk.Slider, which currently in beta and will be promoted in the next minor releasertk.Window.resizable which controls the resizability of undocked windowsupdate callback passed to rtk.queue_animation() now receives the animation table as the 4th argumentrtk.Entry's value attribute can be be received as the first positional argumentrtk.Text.text on a fixed-width text widget (optimization)rtk.Window:get_normalized_y()rtk.Container when rtk.Container.padding is nonzerortk.Entry.value changesrtk.Entry.placeholder when calculating the entry widget's intrinsic sizealpha attribute for rtk.Windowrtk.OptionMenu:onchange() when explicitly passing false to the trigger argument of rtk.OptionMenu:select() even if the selected item changedrtk.scale.framebuffer when dockedrtk.Window:onresize() handler fires when dock state changesrtk.Window.x and rtk.Window.y attributesrtk.Window:open() alignment options when reopening windows on Macs with Retina displaysrtk.Window:close() is calledrtk.scale.framebuffer, which indicates the ratio of the internal gfx frame buffer to the OS window geometryrtk.font.multiplier on reflowrtk.Window:open() is called with constrain optionrtk.Window.w or rtk.Window.h attribute, fixed a bug where the other dimension would end up being halved on MacOS systems with Retina displaysInitial release marking API stability.