@clicktap/ui 0.43.3 → 0.43.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Collection/CollectionFilters/CollectionFilters.js +1 -1
- package/components/Collection/CollectionFilters/index.js +1 -1
- package/components/Collection/index.js +1 -1
- package/components/DialogTrigger/DialogTrigger.d.ts +21 -2
- package/components/DialogTrigger/DialogTrigger.js +1 -1
- package/components/ModalOverlay/ModalOverlay.d.ts +20 -0
- package/components/ModalOverlay/ModalOverlay.js +1 -1
- package/components/ModalOverlay/index.js +1 -1
- package/docs/migrations/2026/01/{2026-01-14-external-link-detection.md → ui-2026-01-14-external-link-detection.md} +1 -0
- package/docs/migrations/2026/01/{2026-01-14-use-route-hook.md → ui-2026-01-14-use-route-hook.md} +1 -0
- package/docs/migrations/2026/01/{2026-01-15-input-disable-skeleton.md → ui-2026-01-15-input-disable-skeleton.md} +1 -0
- package/docs/migrations/2026/02/{2026-02-17-select-popover-portal-container-restored.md → ui-2026-02-17-select-popover-portal-container-restored.md} +1 -0
- package/docs/migrations/2026/03/{2026-03-24-image-dimmed-hidden-onready.md → ui-2026-03-24-image-dimmed-hidden-onready.md} +1 -0
- package/docs/migrations/2026/03/{2026-03-24-modal-overlay-backdrop-dismiss.md → ui-2026-03-24-modal-overlay-backdrop-dismiss.md} +1 -0
- package/docs/migrations/2026/04/{2026-04-17-select-address-input-onchange-key-or-item.md → ui-2026-04-17-select-address-input-onchange-key-or-item.md} +1 -0
- package/docs/migrations/2026/05/{2026-05-01-build-pdp-url-util.md → ui-2026-05-01-build-pdp-url-util.md} +1 -0
- package/docs/migrations/2026/05/{2026-05-03-auth-aware-graphql-client.md → ui-2026-05-03-auth-aware-graphql-client.md} +1 -0
- package/docs/migrations/2026/05/{2026-05-20-framer-motion-11-idioms.md → ui-2026-05-20-framer-motion-11-idioms.md} +1 -0
- package/docs/migrations/2026/05/{2026-05-21-button-loading-content.md → ui-2026-05-21-button-loading-content.md} +1 -0
- package/docs/migrations/2026/05/{2026-05-21-password-check-hide-on-empty.md → ui-2026-05-21-password-check-hide-on-empty.md} +1 -0
- package/docs/migrations/2026/05/{2026-05-29-password-check-requirements-variant.md → ui-2026-05-29-password-check-requirements-variant.md} +3 -2
- package/docs/migrations/2026/06/{2026-06-17-select-standardization.md → ui-2026-06-17-select-standardization.md} +2 -1
- package/docs/migrations/2026/06/{2026-06-18-select-hiddenselect-setvalue-crash.md → ui-2026-06-18-select-hiddenselect-setvalue-crash.md} +1 -0
- package/docs/migrations/2026/07/{2026-07-31-ui-exports-bundler-resolution.md → ui-2026-07-31-ui-exports-bundler-resolution.md} +1 -0
- package/docs/migrations/2026/08/{2026-08-02-nextui-to-heroui.md → ui-2026-08-02-nextui-to-heroui.md} +1 -0
- package/docs/migrations/2026/08/{2026-08-04-password-reveal-press-and-hold.md → ui-2026-08-04-password-reveal-press-and-hold.md} +1 -0
- package/docs/migrations/2026/08/{2026-08-04-resend-code-control.md → ui-2026-08-04-resend-code-control.md} +1 -0
- package/docs/migrations/2026/08/{2026-08-06-clicktap-ui-image-next-subpath.md → ui-2026-08-06-clicktap-ui-image-next-subpath.md} +1 -0
- package/docs/migrations/2026/08/{2026-08-06-clicktap-ui-loaders-drop-framer-motion.md → ui-2026-08-06-clicktap-ui-loaders-drop-framer-motion.md} +2 -1
- package/docs/migrations/2026/08/{2026-08-06-clicktap-ui-semantic-tokens.md → ui-2026-08-06-clicktap-ui-semantic-tokens.md} +1 -0
- package/docs/migrations/2026/08/{2026-08-07-ui-peer-contract-form-graphql-optional-peers.md → ui-2026-08-07-ui-peer-contract-form-graphql-optional-peers.md} +1 -0
- package/docs/migrations/README.md +18 -18
- package/docs/migrations/index.json +23 -23
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsxs as l,Fragment as h,jsx as e}from"react/jsx-runtime";import{useMemo as b,Suspense as x,useState as v}from"react";import{Accordion as g}from"../../Accordion/Accordion.js";import{AccordionItem as w}from"@heroui/accordion";import{Button as f}from"../../Button/Button.js";import"../../../utils/cn.js";import{ModalOverlay as y}from"../../ModalOverlay/ModalOverlay.js";import{Modal as N}from"../../Modal/Modal.js";import{Drawer as k}from"../../Drawer/Drawer.js";import{Cross as C}from"../../Icon/Cross.js";import{CrossSmall as A}from"../../Icon/CrossSmall.js";import{Search as D}from"../../Icon/Search.js";import{FilterRenderer as I}from"../FilterRenderer/FilterRenderer.js";import{mergeFilters as S}from"../../../utils/collection/mergeFilters.js";import{FilterAccordionTitle as j}from"../FilterAccordionTitle/FilterAccordionTitle.js";import{EmptyResults as L}from"../EmptyResults/EmptyResults.js";import"../../Icon/DownArrow.js";import"react-aria-components";import"framer-motion";import"
|
|
1
|
+
"use client";import{jsxs as l,Fragment as h,jsx as e}from"react/jsx-runtime";import{useMemo as b,Suspense as x,useState as v}from"react";import{Accordion as g}from"../../Accordion/Accordion.js";import{AccordionItem as w}from"@heroui/accordion";import{Button as f}from"../../Button/Button.js";import"../../../utils/cn.js";import{ModalOverlay as y}from"../../ModalOverlay/ModalOverlay.js";import{Modal as N}from"../../Modal/Modal.js";import{Drawer as k}from"../../Drawer/Drawer.js";import{Cross as C}from"../../Icon/Cross.js";import{CrossSmall as A}from"../../Icon/CrossSmall.js";import{Search as D}from"../../Icon/Search.js";import{FilterRenderer as I}from"../FilterRenderer/FilterRenderer.js";import{mergeFilters as S}from"../../../utils/collection/mergeFilters.js";import{FilterAccordionTitle as j}from"../FilterAccordionTitle/FilterAccordionTitle.js";import{EmptyResults as L}from"../EmptyResults/EmptyResults.js";import"../../Icon/DownArrow.js";import"react-aria-components";import"framer-motion";import"../../../utils/env.js";import"../../../utils/swatch.js";import"../FilterRenderer/Renderer/Option.js";import"../../Checkbox/Checkbox.js";import"../FilterRenderer/Renderer/useOptionFilterToggle.js";import"../FilterRenderer/Renderer/Swatch.js";import"../FilterRenderer/Renderer/Swatch/SwatchColor.js";import"../../Icon/CheckIcon.js";import"../../../utils/color.js";import"../FilterRenderer/Renderer/Swatch/SwatchImage.js";import"../FilterRenderer/Renderer/Swatch/SwatchText.js";import"../FilterRenderer/Renderer/Boolean.js";import"../../RadioGroup/RadioGroup.js";import"../../Radio/Radio.js";import"../FilterRenderer/Renderer/Range.js";function M(){return e("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:e("path",{d:"M4 6L8 10L12 6",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function V({value:a,onChange:r}){const[o,c]=v(a),m=()=>{r(o.trim())};return l("div",{className:"relative",children:[e("input",{type:"search",value:o,onChange:i=>c(i.target.value),onKeyDown:i=>{i.key==="Enter"&&(i.preventDefault(),m())},onBlur:m,placeholder:"Search products...","aria-label":"Search products",autoComplete:"off",className:"w-full h-9 pl-8 pr-8 rounded-md border border-border bg-white text-sm text-fg placeholder:text-fg-subtle focus:outline-none focus:border-border-emphasis [&::-webkit-search-cancel-button]:hidden"}),o&&e("button",{type:"button",onClick:()=>{c(""),r("")},"aria-label":"Clear search",className:"absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded-full hover:bg-surface-subtle transition-colors",children:e(A,{})}),e("span",{className:"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 [&>svg]:w-full [&>svg]:h-full text-fg-subtle",children:e(D,{})})]})}function pe({availableFilters:a,appliedFilters:r,onFilterChange:o,showMobileFilters:c,setShowMobileFilters:m,searchQuery:s,onSearchChange:n,totalItems:i}){const u=b(()=>S(r,a).filter(t=>t.includeInFilters!==!1),[r,a]),d=n&&e(V,{value:s??"",onChange:n},s),p=()=>u.length>0&&e(g,{selectionMode:"multiple",defaultSelectedKeys:"all",className:"pt-2 mt-3",showDivider:!1,itemClasses:{base:"py-1",title:"text-sm font-medium leading-7",trigger:"py-2 border-b border-gray-200",indicator:'data-[open="true"]:rotate-180',content:"pt-2 pb-3"},children:u.map(t=>e(w,{textValue:t.label,title:e(j,{filter:t,appliedFilters:r,onFilterChange:o}),disableIndicatorAnimation:!0,indicator:M,children:e("div",{className:"pt-2",children:e(I,{filter:t,onFilterChange:o,appliedFilters:r,variant:"sidebar"})})},t.code))});return l(h,{children:[l("div",{className:"hidden lg:flex lg:flex-col lg:basis-[16.5rem] lg:shrink-0",children:[d,p(),r.length>0&&e("button",{type:"button",className:"text-sm text-fg-muted hover:text-slate-700 transition-colors mt-4 mb-8",onClick:()=>o([]),children:"Clear all filters"})]}),e("div",{className:"lg:hidden",children:e(x,{children:e(y,{isOpen:c,onOpenChange:t=>m(t),isDismissable:!0,children:e(N,{children:e(k,{size:"30rem",direction:"left","aria-label":"Filters",className:"p-5",children:({close:t})=>l("div",{className:"flex flex-col w-full h-full overflow-hidden",children:[l("div",{className:"flex items-center w-full justify-between",children:[e("span",{className:"text-xl font-bold text-slate-800",children:"Filters"}),e(f,{variant:"ghost","aria-label":"Close",onPress:()=>t(),className:"justify-start size-auto p-0",children:e(C,{})})]}),l("div",{className:"flex flex-col flex-1 overflow-x-hidden overflow-y-auto [scrollbar-width:none] [-webkit-overflow-scrolling:touch] [&::-webkit-scrollbar]:hidden",children:[d&&e("div",{className:"mt-3",children:d}),p(),i===0&&e(L,{searchQuery:s,hasFilters:r.length>0,onClearFilters:()=>o([]),onClearSearch:s&&n?()=>n(""):void 0})]}),l("div",{className:"shrink-0 pt-3 flex flex-col gap-3 border-t border-gray-200",children:[r.length>0&&e("button",{type:"button",className:"text-sm py-2 text-fg-muted hover:text-slate-700 transition-colors",onClick:()=>o([]),children:"Clear all"}),e(f,{className:"w-full py-6 text-base rounded-xl",variant:"primary",onPress:()=>t(),children:"View Results"})]})]})})})})})})]})}export{pe as CollectionFilters};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CollectionFilters as
|
|
1
|
+
import{CollectionFilters as K}from"./CollectionFilters.js";import"react/jsx-runtime";import"react";import"../../Accordion/Accordion.js";import"@heroui/accordion";import"../../../utils/cn.js";import"../../Icon/DownArrow.js";import"../../Button/Button.js";import"react-aria-components";import"../../ModalOverlay/ModalOverlay.js";import"framer-motion";import"../../Modal/Modal.js";import"../../Drawer/Drawer.js";import"../../Icon/Cross.js";import"../../Icon/CrossSmall.js";import"../../Icon/Search.js";import"../FilterRenderer/FilterRenderer.js";import"../../../utils/env.js";import"../../../utils/swatch.js";import"../FilterRenderer/Renderer/Option.js";import"../../Checkbox/Checkbox.js";import"../FilterRenderer/Renderer/useOptionFilterToggle.js";import"../FilterRenderer/Renderer/Swatch.js";import"../FilterRenderer/Renderer/Swatch/SwatchColor.js";import"../../Icon/CheckIcon.js";import"../../../utils/color.js";import"../FilterRenderer/Renderer/Swatch/SwatchImage.js";import"../FilterRenderer/Renderer/Swatch/SwatchText.js";import"../FilterRenderer/Renderer/Boolean.js";import"../../RadioGroup/RadioGroup.js";import"../../Radio/Radio.js";import"../FilterRenderer/Renderer/Range.js";import"../../../utils/collection/mergeFilters.js";import"../FilterAccordionTitle/FilterAccordionTitle.js";import"../EmptyResults/EmptyResults.js";export{K as CollectionFilters};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AttributeDataProvider as
|
|
1
|
+
import{AttributeDataProvider as U,useAttributeData as V}from"./AttributeDataProvider/AttributeDataProvider.js";import{EmptyResults as X}from"./EmptyResults/EmptyResults.js";import{ProductPrice as Z}from"./ProductPrice/ProductPrice.js";import{FilterRenderer as $}from"./FilterRenderer/FilterRenderer.js";import{CollectionFilterChips as or}from"./CollectionFilterChips/CollectionFilterChips.js";import{FilterAccordionTitle as ir}from"./FilterAccordionTitle/FilterAccordionTitle.js";import{ProductCardSwatches as mr}from"./ProductCardSwatches/ProductCardSwatches.js";import{CollectionFilters as lr}from"./CollectionFilters/CollectionFilters.js";import{CollectionToolbar as fr}from"./CollectionToolbar/CollectionToolbar.js";import"react/jsx-runtime";import"react";import"../../utils/env.js";import"../../utils/swatch.js";import"./FilterRenderer/Renderer/Option.js";import"../Checkbox/Checkbox.js";import"react-aria-components";import"../../utils/cn.js";import"./FilterRenderer/Renderer/useOptionFilterToggle.js";import"./FilterRenderer/Renderer/Swatch.js";import"./FilterRenderer/Renderer/Swatch/SwatchColor.js";import"../Icon/CheckIcon.js";import"../../utils/color.js";import"./FilterRenderer/Renderer/Swatch/SwatchImage.js";import"./FilterRenderer/Renderer/Swatch/SwatchText.js";import"./FilterRenderer/Renderer/Boolean.js";import"../RadioGroup/RadioGroup.js";import"../Radio/Radio.js";import"./FilterRenderer/Renderer/Range.js";import"../Button/Button.js";import"../Icon/CrossSmall.js";import"../../utils/collection/getAppliedFilterChips.js";import"../../utils/collection/removeFilterChip.js";import"../Accordion/Accordion.js";import"@heroui/accordion";import"../Icon/DownArrow.js";import"../ModalOverlay/ModalOverlay.js";import"framer-motion";import"../Modal/Modal.js";import"../Drawer/Drawer.js";import"../Icon/Cross.js";import"../Icon/Search.js";import"../../utils/collection/mergeFilters.js";import"../Select/Option.js";import"react-stately";import"../Select/Select.js";import"../Select/ButtonSelect.js";import"react-aria";import"@react-aria/interactions";import"../Select/parts.js";import"../Select/ComboBoxSelect.js";import"../Loader/Pulse.js";import"../Select/MultiButtonSelect.js";import"../Icon/FilterIcon.js";export{U as AttributeDataProvider,or as CollectionFilterChips,lr as CollectionFilters,fr as CollectionToolbar,X as EmptyResults,ir as FilterAccordionTitle,$ as FilterRenderer,mr as ProductCardSwatches,Z as ProductPrice,V as useAttributeData};
|
|
@@ -1,10 +1,29 @@
|
|
|
1
|
-
import { Dispatch, SetStateAction } from 'react';
|
|
2
1
|
import { DialogTriggerProps } from 'react-aria-components';
|
|
3
2
|
import { DriverAnimationState } from './DialogTrigger.types';
|
|
3
|
+
/**
|
|
4
|
+
* @deprecated The overlay animation state now lives in ModalOverlay, derived from react-aria's
|
|
5
|
+
* `OverlayTriggerStateContext` (CTAP-1210) — read that context directly instead. This shim keeps
|
|
6
|
+
* the old shape working: `animation` reflects the settled open state only (the transient `hidden`
|
|
7
|
+
* exit phase is overlay-internal), `setAnimation` is a no-op, and `onOpenChange` drives the
|
|
8
|
+
* react-aria state.
|
|
9
|
+
*/
|
|
4
10
|
export declare const useDialogTrigger: () => {
|
|
5
11
|
animation: DriverAnimationState;
|
|
6
|
-
setAnimation:
|
|
12
|
+
setAnimation: (animation: DriverAnimationState) => void;
|
|
7
13
|
onOpenChange: (isOpen: boolean) => void;
|
|
8
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Thin wrapper over react-aria's DialogTrigger, kept as the package's stable import point.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately NO module-scoped context here. The previous version mirrored the open state into
|
|
19
|
+
* its own `createContext` for the overlay's enter/exit animation — and a module-scoped context
|
|
20
|
+
* only works when every consumer resolves the SAME package instance. With two @clicktap/ui copies
|
|
21
|
+
* installed (an ordinary pnpm-workspace version skew), the trigger wrote into one context copy
|
|
22
|
+
* while the overlay read the other's default, so every trigger-driven modal mounted at
|
|
23
|
+
* `opacity: 0` with zero errors (CTAP-1210, reported by noco). The animation state now lives in
|
|
24
|
+
* ModalOverlay itself, derived from react-aria's `OverlayTriggerStateContext` — the one context
|
|
25
|
+
* that is reliably shared, because everything fails loudly if react-aria-components itself is
|
|
26
|
+
* duplicated.
|
|
27
|
+
*/
|
|
9
28
|
export declare function DialogTrigger(props: DialogTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
10
29
|
export default DialogTrigger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as r}from"react/jsx-runtime";import{
|
|
1
|
+
"use client";import{jsx as r}from"react/jsx-runtime";import{useContext as i}from"react";import{DialogTrigger as n,OverlayTriggerStateContext as o}from"react-aria-components";const m=()=>{const e=i(o);return{animation:e?.isOpen?"visible":"unmounted",setAnimation:()=>{},onOpenChange:t=>e?.setOpen(t)}};function u(e){return r(n,{...e})}export{u as DialogTrigger,u as default,m as useDialogTrigger};
|
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
import { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
import { OverlayTriggerState } from 'react-stately';
|
|
3
|
+
import { DriverAnimationState } from '../DialogTrigger/DialogTrigger.types';
|
|
1
4
|
import { ModalOverlayProps } from './ModalOverlay.types';
|
|
5
|
+
/**
|
|
6
|
+
* The overlay's enter/exit animation tri-state, derived from react-aria's own trigger state:
|
|
7
|
+
* open → `visible`; close-while-visible → `hidden` (the exit phase — `isExiting` keeps the
|
|
8
|
+
* react-aria overlay mounted while framer-motion plays it); `onAnimationComplete` then settles
|
|
9
|
+
* `hidden` → `unmounted`, letting react-aria unmount the portal.
|
|
10
|
+
*
|
|
11
|
+
* Derived HERE, from `OverlayTriggerStateContext`, and not mirrored through a package-owned
|
|
12
|
+
* context on DialogTrigger: a module-scoped context exists once PER PACKAGE INSTANCE, so with two
|
|
13
|
+
* @clicktap/ui copies installed (ordinary pnpm version skew) the trigger wrote `visible` into one
|
|
14
|
+
* copy while the overlay read the other's `unmounted` default — `animate="unmounted"` names no
|
|
15
|
+
* variant, framer-motion holds `initial: "hidden"`, and every trigger-driven modal sat mounted at
|
|
16
|
+
* `opacity: 0` with zero errors (CTAP-1210, noco). react-aria's context is the safe dependency:
|
|
17
|
+
* if react-aria-components itself is duplicated, everything breaks loudly.
|
|
18
|
+
*
|
|
19
|
+
* Exported for unit tests only.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useOverlayAnimationState(overlayState: OverlayTriggerState | null | undefined): [DriverAnimationState, Dispatch<SetStateAction<DriverAnimationState>>];
|
|
2
22
|
export declare function ModalOverlay(props: ModalOverlayProps): import("react/jsx-runtime").JSX.Element;
|
|
3
23
|
export default ModalOverlay;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as a}from"react/jsx-runtime";import{forwardRef as N,useContext as M,useState as k,useEffect as A,useId as R,useCallback as O}from"react";import{ModalOverlay as E,OverlayTriggerStateContext as w}from"react-aria-components";import{motion as T,AnimatePresence as F}from"framer-motion";import{cn as j}from"../../utils/cn.js";const q="body > [inert]:not(#__next):not([data-overlay-container])";function z(e){return Object.keys(e).some(t=>t.startsWith("__react"))}function p(){document.querySelectorAll(q).forEach(e=>e.removeAttribute("inert"))}function L(e){return!!(e.closest("[data-overlay-container]")||e.closest("#__next"))}const W=N(({style:e,children:t,...i},n)=>{const r=typeof e=="function"?e(i):e;return a(E,{...i,ref:n,style:r,children:t})});let m=null;function $(){return typeof window>"u"?null:(m||(m=T.create(W)),m)}const h=$();function g({animate:e,animation:t,setAnimation:i,className:n,animationVariants:r,isDismissable:u=!0,children:v,...x}){const C=R();A(()=>{p();const o=new MutationObserver(l=>{for(const d of l)if(d.type==="attributes"&&d.attributeName==="inert"){const f=d.target;f.parentElement===document.body?p():z(f)||f.removeAttribute("inert")}});return o.observe(document.body,{attributes:!0,attributeFilter:["inert"],subtree:!0}),()=>o.disconnect()},[]);const{key:S,shouldCloseOnInteractOutside:c,onOpenChange:s,..._}=x,P=O(o=>c?c(o):L(o),[c]),y=M(w),I=O(o=>{!u||o.target!==o.currentTarget||(s?s(!1):y?.close())},[u,s,y]),b={isDismissable:u,shouldCloseOnInteractOutside:P,onOpenChange:s,onPointerDown:I,className:j("bg-black/30 backdrop-blur-sm","fixed top-0 left-0","z-[1000]","w-screen h-[var(--visual-viewport-height)]",n),..._};return h?a(h,{isExiting:t==="hidden",onAnimationComplete:o=>{i(l=>o==="hidden"&&l==="hidden"?"unmounted":l)},variants:r||{hidden:{opacity:0,transition:{delay:.08}},visible:{opacity:1}},initial:"hidden",animate:e,exit:"hidden",...b,children:v},S||C):a(E,{...b,children:v})}function B(e){const t=e?.isOpen??!1,[i,n]=k(t?"visible":"unmounted");return A(()=>{n(t?"visible":r=>r==="visible"?"hidden":r)},[t]),[i,n]}function Q(e){const{isOpen:t}=e,i=M(w),[n,r]=B(i);return t!==void 0?a(F,{children:t&&a(g,{...e,animate:"visible",animation:n,setAnimation:r})}):a(g,{...e,animate:n,animation:n,setAnimation:r})}export{Q as ModalOverlay,Q as default,B as useOverlayAnimationState};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ModalOverlay as
|
|
1
|
+
import{ModalOverlay as e}from"./ModalOverlay.js";import"react/jsx-runtime";import"react";import"react-aria-components";import"framer-motion";import"../../utils/cn.js";export{e as ModalOverlay};
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui`, `apps/frontend`
|
|
6
6
|
**Breaking:** No (additive, but requires provider setup for SSR)
|
|
7
7
|
**Classification:** IMPROVEMENT
|
|
8
|
+
**Formerly named:** `2026-01-14-external-link-detection.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
## Dependencies
|
package/docs/migrations/2026/01/{2026-01-14-use-route-hook.md → ui-2026-01-14-use-route-hook.md}
RENAMED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui`, `apps/frontend`
|
|
6
6
|
**Breaking:** No (additive, but recommended migration)
|
|
7
7
|
**Classification:** IMPROVEMENT
|
|
8
|
+
**Formerly named:** `2026-01-14-use-route-hook.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
## Dependencies
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui`, `apps/frontend`
|
|
6
6
|
**Breaking:** No
|
|
7
7
|
**Classification:** IMPROVEMENT
|
|
8
|
+
**Formerly named:** `2026-01-15-input-disable-skeleton.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
## Dependencies
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui` Select component, any consumer using Select inside Dialog or Modal
|
|
6
6
|
**Classification:** BUGFIX
|
|
7
7
|
**Breaking:** No
|
|
8
|
+
**Formerly named:** `2026-02-17-select-popover-portal-container-restored.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
**Classification:** IMPROVEMENT
|
|
7
7
|
**Breaking:** No
|
|
8
8
|
**Group:** plp-image-transitions
|
|
9
|
+
**Formerly named:** `2026-03-24-image-dimmed-hidden-onready.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
9
10
|
|
|
10
11
|
## Dependencies
|
|
11
12
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui` — `ModalOverlay` component
|
|
6
6
|
**Classification:** BUGFIX
|
|
7
7
|
**Breaking:** No
|
|
8
|
+
**Formerly named:** `2026-03-24-modal-overlay-backdrop-dismiss.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** Frontend apps consuming `@clicktap/ui`'s `Select` and components that re-export its types (`AddressInput`, etc.). Any handler typed as `(value: Key) => void` breaks after the update.
|
|
6
6
|
**Classification:** COMPATIBILITY
|
|
7
7
|
**Breaking:** Yes — TypeScript-only. No runtime change; existing handlers still receive the same value at runtime, but strict TS setups fail to compile.
|
|
8
|
+
**Formerly named:** `2026-04-17-select-address-input-onchange-key-or-item.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
**Breaking:** No (additive)
|
|
8
8
|
**Status:** ⚠️ **Superseded — never shipped. Do not adopt.** (CTAP-1077)
|
|
9
9
|
**Superseded by:** the backend line-item `productUrl` fields — `QuoteItem.productUrl` / `OrderItem.productUrl` (see `2026-06-08-quote-item-product-url.md` and `2026-06-08-order-item-product-url.md` in the `quote-graphql` / `order-graphql` modules).
|
|
10
|
+
**Formerly named:** `2026-05-01-build-pdp-url-util.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
10
11
|
|
|
11
12
|
> ⚠️ **This export was never published.** As of `@clicktap/ui` **0.40.9** there is no
|
|
12
13
|
> `@clicktap/ui/utils/buildPdpUrl` — do not try to import it (there is no "shipped in X" version to check
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui/utils/createAuthAwareGraphqlClient` — new export
|
|
6
6
|
**Classification:** IMPROVEMENT
|
|
7
7
|
**Breaking:** No (additive)
|
|
8
|
+
**Formerly named:** `2026-05-03-auth-aware-graphql-client.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui/components/Dialog`, `@clicktap/ui/components/ModalOverlay`, `@clicktap/ui/components/Badge`, `@clicktap/ui/components/Loader/CircularEasing`, `@clicktap/ui/components/Loader/Pulse`, and any consumer-side `motion.*` usage on framer-motion 11.x.
|
|
6
6
|
**Classification:** COMPATIBILITY
|
|
7
7
|
**Breaking:** Yes (for consumers passing custom `animationVariants` containing multi-function `transform` strings, transform/scale primitives in modal variants, calc-with-mixed-units in animate targets, or who copy-paste the affected motion patterns into their own components — see Consumer Impact)
|
|
8
|
+
**Formerly named:** `2026-05-20-framer-motion-11-idioms.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui/components/Button` (new `ButtonLoadingContent` export) and every submit-style button in the frontend app.
|
|
6
6
|
**Classification:** IMPROVEMENT
|
|
7
7
|
**Breaking:** No
|
|
8
|
+
**Formerly named:** `2026-05-21-button-loading-content.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `libs/ui/src/components/PasswordCheck/PasswordCheck.tsx`
|
|
6
6
|
**Classification:** IMPROVEMENT
|
|
7
7
|
**Breaking:** No
|
|
8
|
+
**Formerly named:** `2026-05-21-password-check-hide-on-empty.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
**Affects:** `libs/ui/src/components/PasswordCheck/PasswordCheck.tsx`, `libs/ui/src/components/PasswordCheck/PasswordCheck.types.ts`
|
|
6
6
|
**Classification:** IMPROVEMENT
|
|
7
7
|
**Breaking:** No (the variant is additive; `default` is unchanged)
|
|
8
|
+
**Formerly named:** `2026-05-29-password-check-requirements-variant.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
11
|
-
- [`PasswordCheck` `requirements` variant hides until the visitor types](./2026-05-21-password-check-hide-on-empty.md) — the hide-on-empty refinement to this same variant.
|
|
12
|
+
- [`PasswordCheck` `requirements` variant hides until the visitor types](./ui-2026-05-21-password-check-hide-on-empty.md) — the hide-on-empty refinement to this same variant.
|
|
12
13
|
|
|
13
14
|
## Summary
|
|
14
15
|
|
|
@@ -26,7 +27,7 @@ This guide documents the `requirements` variant of `PasswordCheck` so forked UI
|
|
|
26
27
|
|
|
27
28
|
## Behavior
|
|
28
29
|
|
|
29
|
-
- **Hides when `value` is empty** — showing four unchecked bullets before any input reads as a list of demands rather than live feedback. (See the [hide-on-empty guide](./2026-05-21-password-check-hide-on-empty.md).)
|
|
30
|
+
- **Hides when `value` is empty** — showing four unchecked bullets before any input reads as a list of demands rather than live feedback. (See the [hide-on-empty guide](./ui-2026-05-21-password-check-hide-on-empty.md).)
|
|
30
31
|
- Each rule transitions from `○` (slate) to `✓` (green) as it's met.
|
|
31
32
|
- The 5-bar strength meter colors match the `default` variant's meter (red → yellow → green → blue by strength).
|
|
32
33
|
- The component is stateless and pure — strength is derived from `value` via `checkStrength`.
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** Any app consuming `@clicktap/ui`'s `Select` / `DropdownSelect` (Crispi, FFL, and any fork that renders pickers, sort controls, country/region selects, or configurable-product options).
|
|
6
6
|
**Classification:** FEATURE + BREAKING
|
|
7
7
|
**Breaking:** Yes — (1) `DropdownSelect` removed, (2) the bare `<Select>` is now a **button picker**, not a combobox, (3) `DropdownSelect`'s `classNames.trigger` is now `classNames.input`, (4) the root is `w-full` by default, (5) `<Option>` is react-stately's `Item` — keyed by `key` (no `id`) and **cannot be wrapped**.
|
|
8
|
+
**Formerly named:** `2026-06-17-select-standardization.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -284,4 +285,4 @@ Safe — presentation-layer only, no persistent state.
|
|
|
284
285
|
- Types: `libs/ui/src/components/Select/Select.types.ts`
|
|
285
286
|
- Stories: `libs/ui/src/components/Select/Select.stories.tsx` (`Picker`, `Searchable`, `SearchableAuto`, `AsyncDataSource`, `ServerSideSearch`, `ThemedOptions`, `Grouped`, `Multiple`, `GroupedMultiple`, `ButtonMultiple`)
|
|
286
287
|
- In-repo consumer examples: `apps/frontend/components/AddressForm/AddressForm.tsx` (country/region, autofill, aliases), `apps/frontend/components/Collection/CollectionToolbar.tsx` (toolbar width), `apps/frontend/components/Product/components/ConfigurableOptions/ConfigurableOptions.tsx`
|
|
287
|
-
- Related: [`Select` `onSelectionChange` widened to `Key | T`](../04/2026-04-17-select-address-input-onchange-key-or-item.md), [`Select` `popoverPortalContainer` restored](../02/2026-02-17-select-popover-portal-container-restored.md)
|
|
288
|
+
- Related: [`Select` `onSelectionChange` widened to `Key | T`](../04/ui-2026-04-17-select-address-input-onchange-key-or-item.md), [`Select` `popoverPortalContainer` restored](../02/ui-2026-02-17-select-popover-portal-container-restored.md)
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui` `Select` — the **searchable** (ComboBox) variant (`ComboBoxSelect`)
|
|
6
6
|
**Classification:** BUGFIX
|
|
7
7
|
**Breaking:** No
|
|
8
|
+
**Formerly named:** `2026-06-18-select-hiddenselect-setvalue-crash.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Why
|
|
10
11
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
**Revised:** 2026-08-08 — the test-runner half (CTAP-1195): every runtime subpath entry gains a `default` condition, so CJS resolvers (Jest) stop falling through to the `.d.ts`. See "Test runners (Jest)" below; reported by noco.
|
|
5
5
|
**Package:** `@clicktap/ui`
|
|
6
6
|
**Breaking:** No — additive to the `exports` map. Existing `moduleResolution: node` / `node10`
|
|
7
|
+
**Formerly named:** `2026-07-31-ui-exports-bundler-resolution.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
7
8
|
consumers are unaffected (that resolver ignores `exports`); this only *adds* working resolution under
|
|
8
9
|
`bundler` / `node16` / `nodenext`.
|
|
9
10
|
**Classification:** BUGFIX (packaging) — unblocks `moduleResolution: bundler`, and with it TypeScript 7
|
package/docs/migrations/2026/08/{2026-08-02-nextui-to-heroui.md → ui-2026-08-02-nextui-to-heroui.md}
RENAMED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui` peer dependencies — `Accordion`, `Badge`, `Pagination`, `Tooltip`
|
|
6
6
|
**Classification:** DEPENDENCY
|
|
7
7
|
**Breaking:** Yes (peer dependencies change; requires Tailwind 4 — see below)
|
|
8
|
+
**Formerly named:** `2026-08-02-nextui-to-heroui.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Dependencies
|
|
10
11
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui` — `Input` with `type="password"`.
|
|
6
6
|
**Classification:** IMPROVEMENT (security / UX)
|
|
7
7
|
**Breaking:** Behavioural only — the reveal changed from a click-toggle to press-and-hold. No API/prop
|
|
8
|
+
**Formerly named:** `2026-08-04-password-reveal-press-and-hold.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
change; adoption is automatic.
|
|
9
10
|
**Ticket:** CTAP-1128
|
|
10
11
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
**Classification:** IMPROVEMENT (new capability)
|
|
7
7
|
**Breaking:** No — additive exports.
|
|
8
8
|
**Consumers:** the OTP resend timer — [wire it everywhere](../../../../../../apps/frontend/docs/migrations/2026/08/2026-08-04-otp-resend-timer.md) ·
|
|
9
|
+
**Formerly named:** `2026-08-04-resend-code-control.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
9
10
|
GraphQL contract — [resend mutations](../../../../../../libs/mezzio-modules/user/docs/migrations/2026/08/2026-08-04-otp-resend-mutations.md)
|
|
10
11
|
|
|
11
12
|
## Summary
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
**Requires:** `@clicktap/ui` at the release bundling CTAP-1125. Next consumers additionally need `next >= 14` installed — it is now an **optional peer**, so your package manager will not add it for you.
|
|
8
8
|
**Classification:** IMPROVEMENT
|
|
9
9
|
**Breaking:** Yes, for Next consumers — one import path per call site. See "If you are a Next app" below.
|
|
10
|
+
**Formerly named:** `2026-08-06-clicktap-ui-image-next-subpath.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
10
11
|
|
|
11
12
|
## What changed and why
|
|
12
13
|
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui` — `Button`, `ButtonLoadingContent`, `Loader/CircularEasing`, `Loader/Pulse`
|
|
6
6
|
**Breaking:** No API change. **One requirement to be aware of** — see below.
|
|
7
7
|
**Requires:** `@import '@clicktap/ui/theme.css'` in your CSS entry
|
|
8
|
-
|
|
8
|
+
**Formerly named:** `2026-08-06-clicktap-ui-loaders-drop-framer-motion.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
9
|
+
([tokens guide](./ui-2026-08-06-clicktap-ui-semantic-tokens.md))
|
|
9
10
|
**Classification:** IMPROVEMENT
|
|
10
11
|
|
|
11
12
|
## What changed
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Affects:** `@clicktap/ui`, every app that renders its components
|
|
6
6
|
**Breaking:** **Yes — one required import.** Components render *unstyled* without it.
|
|
7
7
|
**Requires:** Tailwind v4 (`@import 'tailwindcss'` in your CSS entry). See
|
|
8
|
+
**Formerly named:** `2026-08-06-clicktap-ui-semantic-tokens.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
[the v4 upgrade guide](../../../../../../apps/frontend/docs/migrations/2026/07/2026-07-31-tailwind-3-to-4.md).
|
|
9
10
|
**Classification:** COMPATIBILITY
|
|
10
11
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
**Requires:** `@clicktap/ui` at the first release after 0.42.0
|
|
6
6
|
**Classification:** COMPATIBILITY
|
|
7
7
|
**Breaking:** No for minimal consumers; action needed only if you use the form or GraphQL-aware components
|
|
8
|
+
**Formerly named:** `2026-08-07-ui-peer-contract-form-graphql-optional-peers.md` — renamed 2026-08-10 (CTAP-1214) for global filename uniqueness; library guides carry their package slug so they can never collide with an app-level guide in a consumer's aggregated working set. **If you carry a `-applied` sibling under the old name, rename it to match — do NOT re-apply.**
|
|
8
9
|
|
|
9
10
|
## Why this exists
|
|
10
11
|
|
|
@@ -8,27 +8,27 @@ For migrations affecting the frontend app, see [frontend migrations](../../../..
|
|
|
8
8
|
|
|
9
9
|
| Date | Migration | Breaking | Dependencies |
|
|
10
10
|
|------|-----------|----------|--------------|
|
|
11
|
-
| 2026-01-14 | [External link detection + `LinkProvider`](./2026/01/2026-01-14-external-link-detection.md) | No | *None* |
|
|
12
|
-
| 2026-01-14 | [`useRoute` hook + `RouteProvider`](./2026/01/2026-01-14-use-route-hook.md) | No | *None* |
|
|
13
|
-
| 2026-01-15 | [`Input` `disableSkeleton` prop](./2026/01/2026-01-15-input-disable-skeleton.md) | No | *None* |
|
|
11
|
+
| 2026-01-14 | [External link detection + `LinkProvider`](./2026/01/ui-2026-01-14-external-link-detection.md) | No | *None* |
|
|
12
|
+
| 2026-01-14 | [`useRoute` hook + `RouteProvider`](./2026/01/ui-2026-01-14-use-route-hook.md) | No | *None* |
|
|
13
|
+
| 2026-01-15 | [`Input` `disableSkeleton` prop](./2026/01/ui-2026-01-15-input-disable-skeleton.md) | No | *None* |
|
|
14
14
|
| 2026-02-16 | [Environment utilities — `@clicktap/ui/utils/env`](./2026/02/ui-2026-02-16-env-utils-from-clicktap-ui.md) | No | *None* |
|
|
15
|
-
| 2026-02-17 | [`Select` `popoverPortalContainer` restored](./2026/02/2026-02-17-select-popover-portal-container-restored.md) | No | *None* |
|
|
16
|
-
| 2026-03-24 | [Image: dimmed, hidden, and onReady Props](./2026/03/2026-03-24-image-dimmed-hidden-onready.md) ↔ | No | *None* |
|
|
17
|
-
| 2026-03-24 | [ModalOverlay: fix dismiss on backdrop click](./2026/03/2026-03-24-modal-overlay-backdrop-dismiss.md) | No | *None* |
|
|
18
|
-
| 2026-04-17 | [`Select`/`AddressInput` `onChange` widened to `Key \| T`](./2026/04/2026-04-17-select-address-input-onchange-key-or-item.md) | Yes | *None* |
|
|
15
|
+
| 2026-02-17 | [`Select` `popoverPortalContainer` restored](./2026/02/ui-2026-02-17-select-popover-portal-container-restored.md) | No | *None* |
|
|
16
|
+
| 2026-03-24 | [Image: dimmed, hidden, and onReady Props](./2026/03/ui-2026-03-24-image-dimmed-hidden-onready.md) ↔ | No | *None* |
|
|
17
|
+
| 2026-03-24 | [ModalOverlay: fix dismiss on backdrop click](./2026/03/ui-2026-03-24-modal-overlay-backdrop-dismiss.md) | No | *None* |
|
|
18
|
+
| 2026-04-17 | [`Select`/`AddressInput` `onChange` widened to `Key \| T`](./2026/04/ui-2026-04-17-select-address-input-onchange-key-or-item.md) | Yes | *None* |
|
|
19
19
|
| 2026-04-24 | [`PLACEHOLDER_IMAGE` Export from `@clicktap/ui/utils/placeholder`](./2026/04/ui-2026-04-24-image-placeholder-frontend-fallback.md) ↔ | No | *None* |
|
|
20
20
|
| 2026-04-30 | [Top-Down PDP Option Dependency — `@clicktap/ui/utils/variantOptions`](./2026/04/ui-2026-04-30-top-down-pdp-option-dependency.md) ↔ | No | *None* |
|
|
21
21
|
| 2026-04-30 | [PDP Option Selection — Conservative Prune Helper (`pruneInvalidSelections`)](./2026/04/ui-2026-04-30-prune-invalid-pdp-selections.md) ↔ | No | Top-Down PDP Option Dependency |
|
|
22
|
-
| 2026-05-01 | [`buildPdpUrl` Utility — `@clicktap/ui/utils/buildPdpUrl`](./2026/05/2026-05-01-build-pdp-url-util.md) | No | *None* |
|
|
23
|
-
| 2026-05-03 | [Auth-aware GraphQL client — `@clicktap/ui/utils/createAuthAwareGraphqlClient`](./2026/05/2026-05-03-auth-aware-graphql-client.md) | No | *None* |
|
|
24
|
-
| 2026-05-20 | [framer-motion 11.x idioms — opacity-only for modals, primitives elsewhere, matched keyframe shapes](./2026/05/2026-05-20-framer-motion-11-idioms.md) ↔ | Yes (custom `animationVariants` only) | *None* |
|
|
25
|
-
| 2026-05-21 | [`ButtonLoadingContent` helper — right-side spinner for all submit buttons](./2026/05/2026-05-21-button-loading-content.md) ↔ | No | *None* |
|
|
26
|
-
| 2026-05-21 | [`PasswordCheck` `requirements` variant hides until the visitor types](./2026/05/2026-05-21-password-check-hide-on-empty.md) | No | *None* |
|
|
27
|
-
| 2026-05-29 | [`PasswordCheck` — the `requirements` variant (adoption guide for forks)](./2026/05/2026-05-29-password-check-requirements-variant.md) | No | PasswordCheck hide-on-empty |
|
|
28
|
-
| 2026-06-17 | [Select standardization — one `<Select searchable>`, `DropdownSelect` removed](./2026/06/2026-06-17-select-standardization.md) ↔ | Yes | *None* |
|
|
29
|
-
| 2026-06-18 | [Select (searchable): fix "setValue is not a function" crash on browser autofill](./2026/06/2026-06-18-select-hiddenselect-setvalue-crash.md) | No | Select standardization |
|
|
30
|
-
| 2026-08-04 | [`ResendCode` control + `useCooldown` hook](./2026/08/2026-08-04-resend-code-control.md) ↔ | No | OTP resend timer (CTAP-1114) |
|
|
31
|
-
| 2026-08-04 | [Password reveal is press-and-hold, not a toggle](./2026/08/2026-08-04-password-reveal-press-and-hold.md) | Behavioural | *None* (CTAP-1128) |
|
|
32
|
-
| 2026-08-06 | [`Image` is framework-free; Next's optimizer moves to `@clicktap/ui/next`](./2026/08/2026-08-06-clicktap-ui-image-next-subpath.md) ↔ | Yes (Next consumers) | *None* |
|
|
22
|
+
| 2026-05-01 | [`buildPdpUrl` Utility — `@clicktap/ui/utils/buildPdpUrl`](./2026/05/ui-2026-05-01-build-pdp-url-util.md) | No | *None* |
|
|
23
|
+
| 2026-05-03 | [Auth-aware GraphQL client — `@clicktap/ui/utils/createAuthAwareGraphqlClient`](./2026/05/ui-2026-05-03-auth-aware-graphql-client.md) | No | *None* |
|
|
24
|
+
| 2026-05-20 | [framer-motion 11.x idioms — opacity-only for modals, primitives elsewhere, matched keyframe shapes](./2026/05/ui-2026-05-20-framer-motion-11-idioms.md) ↔ | Yes (custom `animationVariants` only) | *None* |
|
|
25
|
+
| 2026-05-21 | [`ButtonLoadingContent` helper — right-side spinner for all submit buttons](./2026/05/ui-2026-05-21-button-loading-content.md) ↔ | No | *None* |
|
|
26
|
+
| 2026-05-21 | [`PasswordCheck` `requirements` variant hides until the visitor types](./2026/05/ui-2026-05-21-password-check-hide-on-empty.md) | No | *None* |
|
|
27
|
+
| 2026-05-29 | [`PasswordCheck` — the `requirements` variant (adoption guide for forks)](./2026/05/ui-2026-05-29-password-check-requirements-variant.md) | No | PasswordCheck hide-on-empty |
|
|
28
|
+
| 2026-06-17 | [Select standardization — one `<Select searchable>`, `DropdownSelect` removed](./2026/06/ui-2026-06-17-select-standardization.md) ↔ | Yes | *None* |
|
|
29
|
+
| 2026-06-18 | [Select (searchable): fix "setValue is not a function" crash on browser autofill](./2026/06/ui-2026-06-18-select-hiddenselect-setvalue-crash.md) | No | Select standardization |
|
|
30
|
+
| 2026-08-04 | [`ResendCode` control + `useCooldown` hook](./2026/08/ui-2026-08-04-resend-code-control.md) ↔ | No | OTP resend timer (CTAP-1114) |
|
|
31
|
+
| 2026-08-04 | [Password reveal is press-and-hold, not a toggle](./2026/08/ui-2026-08-04-password-reveal-press-and-hold.md) | Behavioural | *None* (CTAP-1128) |
|
|
32
|
+
| 2026-08-06 | [`Image` is framework-free; Next's optimizer moves to `@clicktap/ui/next`](./2026/08/ui-2026-08-06-clicktap-ui-image-next-subpath.md) ↔ | Yes (Next consumers) | *None* |
|
|
33
33
|
|
|
34
34
|
↔ = cross-app migration (has counterpart in frontend app)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
|
-
"path": "2026/08/2026-08-07-ui-peer-contract-form-graphql-optional-peers.md",
|
|
3
|
+
"path": "2026/08/ui-2026-08-07-ui-peer-contract-form-graphql-optional-peers.md",
|
|
4
4
|
"module": "libs/frontend-modules/ui",
|
|
5
5
|
"package": "@clicktap/ui",
|
|
6
6
|
"date": "2026-08-07",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"affects": ""
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
|
-
"path": "2026/08/2026-08-06-clicktap-ui-semantic-tokens.md",
|
|
13
|
+
"path": "2026/08/ui-2026-08-06-clicktap-ui-semantic-tokens.md",
|
|
14
14
|
"module": "libs/frontend-modules/ui",
|
|
15
15
|
"package": "@clicktap/ui",
|
|
16
16
|
"date": "2026-08-06",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"affects": "`@clicktap/ui`, every app that renders its components"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
|
-
"path": "2026/08/2026-08-06-clicktap-ui-loaders-drop-framer-motion.md",
|
|
23
|
+
"path": "2026/08/ui-2026-08-06-clicktap-ui-loaders-drop-framer-motion.md",
|
|
24
24
|
"module": "libs/frontend-modules/ui",
|
|
25
25
|
"package": "@clicktap/ui",
|
|
26
26
|
"date": "2026-08-06",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"affects": "`@clicktap/ui` — `Button`, `ButtonLoadingContent`, `Loader/CircularEasing`, `Loader/Pulse`"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
|
-
"path": "2026/08/2026-08-06-clicktap-ui-image-next-subpath.md",
|
|
33
|
+
"path": "2026/08/ui-2026-08-06-clicktap-ui-image-next-subpath.md",
|
|
34
34
|
"module": "libs/frontend-modules/ui",
|
|
35
35
|
"package": "@clicktap/ui",
|
|
36
36
|
"date": "2026-08-06",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"affects": "Any consumer importing `@clicktap/ui/components/Image` or `@clicktap/ui/components/UploadImage`. Consumer counterpart: [`apps/frontend/docs/migrations/2026/08/2026-08-06-image-from-clicktap-ui-next.md`](../../../../../../apps/frontend/docs/migrations/2026/08/2026-08-06-image-from-clicktap-ui-next.md)"
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
|
-
"path": "2026/08/2026-08-04-resend-code-control.md",
|
|
43
|
+
"path": "2026/08/ui-2026-08-04-resend-code-control.md",
|
|
44
44
|
"module": "libs/frontend-modules/ui",
|
|
45
45
|
"package": "@clicktap/ui",
|
|
46
46
|
"date": "2026-08-04",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"affects": "`@clicktap/ui` — new `components/ResendCode` and `hooks/useCooldown` exports."
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
|
-
"path": "2026/08/2026-08-04-password-reveal-press-and-hold.md",
|
|
53
|
+
"path": "2026/08/ui-2026-08-04-password-reveal-press-and-hold.md",
|
|
54
54
|
"module": "libs/frontend-modules/ui",
|
|
55
55
|
"package": "@clicktap/ui",
|
|
56
56
|
"date": "2026-08-04",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"affects": "`@clicktap/ui` — `Input` with `type=\"password\"`."
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
|
-
"path": "2026/08/2026-08-02-nextui-to-heroui.md",
|
|
63
|
+
"path": "2026/08/ui-2026-08-02-nextui-to-heroui.md",
|
|
64
64
|
"module": "libs/frontend-modules/ui",
|
|
65
65
|
"package": "@clicktap/ui",
|
|
66
66
|
"date": "2026-08-02",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"affects": "`@clicktap/ui` peer dependencies — `Accordion`, `Badge`, `Pagination`, `Tooltip`"
|
|
71
71
|
},
|
|
72
72
|
{
|
|
73
|
-
"path": "2026/07/2026-07-31-ui-exports-bundler-resolution.md",
|
|
73
|
+
"path": "2026/07/ui-2026-07-31-ui-exports-bundler-resolution.md",
|
|
74
74
|
"module": "libs/frontend-modules/ui",
|
|
75
75
|
"package": "@clicktap/ui",
|
|
76
76
|
"date": "2026-07-31",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"affects": ""
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
|
-
"path": "2026/06/2026-06-18-select-hiddenselect-setvalue-crash.md",
|
|
83
|
+
"path": "2026/06/ui-2026-06-18-select-hiddenselect-setvalue-crash.md",
|
|
84
84
|
"module": "libs/frontend-modules/ui",
|
|
85
85
|
"package": "@clicktap/ui",
|
|
86
86
|
"date": "2026-06-18",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"affects": "`@clicktap/ui` `Select` — the **searchable** (ComboBox) variant (`ComboBoxSelect`)"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
|
-
"path": "2026/06/2026-06-17-select-standardization.md",
|
|
93
|
+
"path": "2026/06/ui-2026-06-17-select-standardization.md",
|
|
94
94
|
"module": "libs/frontend-modules/ui",
|
|
95
95
|
"package": "@clicktap/ui",
|
|
96
96
|
"date": "2026-06-17",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"affects": "Any app consuming `@clicktap/ui`'s `Select` / `DropdownSelect` (Crispi, FFL, and any fork that renders pickers, sort controls, country/region selects, or configurable-product options)."
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
|
-
"path": "2026/05/2026-05-29-password-check-requirements-variant.md",
|
|
103
|
+
"path": "2026/05/ui-2026-05-29-password-check-requirements-variant.md",
|
|
104
104
|
"module": "libs/frontend-modules/ui",
|
|
105
105
|
"package": "@clicktap/ui",
|
|
106
106
|
"date": "2026-05-29",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"affects": "`libs/ui/src/components/PasswordCheck/PasswordCheck.tsx`, `libs/ui/src/components/PasswordCheck/PasswordCheck.types.ts`"
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
|
-
"path": "2026/05/2026-05-21-password-check-hide-on-empty.md",
|
|
113
|
+
"path": "2026/05/ui-2026-05-21-password-check-hide-on-empty.md",
|
|
114
114
|
"module": "libs/frontend-modules/ui",
|
|
115
115
|
"package": "@clicktap/ui",
|
|
116
116
|
"date": "2026-05-21",
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"affects": "`libs/ui/src/components/PasswordCheck/PasswordCheck.tsx`"
|
|
121
121
|
},
|
|
122
122
|
{
|
|
123
|
-
"path": "2026/05/2026-05-21-button-loading-content.md",
|
|
123
|
+
"path": "2026/05/ui-2026-05-21-button-loading-content.md",
|
|
124
124
|
"module": "libs/frontend-modules/ui",
|
|
125
125
|
"package": "@clicktap/ui",
|
|
126
126
|
"date": "2026-05-21",
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"affects": "`@clicktap/ui/components/Button` (new `ButtonLoadingContent` export) and every submit-style button in the frontend app."
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
|
-
"path": "2026/05/2026-05-20-framer-motion-11-idioms.md",
|
|
133
|
+
"path": "2026/05/ui-2026-05-20-framer-motion-11-idioms.md",
|
|
134
134
|
"module": "libs/frontend-modules/ui",
|
|
135
135
|
"package": "@clicktap/ui",
|
|
136
136
|
"date": "2026-05-20",
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
"affects": "`@clicktap/ui/components/Dialog`, `@clicktap/ui/components/ModalOverlay`, `@clicktap/ui/components/Badge`, `@clicktap/ui/components/Loader/CircularEasing`, `@clicktap/ui/components/Loader/Pulse`, and any consumer-side `motion.*` usage on framer-motion 11.x."
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
|
-
"path": "2026/05/2026-05-03-auth-aware-graphql-client.md",
|
|
143
|
+
"path": "2026/05/ui-2026-05-03-auth-aware-graphql-client.md",
|
|
144
144
|
"module": "libs/frontend-modules/ui",
|
|
145
145
|
"package": "@clicktap/ui",
|
|
146
146
|
"date": "2026-05-03",
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"affects": "`@clicktap/ui/utils/createAuthAwareGraphqlClient` — new export"
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
|
-
"path": "2026/05/2026-05-01-build-pdp-url-util.md",
|
|
153
|
+
"path": "2026/05/ui-2026-05-01-build-pdp-url-util.md",
|
|
154
154
|
"module": "libs/frontend-modules/ui",
|
|
155
155
|
"package": "@clicktap/ui",
|
|
156
156
|
"date": "2026-05-01",
|
|
@@ -190,7 +190,7 @@
|
|
|
190
190
|
"affects": "`@clicktap/ui` consumers that render product/category images"
|
|
191
191
|
},
|
|
192
192
|
{
|
|
193
|
-
"path": "2026/04/2026-04-17-select-address-input-onchange-key-or-item.md",
|
|
193
|
+
"path": "2026/04/ui-2026-04-17-select-address-input-onchange-key-or-item.md",
|
|
194
194
|
"module": "libs/frontend-modules/ui",
|
|
195
195
|
"package": "@clicktap/ui",
|
|
196
196
|
"date": "2026-04-17",
|
|
@@ -200,7 +200,7 @@
|
|
|
200
200
|
"affects": "Frontend apps consuming `@clicktap/ui`'s `Select` and components that re-export its types (`AddressInput`, etc.). Any handler typed as `(value: Key) => void` breaks after the update."
|
|
201
201
|
},
|
|
202
202
|
{
|
|
203
|
-
"path": "2026/03/2026-03-24-modal-overlay-backdrop-dismiss.md",
|
|
203
|
+
"path": "2026/03/ui-2026-03-24-modal-overlay-backdrop-dismiss.md",
|
|
204
204
|
"module": "libs/frontend-modules/ui",
|
|
205
205
|
"package": "@clicktap/ui",
|
|
206
206
|
"date": "2026-03-24",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
"affects": "`@clicktap/ui` — `ModalOverlay` component"
|
|
211
211
|
},
|
|
212
212
|
{
|
|
213
|
-
"path": "2026/03/2026-03-24-image-dimmed-hidden-onready.md",
|
|
213
|
+
"path": "2026/03/ui-2026-03-24-image-dimmed-hidden-onready.md",
|
|
214
214
|
"module": "libs/frontend-modules/ui",
|
|
215
215
|
"package": "@clicktap/ui",
|
|
216
216
|
"date": "2026-03-24",
|
|
@@ -220,7 +220,7 @@
|
|
|
220
220
|
"affects": "`@clicktap/ui` — `Image` component"
|
|
221
221
|
},
|
|
222
222
|
{
|
|
223
|
-
"path": "2026/02/2026-02-17-select-popover-portal-container-restored.md",
|
|
223
|
+
"path": "2026/02/ui-2026-02-17-select-popover-portal-container-restored.md",
|
|
224
224
|
"module": "libs/frontend-modules/ui",
|
|
225
225
|
"package": "@clicktap/ui",
|
|
226
226
|
"date": "2026-02-17",
|
|
@@ -240,7 +240,7 @@
|
|
|
240
240
|
"affects": "All files importing `isDevelopment` / `isProduction` from local `utils/env`"
|
|
241
241
|
},
|
|
242
242
|
{
|
|
243
|
-
"path": "2026/01/2026-01-15-input-disable-skeleton.md",
|
|
243
|
+
"path": "2026/01/ui-2026-01-15-input-disable-skeleton.md",
|
|
244
244
|
"module": "libs/frontend-modules/ui",
|
|
245
245
|
"package": "@clicktap/ui",
|
|
246
246
|
"date": "2026-01-15",
|
|
@@ -250,7 +250,7 @@
|
|
|
250
250
|
"affects": "`@clicktap/ui`, `apps/frontend`"
|
|
251
251
|
},
|
|
252
252
|
{
|
|
253
|
-
"path": "2026/01/2026-01-14-use-route-hook.md",
|
|
253
|
+
"path": "2026/01/ui-2026-01-14-use-route-hook.md",
|
|
254
254
|
"module": "libs/frontend-modules/ui",
|
|
255
255
|
"package": "@clicktap/ui",
|
|
256
256
|
"date": "2026-01-14",
|
|
@@ -260,7 +260,7 @@
|
|
|
260
260
|
"affects": "`@clicktap/ui`, `apps/frontend`"
|
|
261
261
|
},
|
|
262
262
|
{
|
|
263
|
-
"path": "2026/01/2026-01-14-external-link-detection.md",
|
|
263
|
+
"path": "2026/01/ui-2026-01-14-external-link-detection.md",
|
|
264
264
|
"module": "libs/frontend-modules/ui",
|
|
265
265
|
"package": "@clicktap/ui",
|
|
266
266
|
"date": "2026-01-14",
|