@skylab-kulubu/skylcn-ui 0.1.3 → 0.1.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.
@@ -18,7 +18,7 @@ export type ButtonProps = ButtonPrimitive.Props & VariantProps<typeof buttonVari
18
18
  */
19
19
  hoverIcon?: LucideIcon;
20
20
  };
21
- export declare function Button({ className, variant, size, pending, disabled, children, render, nativeButton, hoverIcon: HoverIcon, ...props }: ButtonProps): import("react").JSX.Element;
21
+ export declare function Button({ className, variant, size, pending, disabled, children, render, nativeButton, focusableWhenDisabled, hoverIcon: HoverIcon, ...props }: ButtonProps): import("react").JSX.Element;
22
22
  export type IconButtonProps = Omit<ButtonProps, 'children'> & {
23
23
  icon: LucideIcon;
24
24
  /** Read by screen readers and shown as the native tooltip. */
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM/C,QAAA,MAAM,cAAc;;;8EAkCnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,GAC7C,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,UAAU,CAAC;CACxB,CAAC;AAEJ,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAe,EACf,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EAAE,SAAS,EACpB,GAAG,KAAK,EACT,EAAE,WAAW,+BA6Cb;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;IAC5D,IAAI,EAAE,UAAU,CAAC;IACjB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,EACzB,IAAI,EAAE,IAAI,EACV,KAAK,EACL,IAAa,EACb,OAAO,EACP,KAAK,EACL,GAAG,KAAK,EACT,EAAE,eAAe,+BAMjB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM/C,QAAA,MAAM,cAAc;;;8EAkCnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,GAC7C,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,UAAU,CAAC;CACxB,CAAC;AAQJ,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAe,EACf,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,qBAAqB,EACrB,SAAS,EAAE,SAAS,EACpB,GAAG,KAAK,EACT,EAAE,WAAW,+BAmFb;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;IAC5D,IAAI,EAAE,UAAU,CAAC;IACjB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,EACzB,IAAI,EAAE,IAAI,EACV,KAAK,EACL,IAAa,EACb,OAAO,EACP,KAAK,EACL,GAAG,KAAK,EACT,EAAE,eAAe,+BAMjB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Button as ButtonPrimitive } from '@base-ui/react/button';
4
4
  import { cva } from 'class-variance-authority';
5
- import { isValidElement } from 'react';
5
+ import { cloneElement, isValidElement } from 'react';
6
6
  import { cn } from '../lib/cn.js';
7
7
  import { usePendingIndicator } from '../lib/use-pending-indicator.js';
8
8
  import { SkylabLoader } from './skylab-loader.js';
@@ -34,14 +34,35 @@ const buttonVariants = cva([
34
34
  },
35
35
  defaultVariants: { variant: 'outline', size: 'md' },
36
36
  });
37
- export function Button({ className, variant, size, pending = false, disabled, children, render, nativeButton, hoverIcon: HoverIcon, ...props }) {
37
+ export function Button({ className, variant, size, pending = false, disabled, children, render, nativeButton, focusableWhenDisabled, hoverIcon: HoverIcon, ...props }) {
38
38
  const busy = usePendingIndicator(pending);
39
- // A button rendered as a link (render={<a href />}) keeps link semantics.
40
- const native = nativeButton ?? !(isValidElement(render) && render.type !== 'button');
41
- return (_jsxs(ButtonPrimitive, { "data-slot": "button",
39
+ const content = (_jsxs(_Fragment, { children: [_jsx("span", { "data-slot": "button-content", className: cn('inline-flex items-center justify-center gap-[inherit] transition-opacity duration-(--motion-duration-fast)', busy && 'opacity-0', HoverIcon && 'relative'), children: HoverIcon ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "inline-flex items-center gap-[inherit] transition-[translate,opacity] duration-(--motion-duration-base) ease-enter group-hover/button:translate-y-full group-hover/button:opacity-0 group-focus-visible/button:translate-y-full group-focus-visible/button:opacity-0 motion-reduce:translate-y-0!", children: children }), _jsx("span", { "aria-hidden": true, className: "absolute inset-0 grid -translate-y-full place-items-center opacity-0 transition-[translate,opacity] duration-(--motion-duration-base) ease-enter group-hover/button:translate-y-0 group-hover/button:opacity-100 group-focus-visible/button:translate-y-0 group-focus-visible/button:opacity-100 motion-reduce:translate-y-0!", children: _jsx(HoverIcon, {}) })] })) : (children) }), busy ? (_jsx(SkylabLoader, { size: 16, className: "absolute inset-0 m-auto enter-fade text-current" })) : null] }));
40
+ // Rendered as a link (render={<a href />} or a router Link) it stays a link: Base UI's
41
+ // Button would give it role="button", so the link itself takes the button's look.
42
+ if (nativeButton === undefined && isValidElement(render) && render.type !== 'button') {
43
+ const link = render;
44
+ const blocked = Boolean(disabled || pending);
45
+ const linkProps = props;
46
+ return cloneElement(link, {
47
+ ...linkProps,
48
+ 'data-slot': 'button',
49
+ className: cn(buttonVariants({ variant, size }), 'aria-disabled:pointer-events-none aria-disabled:opacity-60', HoverIcon && 'overflow-hidden', link.props.className, typeof className === 'string' ? className : undefined),
50
+ 'aria-disabled': blocked || undefined,
51
+ tabIndex: blocked ? -1 : linkProps.tabIndex,
52
+ onClick: (event) => {
53
+ if (blocked) {
54
+ event.preventDefault();
55
+ return;
56
+ }
57
+ link.props.onClick?.(event);
58
+ linkProps.onClick?.(event);
59
+ },
60
+ }, content);
61
+ }
62
+ return (_jsx(ButtonPrimitive, { "data-slot": "button",
42
63
  // Clipping at the button's own edge keeps the sliding icon whole; the
43
64
  // 16px content box would shave its strokes
44
- className: cn(buttonVariants({ variant, size }), HoverIcon && 'overflow-hidden', className), disabled: disabled || pending || busy, "aria-busy": busy || undefined, render: render, nativeButton: native, ...props, children: [_jsx("span", { "data-slot": "button-content", className: cn('inline-flex items-center justify-center gap-[inherit] transition-opacity duration-(--motion-duration-fast)', busy && 'opacity-0', HoverIcon && 'relative'), children: HoverIcon ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "inline-flex items-center gap-[inherit] transition-[translate,opacity] duration-(--motion-duration-base) ease-enter group-hover/button:translate-y-full group-hover/button:opacity-0 group-focus-visible/button:translate-y-full group-focus-visible/button:opacity-0 motion-reduce:translate-y-0!", children: children }), _jsx("span", { "aria-hidden": true, className: "absolute inset-0 grid -translate-y-full place-items-center opacity-0 transition-[translate,opacity] duration-(--motion-duration-base) ease-enter group-hover/button:translate-y-0 group-hover/button:opacity-100 group-focus-visible/button:translate-y-0 group-focus-visible/button:opacity-100 motion-reduce:translate-y-0!", children: _jsx(HoverIcon, {}) })] })) : (children) }), busy ? (_jsx(SkylabLoader, { size: 16, className: "absolute inset-0 m-auto enter-fade text-current" })) : null] }));
65
+ className: cn(buttonVariants({ variant, size }), HoverIcon && 'overflow-hidden', className), disabled: disabled || pending || busy, "aria-busy": busy || undefined, render: render, nativeButton: nativeButton ?? true, focusableWhenDisabled: focusableWhenDisabled, ...props, children: content }));
45
66
  }
46
67
  /** A square button holding one icon; the admin toolbars' action button. */
47
68
  export function IconButton({ icon: Icon, label, size = 'icon', pending, title, ...props }) {
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skylab-loader.d.ts","sourceRoot":"","sources":["../../src/components/skylab-loader.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,EAAE,IAAS,EAAE,KAAiB,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BA+B1F"}
1
+ {"version":3,"file":"skylab-loader.d.ts","sourceRoot":"","sources":["../../src/components/skylab-loader.tsx"],"names":[],"mappings":"AAYA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,EAAE,IAAS,EAAE,KAAiB,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAgE1F"}
@@ -1,12 +1,22 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { SKYLAB_MARK_PATHS, SKYLAB_MARK_RADII, SKYLAB_MARK_VIEWBOX, } from '../assets/skylab-mark.js';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from 'react';
3
+ import { SKYLAB_MARK_PATHS, SKYLAB_MARK_VIEWBOX } from '../assets/skylab-mark.js';
3
4
  import { cn } from '../lib/cn.js';
4
- const RADIATE_SPREAD_MS = 700;
5
+ // Fatih Naz's loader from forms-frontend lights the mark in seven groups from the centre out.
6
+ // Each path's group, in SKYLAB_MARK_PATHS order.
7
+ const GROUPS = [4, 2, 0, 3, 4, 2, 5, 6, 3, 1, 4, 2, 3, 4, 2, 5, 6, 3, 1];
8
+ const STAGGER_MS = 80;
9
+ // Below these sizes the shimmer, halo and steel outline only muddy the mark.
10
+ const RICH_FROM = 32;
11
+ const METAL_FROM = 64;
5
12
  /** The SKY LAB mark lighting up from its centre; the one loading indicator of every product. */
6
13
  export function SkylabLoader({ size = 80, state = 'loading', className }) {
14
+ // useId's characters do not all survive inside url(#…)
15
+ const steelId = `skylcn-steel-${useId().replace(/[^\w-]/g, '')}`;
7
16
  const animate = state === 'loading';
8
- return (_jsx("svg", { "data-slot": "skylab-loader", viewBox: SKYLAB_MARK_VIEWBOX, width: size, height: size, fill: "currentColor", "aria-hidden": true, className: cn('shrink-0 text-secondary-foreground', animate && 'skylcn-mark-radiate', className), children: _jsx("g", { fillRule: "evenodd", children: SKYLAB_MARK_PATHS.map((d, i) => (_jsx("path", { d: d, style: animate
9
- ? { animationDelay: `${Math.round(SKYLAB_MARK_RADII[i] * RADIATE_SPREAD_MS)}ms` }
10
- : undefined }, i))) }) }));
17
+ const rich = animate && size >= RICH_FROM;
18
+ const metal = animate && size >= METAL_FROM;
19
+ const paths = SKYLAB_MARK_PATHS.map((d, i) => (_jsx("path", { d: d, style: animate ? { animationDelay: `${GROUPS[i] * STAGGER_MS}ms` } : undefined }, i)));
20
+ return (_jsxs("span", { "data-slot": "skylab-loader", "aria-hidden": true, className: cn('relative inline-block shrink-0 text-secondary-foreground', animate && 'skylcn-loader', rich && 'skylcn-loader-rich', className), style: { width: size, height: size }, children: [rich ? _jsx("span", { className: "skylcn-loader-halo absolute inset-0 rounded-full" }) : null, _jsx("svg", { viewBox: SKYLAB_MARK_VIEWBOX, fill: "currentColor", className: "skylcn-loader-mark relative block size-full", children: _jsx("g", { fillRule: "evenodd", children: paths }) }), metal ? (_jsxs("svg", { viewBox: SKYLAB_MARK_VIEWBOX, fill: "none", className: "skylcn-loader-metal absolute inset-0 block size-full", children: [_jsx("defs", { children: _jsxs("linearGradient", { id: steelId, x1: "0", y1: "0", x2: "586", y2: "554", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { offset: "0", stopColor: "var(--skylcn-steel-hi)" }), _jsx("stop", { offset: "0.22", stopColor: "var(--skylcn-steel-lo)" }), _jsx("stop", { offset: "0.45", stopColor: "var(--skylcn-steel-hi)" }), _jsx("stop", { offset: "0.6", stopColor: "var(--skylcn-steel-lo)" }), _jsx("stop", { offset: "0.82", stopColor: "var(--skylcn-steel-hi)" }), _jsx("stop", { offset: "1", stopColor: "var(--skylcn-steel-lo)" })] }) }), _jsx("g", { stroke: `url(#${steelId})`, strokeWidth: size >= 120 ? 5 : 7, strokeLinejoin: "round", children: paths })] })) : null] }));
11
21
  }
12
22
  //# sourceMappingURL=skylab-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skylab-loader.js","sourceRoot":"","sources":["../../src/components/skylab-loader.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAU9B,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,SAAS,EAAE,SAAS,EAAqB;IACzF,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC;IACpC,OAAO,CACL,2BACY,eAAe,EACzB,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,IAAI,EAAC,cAAc,uBAEnB,SAAS,EAAE,EAAE,CACX,oCAAoC,EACpC,OAAO,IAAI,qBAAqB,EAChC,SAAS,CACV,YAED,YAAG,QAAQ,EAAC,SAAS,YAClB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,eAEE,CAAC,EAAE,CAAC,EACJ,KAAK,EACH,OAAO;oBACL,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE;oBAClF,CAAC,CAAC,SAAS,IALV,CAAC,CAON,CACH,CAAC,GACA,GACA,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"skylab-loader.js","sourceRoot":"","sources":["../../src/components/skylab-loader.tsx"],"names":[],"mappings":"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"}
@@ -260,31 +260,129 @@
260
260
  }
261
261
  }
262
262
 
263
- /* The crisp SKY LAB mark lighting up from its centre; SkylabLoader sets each path's delay */
263
+ /*
264
+ * SkylabLoader: the mark lights up group by group from its centre (each path's delay comes
265
+ * from the component), never fading below a floor, with a shimmer band and a soft halo from
266
+ * 32px and a diagonal glint along a steel outline from 64px. Still under reduced motion.
267
+ */
264
268
  @layer components {
265
- .skylcn-mark-radiate path {
266
- opacity: 0.22;
267
- animation: skylcn-mark-radiate 1.6s var(--motion-ease-enter) infinite;
269
+ .skylcn-loader {
270
+ --skylcn-loader-cycle: 2.4s;
271
+ --skylcn-loader-floor: 0.2;
272
+ --skylcn-steel-hi: color-mix(in srgb, currentColor 30%, white);
273
+ --skylcn-steel-lo: color-mix(in srgb, currentColor 55%, black);
274
+ }
275
+ :where([data-theme='light']) .skylcn-loader {
276
+ --skylcn-loader-floor: 0.3;
277
+ --skylcn-steel-hi: color-mix(in srgb, currentColor 35%, white);
278
+ --skylcn-steel-lo: color-mix(in srgb, currentColor 80%, black);
279
+ }
280
+ .skylcn-loader .skylcn-loader-mark path,
281
+ .skylcn-loader .skylcn-loader-metal path {
282
+ animation: skylcn-loader-reveal var(--skylcn-loader-cycle) ease-in-out infinite both;
283
+ }
284
+ .skylcn-loader-rich .skylcn-loader-mark {
285
+ /* a 200-unit bright band crossing the 586-unit mark; the mask is four times as wide */
286
+ mask-image: linear-gradient(
287
+ 90deg,
288
+ rgb(0 0 0 / 0.55) 0%,
289
+ rgb(0 0 0 / 0.55) 45.74%,
290
+ #000 50%,
291
+ rgb(0 0 0 / 0.55) 54.26%,
292
+ rgb(0 0 0 / 0.55) 100%
293
+ );
294
+ mask-size: 400% 100%;
295
+ mask-repeat: no-repeat;
296
+ animation: skylcn-loader-shimmer var(--skylcn-loader-cycle) ease-in-out infinite;
297
+ }
298
+ .skylcn-loader-metal {
299
+ mask-image: linear-gradient(
300
+ 115deg,
301
+ transparent 0%,
302
+ transparent 44%,
303
+ #000 49%,
304
+ #000 51%,
305
+ transparent 56%,
306
+ transparent 100%
307
+ );
308
+ mask-size: 400% 400%;
309
+ mask-repeat: no-repeat;
310
+ animation: skylcn-loader-glint var(--skylcn-loader-cycle) ease-in-out infinite;
311
+ }
312
+ .skylcn-loader-halo {
313
+ background: radial-gradient(
314
+ circle,
315
+ color-mix(in srgb, currentColor 14%, transparent) 0%,
316
+ transparent 70%
317
+ );
318
+ filter: blur(8px);
319
+ animation: skylcn-loader-halo var(--skylcn-loader-cycle) ease-in-out infinite;
268
320
  }
269
321
 
270
322
  @media (prefers-reduced-motion: reduce) {
271
- .skylcn-mark-radiate path {
323
+ .skylcn-loader .skylcn-loader-mark,
324
+ .skylcn-loader .skylcn-loader-mark path {
272
325
  animation: none;
273
- opacity: 1;
326
+ mask-image: none;
327
+ }
328
+ .skylcn-loader .skylcn-loader-metal,
329
+ .skylcn-loader .skylcn-loader-halo {
330
+ display: none;
274
331
  }
275
332
  }
276
- [data-motion='reduced'] .skylcn-mark-radiate path {
333
+ [data-motion='reduced'] .skylcn-loader .skylcn-loader-mark,
334
+ [data-motion='reduced'] .skylcn-loader .skylcn-loader-mark path {
277
335
  animation: none;
336
+ mask-image: none;
337
+ }
338
+ [data-motion='reduced'] .skylcn-loader .skylcn-loader-metal,
339
+ [data-motion='reduced'] .skylcn-loader .skylcn-loader-halo {
340
+ display: none;
341
+ }
342
+ }
343
+
344
+ @keyframes skylcn-loader-reveal {
345
+ 0%,
346
+ 100% {
347
+ opacity: var(--skylcn-loader-floor);
348
+ }
349
+ 37.5%,
350
+ 70.8% {
278
351
  opacity: 1;
279
352
  }
280
353
  }
281
354
 
282
- @keyframes skylcn-mark-radiate {
355
+ /* the band's centre runs from the mark's left edge to past its right one */
356
+ @keyframes skylcn-loader-shimmer {
357
+ from {
358
+ mask-position: 66.67% 0;
359
+ }
360
+ to {
361
+ mask-position: 21.17% 0;
362
+ }
363
+ }
364
+
365
+ @keyframes skylcn-loader-glint {
366
+ 0%,
367
+ 15% {
368
+ mask-position: 70% 70%;
369
+ }
370
+ 65%,
371
+ 100% {
372
+ mask-position: 25% 25%;
373
+ }
374
+ }
375
+
376
+ @keyframes skylcn-loader-halo {
283
377
  0%,
284
378
  100% {
285
- opacity: 0.22;
379
+ opacity: 0;
380
+ }
381
+ 30%,
382
+ 75% {
383
+ opacity: 0.6;
286
384
  }
287
- 35% {
385
+ 50% {
288
386
  opacity: 1;
289
387
  }
290
388
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skylab-kulubu/skylcn-ui",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "SKY LAB web ürünlerinin ortak tasarım sistemi: token'lar, tema ve bileşenler.",
5
5
  "license": "MIT",
6
6
  "author": "SKY LAB Kulübü",