@mks2508/mks-ui 0.6.4 → 0.6.6

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 (20) hide show
  1. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.d.ts +10 -2
  2. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.d.ts.map +1 -1
  3. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.js +13 -25
  4. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.module-7y-To7On.css +20 -0
  5. package/dist/react-ui/ui/DynamicToggle/{DynamicToggle.css → DynamicToggle.module-BE6uirOX.css} +2 -1
  6. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.module.js +0 -0
  7. package/dist/react-ui/ui/DynamicToggle/index.d.ts +1 -1
  8. package/dist/react-ui/ui/DynamicToggle/index.d.ts.map +1 -1
  9. package/dist/react-ui/ui/DynamicToggle/index.js +1 -1
  10. package/dist/react-ui/ui/Tabs/Tabs.module-CFzRKHsx.css +38 -0
  11. package/dist/react-ui/ui/Tabs/Tabs.module.js +0 -0
  12. package/dist/react-ui/ui/Tabs/index.d.ts +1 -0
  13. package/dist/react-ui/ui/Tabs/index.d.ts.map +1 -1
  14. package/dist/react-ui/ui/Tabs/index.js +1 -22
  15. package/package.json +4 -3
  16. package/dist/react-ui/ui/DynamicToggle/DynamicToggle-DJLwEkHr.css +0 -369
  17. /package/dist/react-ui/blocks/Terminal/panel/{terminal-filter-dropdown.module-C6oDcFBS.css → terminal-filter-dropdown.module-p4Aks9qK.css} +0 -0
  18. /package/dist/react-ui/blocks/Terminal/panel/{terminal-session-tabs.module-D_-sgyza.css → terminal-session-tabs.module-D7g8zk0W.css} +0 -0
  19. /package/dist/react-ui/components/MorphingPopover/{morphing-popover.module-B1ftlaYj.css → morphing-popover.module-s63snw7C.css} +0 -0
  20. /package/dist/react-ui/{ui/DynamicToggle/DynamicToggle.js → primitives/waapi/Morph/techniques/useViewTransitions.module.js} +0 -0
@@ -1,3 +1,4 @@
1
+ import './useViewTransitions.module.css';
1
2
  import type { IViewTransitionsOptions, IViewTransitionsAPI } from '../Morph.types';
2
3
  /**
3
4
  * Hook for the View Transitions API.
@@ -10,18 +11,25 @@ import type { IViewTransitionsOptions, IViewTransitionsAPI } from '../Morph.type
10
11
  * - Firefox 144+
11
12
  * - Safari latest
12
13
  *
13
- * @param options - Optional view transition name and types
14
+ * View transition styles are applied via CSS module, eliminating
15
+ * the need for runtime style injection. Elements should have
16
+ * `view-transition-name` applied via inline style or CSS class.
17
+ *
18
+ * @param options - Optional view transition name (deprecated, use inline style)
14
19
  * @returns View Transitions API with support detection and transition trigger
15
20
  *
16
21
  * @example
17
22
  * ```tsx
18
- * const { isSupported, startTransition } = useViewTransitions({ name: 'hero' });
23
+ * const { isSupported, startTransition } = useViewTransitions();
19
24
  *
20
25
  * const handleTransition = async () => {
21
26
  * await startTransition(() => {
22
27
  * setActiveImage(nextImage);
23
28
  * });
24
29
  * };
30
+ *
31
+ * // Apply view-transition-name to elements
32
+ * <div style={{ viewTransitionName: 'hero' }}>...</div>
25
33
  * ```
26
34
  */
27
35
  export declare function useViewTransitions(options?: IViewTransitionsOptions): IViewTransitionsAPI;
@@ -1 +1 @@
1
- {"version":3,"file":"useViewTransitions.d.ts","sourceRoot":"","sources":["../../../../../../src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,mBAAmB,CAyDzF"}
1
+ {"version":3,"file":"useViewTransitions.d.ts","sourceRoot":"","sources":["../../../../../../src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts"],"names":[],"mappings":"AAGA,OAAO,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,mBAAmB,CAoCzF"}
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import "./useViewTransitions.module.js";
3
4
  import { useCallback, useMemo, useRef } from "react";
4
5
 
5
6
  //#region src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts
@@ -14,22 +15,29 @@ import { useCallback, useMemo, useRef } from "react";
14
15
  * - Firefox 144+
15
16
  * - Safari latest
16
17
  *
17
- * @param options - Optional view transition name and types
18
+ * View transition styles are applied via CSS module, eliminating
19
+ * the need for runtime style injection. Elements should have
20
+ * `view-transition-name` applied via inline style or CSS class.
21
+ *
22
+ * @param options - Optional view transition name (deprecated, use inline style)
18
23
  * @returns View Transitions API with support detection and transition trigger
19
24
  *
20
25
  * @example
21
26
  * ```tsx
22
- * const { isSupported, startTransition } = useViewTransitions({ name: 'hero' });
27
+ * const { isSupported, startTransition } = useViewTransitions();
23
28
  *
24
29
  * const handleTransition = async () => {
25
30
  * await startTransition(() => {
26
31
  * setActiveImage(nextImage);
27
32
  * });
28
33
  * };
34
+ *
35
+ * // Apply view-transition-name to elements
36
+ * <div style={{ viewTransitionName: 'hero' }}>...</div>
29
37
  * ```
30
38
  */
31
39
  function useViewTransitions(options) {
32
- const optionsRef = useRef(options);
40
+ useRef(options);
33
41
  const typesRef = useRef(options?.types || []);
34
42
  const isSupported = useMemo(() => {
35
43
  if (typeof document === "undefined") return false;
@@ -45,30 +53,10 @@ function useViewTransitions(options) {
45
53
  await callback();
46
54
  return;
47
55
  }
48
- const viewTransitionName = optionsRef.current?.name;
49
- const setupStyles = () => {
50
- if (viewTransitionName) {
51
- const styleEl = document.createElement("style");
52
- styleEl.id = `view-transition-${viewTransitionName}`;
53
- styleEl.textContent = `
54
- ::view-transition-old(${viewTransitionName}),
55
- ::view-transition-new(${viewTransitionName}) {
56
- animation-duration: 300ms;
57
- animation-timing-function: ease-out;
58
- }
59
- `;
60
- document.head.appendChild(styleEl);
61
- return () => {
62
- styleEl.remove();
63
- };
64
- }
65
- return () => {};
66
- };
67
- const cleanup = setupStyles();
68
56
  try {
69
57
  await document.startViewTransition(callback).finished;
70
- } finally {
71
- cleanup();
58
+ } catch (error) {
59
+ await callback();
72
60
  }
73
61
  }, []),
74
62
  setTypes
@@ -0,0 +1,20 @@
1
+ /**
2
+ * View Transitions API - Default transition styles.
3
+ *
4
+ * These styles apply to all view-transition pseudo-elements by default,
5
+ * eliminating the need for dynamic style injection based on transition names.
6
+ *
7
+ * Usage: Apply `view-transition-name` via inline style or CSS variable:
8
+ * <div style={{ viewTransitionName: 'hero' }}>...</div>
9
+ *
10
+ * Or via CSS:
11
+ * .my-element { view-transition-name: hero; }
12
+ */
13
+
14
+ /* Default animation for all view transitions */
15
+ ::view-transition-old(*),
16
+ ::view-transition-new(*) {
17
+ animation-duration: 300ms;
18
+ animation-timing-function: ease-out;
19
+ }
20
+
@@ -4,7 +4,7 @@
4
4
  * Rules requiring :has(), container queries, clip-path, or pseudo-elements.
5
5
  * Layout, colors, sizing in Tailwind (DynamicToggle.styles.ts).
6
6
  *
7
- * @import '@mks2508/mks-ui/dist/react-ui/ui/DynamicToggle/DynamicToggle.css';
7
+ * @import '@mks2508/mks-ui/react/ui/DynamicToggle/DynamicToggle.module.css';
8
8
  */
9
9
 
10
10
  /* ── Variables ── */
@@ -366,3 +366,4 @@
366
366
  position: relative;
367
367
  z-index: 1;
368
368
  }
369
+
@@ -1,4 +1,4 @@
1
- import './DynamicToggle.css';
1
+ import './DynamicToggle.module.css';
2
2
  import { dynamicToggleVariants } from './DynamicToggle.styles';
3
3
  import type { DynamicToggleContextType, IDynamicToggleProps, IDynamicToggleOptionProps, IDynamicToggleGroupProps } from './DynamicToggle.types';
4
4
  declare const useDynamicToggle: () => DynamicToggleContextType;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/react-ui/ui/DynamicToggle/index.tsx"],"names":[],"mappings":"AA8BA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAuB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EACV,wBAAwB,EAIxB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAM/B,QAAA,MAA8B,gBAAgB,gCACsB,CAAC;AAmCrE;;GAEG;AACH,iBAAS,aAAa,CAAC,EACrB,OAAO,EACP,IAAI,EACJ,KAAK,EACL,KAAK,EAAE,SAAS,EAChB,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,aAAa,EACb,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAuGrB;kBArHQ,aAAa;;;AA2HtB;;GAEG;AACH,iBAAS,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,yBAAyB,2CA2BrF;kBA3BQ,mBAAmB;;;AAiC5B;;;GAGG;AACH,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,MAAM,EACN,cAAsB,EACtB,aAAuB,EACvB,QAAQ,EACR,SAAS,GACV,EAAE,wBAAwB,2CA0C1B;kBAjDQ,kBAAkB;;;AA4D3B,2DAA2D;AAC3D,KAAK,qBAAqB,GAAG,OAAO,aAAa,GAAG;IAClD,MAAM,EAAE,OAAO,mBAAmB,CAAC;IACnC,KAAK,EAAE,OAAO,kBAAkB,CAAC;CAClC,CAAC;AASF,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,GACtB,CAAC;AAEF,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/react-ui/ui/DynamicToggle/index.tsx"],"names":[],"mappings":"AA8BA,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAuB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EACV,wBAAwB,EAIxB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAM/B,QAAA,MAA8B,gBAAgB,gCACsB,CAAC;AAmCrE;;GAEG;AACH,iBAAS,aAAa,CAAC,EACrB,OAAO,EACP,IAAI,EACJ,KAAK,EACL,KAAK,EAAE,SAAS,EAChB,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,aAAa,EACb,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAuGrB;kBArHQ,aAAa;;;AA2HtB;;GAEG;AACH,iBAAS,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,yBAAyB,2CA2BrF;kBA3BQ,mBAAmB;;;AAiC5B;;;GAGG;AACH,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,MAAM,EACN,cAAsB,EACtB,aAAuB,EACvB,QAAQ,EACR,SAAS,GACV,EAAE,wBAAwB,2CA0C1B;kBAjDQ,kBAAkB;;;AA4D3B,2DAA2D;AAC3D,KAAK,qBAAqB,GAAG,OAAO,aAAa,GAAG;IAClD,MAAM,EAAE,OAAO,mBAAmB,CAAC;IACnC,KAAK,EAAE,OAAO,kBAAkB,CAAC;CAClC,CAAC;AASF,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,GACtB,CAAC;AAEF,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -4,7 +4,7 @@ import { cn } from "../../lib/utils.js";
4
4
  import { GooeyCanvas } from "../../primitives/waapi/Gooey/GooeyCanvas.js";
5
5
  import { getStrictContext } from "../../lib/get-strict-context.js";
6
6
  import { useControlledState } from "../../hooks/State/UseControlledState.js";
7
- import "./DynamicToggle.js";
7
+ import "./DynamicToggle.module.js";
8
8
  import { dynamicToggleStyles, dynamicToggleVariants } from "./DynamicToggle.styles.js";
9
9
  import * as React$1 from "react";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Tabs CSS Anchor Positioning.
3
+ *
4
+ * Zero-JS position tracking for the sliding indicator using CSS Anchor API.
5
+ * The indicator automatically follows the active tab via anchor positioning.
6
+ */
7
+
8
+ /* Scope anchors per Tabs instance */
9
+ [data-slot="tabs-list"] {
10
+ anchor-scope: --tabs-active;
11
+ }
12
+
13
+ /* Active tab becomes the anchor */
14
+ [data-slot="tabs-tab"][data-active] {
15
+ anchor-name: --tabs-active;
16
+ }
17
+
18
+ /* Indicator follows the active anchor */
19
+ [data-slot="tabs-indicator"] {
20
+ position-anchor: --tabs-active;
21
+ left: anchor(left);
22
+ right: anchor(right);
23
+ transition:
24
+ top 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
25
+ left 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
26
+ right 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
27
+ bottom 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
28
+ width 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
29
+ height 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
30
+ }
31
+
32
+ /* Respect reduced motion preference */
33
+ @media (prefers-reduced-motion: reduce) {
34
+ [data-slot="tabs-indicator"] {
35
+ transition-duration: 0ms;
36
+ }
37
+ }
38
+
File without changes
@@ -1,4 +1,5 @@
1
1
  import { tabsListVariants, tabsTabVariants, tabsIndicatorVariants } from './Tabs.styles';
2
+ import './Tabs.module.css';
2
3
  import type { ITabsProps, ITabsHighlightProps, ITabsHighlightItemProps, ITabsListProps, ITabsTabProps, ITabsPanelProps, ITabsPanelsProps } from './Tabs.types';
3
4
  /**
4
5
  * Root Tabs component -- provides active tab value context and
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/react-ui/ui/Tabs/index.tsx"],"names":[],"mappings":"AAoEA,OAAO,EAEL,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAEV,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAgDtB;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,2CAiB/D;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,aAAa,CAAC,EACrB,UAA4D,EAC5D,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,mBAAmB,2CAcrB;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,QAAQ,CAAC,EAChB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,KAAK,EACL,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,2CA+BhB;AAMD;;;;;;;;;;;;;;GAcG;AACH,iBAAS,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,uBAAuB,2CAEtE;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,2CAgB5E;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,SAAS,CAAC,EACjB,KAAK,EACL,WAAW,EACX,UAAiD,EACjD,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,2CAsBjB;AAuBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,iBAAS,UAAU,CAAC,KAAK,EAAE,gBAAgB,2CAiD1C;AAMD,OAAO,EACL,IAAI,EACJ,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,CAAC;AAGF,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/react-ui/ui/Tabs/index.tsx"],"names":[],"mappings":"AAoEA,OAAO,EAEL,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAEV,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAqBtB;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,2CAiB/D;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,aAAa,CAAC,EACrB,UAA4D,EAC5D,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,mBAAmB,2CAcrB;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,QAAQ,CAAC,EAChB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,KAAK,EACL,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,2CA8BhB;AAMD;;;;;;;;;;;;;;GAcG;AACH,iBAAS,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,uBAAuB,2CAEtE;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,2CAgB5E;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,SAAS,CAAC,EACjB,KAAK,EACL,WAAW,EACX,UAAiD,EACjD,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,2CAsBjB;AAuBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,iBAAS,UAAU,CAAC,KAAK,EAAE,gBAAgB,2CAiD1C;AAMD,OAAO,EACL,IAAI,EACJ,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,CAAC;AAGF,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -6,6 +6,7 @@ import { AutoHeight } from "../../primitives/AutoHeight/index.js";
6
6
  import { getStrictContext } from "../../lib/get-strict-context.js";
7
7
  import { useControlledState } from "../../hooks/State/UseControlledState.js";
8
8
  import { tabsIndicatorVariants, tabsListVariants, tabsStyles, tabsTabVariants } from "./Tabs.styles.js";
9
+ import "./Tabs.module.js";
9
10
  import * as React$1 from "react";
10
11
  import { AnimatePresence, motion } from "motion/react";
11
12
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -61,27 +62,6 @@ import { Tabs } from "@base-ui/react/tabs";
61
62
  * </Tabs>
62
63
  * ```
63
64
  */
64
- const TABS_CSS_ID = "mks-tabs-anchor-css";
65
- const TABS_ANCHOR_CSS = `
66
- [data-slot="tabs-list"]{anchor-scope:--tabs-active}
67
- [data-slot="tabs-tab"][data-active]{anchor-name:--tabs-active}
68
- [data-slot="tabs-indicator"]{position-anchor:--tabs-active;left:anchor(left);right:anchor(right);transition:top 200ms cubic-bezier(.25,.46,.45,.94),left 200ms cubic-bezier(.25,.46,.45,.94),right 200ms cubic-bezier(.25,.46,.45,.94),bottom 200ms cubic-bezier(.25,.46,.45,.94),width 200ms cubic-bezier(.25,.46,.45,.94),height 200ms cubic-bezier(.25,.46,.45,.94)}
69
- @media(prefers-reduced-motion:reduce){[data-slot="tabs-indicator"]{transition-duration:0ms}}
70
- `;
71
- /**
72
- * Injects the CSS Anchor Positioning rules into the document head once.
73
- * Safe for SSR -- no-ops on the server.
74
- */
75
- function useTabsAnchorCSS() {
76
- React$1.useEffect(() => {
77
- if (typeof document === "undefined") return;
78
- if (document.getElementById(TABS_CSS_ID)) return;
79
- const style = document.createElement("style");
80
- style.id = TABS_CSS_ID;
81
- style.textContent = TABS_ANCHOR_CSS;
82
- document.head.appendChild(style);
83
- }, []);
84
- }
85
65
  const [TabsProvider, useTabs] = getStrictContext("TabsContext");
86
66
  const TabsVariantCtx = React$1.createContext({});
87
67
  /**
@@ -175,7 +155,6 @@ function TabsHighlight({ transition = {
175
155
  * ```
176
156
  */
177
157
  function TabsList({ variant, size, indicator, slots, className, children, ...props }) {
178
- useTabsAnchorCSS();
179
158
  const resolvedVariant = variant ?? "default";
180
159
  const showIndicator = indicator ?? !["ghost", "underline"].includes(resolvedVariant);
181
160
  return /* @__PURE__ */ jsx(TabsVariantCtx.Provider, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mks2508/mks-ui",
3
- "version": "0.6.4",
3
+ "version": "0.6.6",
4
4
  "description": "UI component library - Shadcn/Animate UI based with DevEnv components",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -81,14 +81,15 @@
81
81
  "types": "./dist/react-ui/blocks/Terminal/display.d.ts",
82
82
  "import": "./dist/react-ui/blocks/Terminal/display.js",
83
83
  "default": "./dist/react-ui/blocks/Terminal/display.js"
84
- }
84
+ },
85
+ "./index.css": "./dist/index.css"
85
86
  },
86
87
  "files": [
87
88
  "dist"
88
89
  ],
89
90
  "scripts": {
90
91
  "dev": "vite",
91
- "build": "rm -rf dist && bunx rolldown --config rolldown.config.ts && bunx tsc --emitDeclarationOnly && bunx tsc-alias && cp src/index.css dist/index.css && mkdir -p dist/react-ui/ui/DynamicToggle && cp src/react-ui/ui/DynamicToggle/DynamicToggle.css dist/react-ui/ui/DynamicToggle/DynamicToggle.css",
92
+ "build": "rm -rf dist && bunx rolldown --config rolldown.config.ts && bunx tsc --emitDeclarationOnly && bunx tsc-alias && cp src/index.css dist/index.css",
92
93
  "typecheck": "bunx tsc --noEmit",
93
94
  "lint": "bunx oxlint .",
94
95
  "preview": "vite preview",
@@ -1,369 +0,0 @@
1
- /**
2
- * DynamicToggle v2 — CSS state transitions.
3
- *
4
- * Rules requiring :has(), container queries, clip-path, or pseudo-elements.
5
- * Layout, colors, sizing in Tailwind (DynamicToggle.styles.ts).
6
- *
7
- * @import '@mks2508/mks-ui/dist/react-ui/ui/DynamicToggle/DynamicToggle.css';
8
- */
9
-
10
- /* ── Variables ── */
11
- [data-slot="dt-root"] {
12
- --dt-dur: 0.22s;
13
- --dt-ease: cubic-bezier(0.22, 0.61, 0.36, 1);
14
- --dt-fade: 0.45;
15
- --dt-indicator-dur: 0.3s;
16
- --dt-indicator-ease: cubic-bezier(0.4, 0, 0.2, 1);
17
- }
18
-
19
- /* ── Track: explicit row prevents h-full items from overflowing container ── */
20
- [data-slot="dt-root"] [data-slot="dt-track"] {
21
- grid-template-rows: minmax(0, 1fr);
22
- }
23
-
24
- /* ── Top-level option spans 2 grid cols ── */
25
- [data-slot="dt-root"] [data-slot="dt-track"] > label {
26
- grid-column: span 2;
27
- }
28
-
29
- /* ── Primary option text ── */
30
- [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) > label {
31
- color: var(--accent-foreground);
32
- z-index: 2;
33
- }
34
- [data-slot="dt-root"] [data-slot="dt-track"]:not(:has(> input:checked)) > label {
35
- color: var(--foreground);
36
- opacity: var(--dt-fade);
37
- }
38
-
39
- /* ── Group: container queries ── */
40
- [data-slot="dt-root"] [data-slot="dt-group"] {
41
- container-type: size;
42
- overflow: hidden;
43
- }
44
-
45
- /* ══════════════════════════════════════════════════════════
46
- * INDICATOR POSITIONING
47
- *
48
- * Modern: CSS Anchor Positioning — indicator follows active option
49
- * Fallback: translate-based positioning for older browsers
50
- * ══════════════════════════════════════════════════════════ */
51
-
52
- /* ── Anchor-based indicator (requires full anchor API) ── */
53
- @supports (anchor-scope: all) {
54
- /* Scope anchors per toggle instance */
55
- [data-slot="dt-root"]:not([data-indicator="translate"]) {
56
- anchor-scope: --dt-active;
57
- }
58
-
59
- /* Active option becomes the anchor via native :checked */
60
- [data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-track"] > label:has(+ input:checked) {
61
- anchor-name: --dt-active;
62
- }
63
- [data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-group"] > label:has(+ input:checked) {
64
- anchor-name: --dt-active;
65
- }
66
-
67
- /* Single unified indicator: morphs from full-width to half-width */
68
- [data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-indicator"] {
69
- position-anchor: --dt-active;
70
- top: anchor(top);
71
- right: anchor(right);
72
- bottom: anchor(bottom);
73
- left: anchor(left);
74
- translate: none;
75
- width: auto;
76
- transition:
77
- top var(--dt-indicator-dur) var(--dt-indicator-ease),
78
- right var(--dt-indicator-dur) var(--dt-indicator-ease),
79
- bottom var(--dt-indicator-dur) var(--dt-indicator-ease),
80
- left var(--dt-indicator-dur) var(--dt-indicator-ease);
81
- }
82
-
83
- /* Hide the group indicator — unified indicator handles everything */
84
- [data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-group-indicator"] {
85
- display: none;
86
- }
87
- }
88
-
89
- /* ── Inset-based fallback (older browsers) — same morph as anchor but hardcoded ── */
90
- @supports not (anchor-scope: all) {
91
- /* Unified indicator: left/right transition morphs width + position */
92
- [data-slot="dt-root"] [data-slot="dt-indicator"] {
93
- left: 50%;
94
- right: 0;
95
- width: auto;
96
- translate: none;
97
- transition:
98
- left var(--dt-indicator-dur) var(--dt-indicator-ease),
99
- right var(--dt-indicator-dur) var(--dt-indicator-ease);
100
- }
101
- /* Top-level checked: indicator covers left half */
102
- [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-indicator"] {
103
- left: 0;
104
- right: 50%;
105
- }
106
- /* Group option 1 checked: indicator at 3rd quarter */
107
- [data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(1):checked) ~ [data-slot="dt-indicator"],
108
- [data-slot="dt-root"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(1):checked) [data-slot="dt-indicator"] {
109
- left: 50%;
110
- right: 25%;
111
- }
112
- /* Group option 2 checked: indicator at 4th quarter */
113
- [data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(2):checked) ~ [data-slot="dt-indicator"],
114
- [data-slot="dt-root"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(2):checked) [data-slot="dt-indicator"] {
115
- left: 75%;
116
- right: 0;
117
- }
118
- /* Hide group indicator — unified indicator handles everything */
119
- [data-slot="dt-root"] [data-slot="dt-group-indicator"] {
120
- display: none;
121
- }
122
- }
123
-
124
- /* ── Force inset mode via data-indicator="translate" (works regardless of @supports) ── */
125
- [data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-indicator"] {
126
- left: 50%;
127
- right: 0;
128
- width: auto;
129
- translate: none;
130
- transition:
131
- left var(--dt-indicator-dur) var(--dt-indicator-ease),
132
- right var(--dt-indicator-dur) var(--dt-indicator-ease);
133
- }
134
- [data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-indicator"] {
135
- left: 0;
136
- right: 50%;
137
- }
138
- [data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(1):checked) [data-slot="dt-indicator"] {
139
- left: 50%;
140
- right: 25%;
141
- }
142
- [data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(2):checked) [data-slot="dt-indicator"] {
143
- left: 75%;
144
- right: 0;
145
- }
146
- [data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-group-indicator"] {
147
- display: none;
148
- }
149
-
150
- /* ══════════════════════════════════════════════════════════
151
- * GROUP COLLAPSED STATE
152
- *
153
- * ::before = title text (via data-label attr)
154
- * ::after = combined opts text (via data-opts attr)
155
- * <label>s = controlled by data-collapsed mode
156
- *
157
- * 3 modes: title | opts | title-opts (default)
158
- * ══════════════════════════════════════════════════════════ */
159
-
160
- /* ── ::before — group title ── */
161
- [data-slot="dt-group"]::before {
162
- content: attr(data-label);
163
- position: absolute;
164
- left: 50%;
165
- top: 50%;
166
- translate: -50% -80%;
167
- color: var(--foreground);
168
- font-size: inherit;
169
- font-weight: 500;
170
- z-index: 2;
171
- white-space: nowrap;
172
- pointer-events: none;
173
- transition:
174
- scale var(--dt-dur) var(--dt-ease),
175
- translate var(--dt-dur) var(--dt-ease),
176
- opacity var(--dt-dur) var(--dt-ease);
177
- }
178
-
179
- /* ── ::after — combined opts text ── */
180
- [data-slot="dt-group"]::after {
181
- content: attr(data-opts);
182
- position: absolute;
183
- left: 50%;
184
- top: 50%;
185
- translate: -50% 20%;
186
- color: var(--muted-foreground);
187
- font-size: 0.85em;
188
- opacity: 0.6;
189
- z-index: 2;
190
- white-space: nowrap;
191
- pointer-events: none;
192
- transition: opacity var(--dt-dur) var(--dt-ease);
193
- }
194
- [data-slot="dt-group"]:not([data-opts])::after {
195
- content: none;
196
- }
197
-
198
- /* ── Group labels — transition props ── */
199
- [data-slot="dt-root"] [data-slot="dt-group"] label {
200
- color: var(--muted-foreground);
201
- cursor: pointer;
202
- z-index: 2;
203
- transition:
204
- color var(--dt-dur) var(--dt-ease),
205
- opacity var(--dt-dur) var(--dt-ease),
206
- translate var(--dt-dur) var(--dt-ease);
207
- }
208
- [data-slot="dt-root"] [data-slot="dt-group"] label span {
209
- display: grid;
210
- place-items: center;
211
- height: 100%;
212
- width: 100%;
213
- border-radius: var(--dt-radius, 9999px);
214
- transition: scale var(--dt-dur) var(--dt-ease);
215
- }
216
-
217
- /* ── Collapsed mode: "title" — only ::before, labels slide+scale out ── */
218
- [data-slot="dt-group"][data-collapsed="title"]::before {
219
- translate: -50% -50%;
220
- }
221
- [data-slot="dt-group"][data-collapsed="title"]::after {
222
- display: none;
223
- }
224
- [data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label {
225
- opacity: 0;
226
- translate: 0 30%;
227
- }
228
- [data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label span {
229
- scale: 0.5;
230
- }
231
-
232
- /* ── Collapsed mode: "opts" — only ::after, labels slide+scale out ── */
233
- [data-slot="dt-group"][data-collapsed="opts"]::before {
234
- display: none;
235
- }
236
- [data-slot="dt-group"][data-collapsed="opts"]::after {
237
- translate: -50% -50%;
238
- font-size: inherit;
239
- opacity: 0.7;
240
- }
241
- [data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label {
242
- opacity: 0;
243
- translate: 0 30%;
244
- }
245
- [data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label span {
246
- scale: 0.5;
247
- }
248
-
249
- /* ── Collapsed mode: "title-opts" — WIP: disabled, falls back to "title" behavior ── */
250
- /* TODO: title-opts needs a redesign — title (::before) and scaled labels overlap
251
- at all container sizes. The codepen original morph relied on specific dimensions
252
- that don't translate to the component's size variants. Needs a different approach
253
- (e.g., crossfade, flex layout, or JS-measured positions). */
254
- [data-slot="dt-group"][data-collapsed="title-opts"]::after {
255
- content: none;
256
- }
257
- [data-slot="dt-group"][data-collapsed="title-opts"]::before {
258
- translate: -50% -50%;
259
- }
260
- [data-slot="dt-group"][data-collapsed="title-opts"]:not(:has(input:checked)) label {
261
- opacity: 0;
262
- translate: 0 30%;
263
- }
264
-
265
- /* ── When group expanded ── */
266
- [data-slot="dt-group"]:has(input:checked)::before {
267
- translate: -50% -250%;
268
- scale: 0.85;
269
- }
270
- [data-slot="dt-group"]:has(input:checked)::after {
271
- opacity: 0;
272
- }
273
- [data-slot="dt-group"]:has(input:checked) label {
274
- opacity: 0.75;
275
- color: var(--muted-foreground);
276
- translate: 0 0;
277
- }
278
- [data-slot="dt-group"]:has(input:checked) label span {
279
- scale: 1;
280
- }
281
- [data-slot="dt-group"]:has(input:nth-of-type(1):checked) label:nth-of-type(1),
282
- [data-slot="dt-group"]:has(input:nth-of-type(2):checked) label:nth-of-type(2) {
283
- color: var(--foreground);
284
- opacity: 1;
285
- }
286
-
287
- /* ══════════════════════════════════════════════════════════
288
- * GROUP LABEL / BUBBLE (above or below the pill)
289
- *
290
- * Positioned via CSS. In filter/path morph modes, rendered with GooeyCanvas.
291
- * In none mode, simple CSS-driven show/hide.
292
- * bubblePosition: top | bottom (no left/right in v2)
293
- * ══════════════════════════════════════════════════════════ */
294
-
295
- [data-slot="dt-group-label"] {
296
- display: grid;
297
- grid-template-rows: 0fr;
298
- left: 20%;
299
- right: 20%;
300
- transition:
301
- grid-template-rows calc(var(--dt-dur) * 1.5) var(--dt-ease),
302
- opacity var(--dt-dur) var(--dt-ease);
303
- opacity: 0;
304
- background: var(--card);
305
- border: 1px solid var(--border);
306
- z-index: 3;
307
- transform: translateZ(0);
308
- -webkit-transform: translateZ(0);
309
- }
310
- [data-slot="dt-group-label"] > span {
311
- overflow: hidden;
312
- min-height: 0;
313
- display: flex;
314
- align-items: center;
315
- justify-content: center;
316
- padding: 0 0.75em;
317
- height: calc(var(--dt-h, 38px) * 0.4);
318
- box-sizing: border-box;
319
- }
320
-
321
- /* Top position */
322
- [data-slot="dt-group-label"][data-bubble-position="top"] {
323
- bottom: 100%;
324
- border-radius: calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2) 0 0;
325
- border-bottom: none;
326
- margin-bottom: -1px;
327
- }
328
-
329
- /* Bottom position */
330
- [data-slot="dt-group-label"][data-bubble-position="bottom"] {
331
- top: 100%;
332
- border-radius: 0 0 calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2);
333
- border-top: none;
334
- margin-top: -1px;
335
- }
336
-
337
- /* When group active → group label grows (vertical: top/bottom) */
338
- [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="top"],
339
- [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="bottom"] {
340
- grid-template-rows: 1fr;
341
- opacity: 1;
342
- }
343
- [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="top"] > span,
344
- [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="bottom"] > span {
345
- padding: 0.35em 0.75em;
346
- }
347
-
348
- /* ── Filter morph mode ── */
349
- [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group-label"] {
350
- border: none;
351
- }
352
- [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-track"] {
353
- position: relative;
354
- z-index: 1;
355
- }
356
-
357
- /* ── Filter morph: ::before hides on expand, gooey canvas handles junction ── */
358
- [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group"]:has(input:checked)::before {
359
- opacity: 0;
360
- translate: -50% -80%;
361
- scale: 1;
362
- }
363
-
364
- /* ── Path morph mode ── */
365
- [data-slot="dt-root"][data-morph="path"] [data-slot="dt-track"] {
366
- position: relative;
367
- z-index: 1;
368
- }
369
-