@teseor/css 1.13.0 → 1.14.0
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/dist/compiled.css +1 -1
- package/dist/index.css +6 -3
- package/package.json +1 -1
- package/src/components/feedback/progress/index.scss +15 -1
- package/src/components/feedback/progress/progress-visual.png +0 -0
- package/src/components/feedback/progress/progress.docs.json +58 -0
- package/src/components/feedback/progress-circle/index.scss +11 -1
- package/src/components/overlays/tooltip/index.scss +25 -0
- package/src/components/overlays/tooltip/tooltip-visual.png +0 -0
- package/src/components/overlays/tooltip/tooltip.api.json +3 -0
- package/src/components/overlays/tooltip/tooltip.docs.json +30 -0
- package/src/utilities/index.scss +1 -0
- package/src/utilities/scroll-animation/index.scss +136 -0
- package/src/utilities/scroll-animation/scroll-animation.api.json +17 -0
- package/src/utilities/scroll-animation/scroll-animation.docs.json +100 -0
package/dist/index.css
CHANGED
|
@@ -69,10 +69,12 @@
|
|
|
69
69
|
@layer components.styles{.ui-disclosure{box-sizing:border-box;border-radius:var(--ui-_radius);outline:var(--ui-_border-width) solid var(--ui-_border-color);outline-offset:calc(var(--ui-_border-width)*-1)}.ui-disclosure:not([open]){block-size:var(--ui-_trigger-height)}.ui-disclosure__trigger{display:flex;align-items:center;justify-content:space-between;gap:calc(0.5rem*2);block-size:var(--ui-_trigger-height);inline-size:100%;padding-inline:var(--ui-_padding-x);font-weight:var(--ui-_weight-medium);line-height:1;text-align:start;cursor:pointer;list-style:none}.ui-disclosure__trigger::-webkit-details-marker{display:none}.ui-disclosure__trigger::marker{display:none}.ui-disclosure__trigger:hover{background:var(--ui-_color-bg-subtle)}.ui-disclosure__icon{flex-shrink:0;transition:transform var(--ui-_duration-fast) var(--ui-_ease-default)}.ui-disclosure[open] .ui-disclosure__icon{transform:rotate(180deg)}.ui-disclosure__content{padding:0 var(--ui-_padding-x) var(--ui-_padding-y)}.ui-disclosure--animate .ui-disclosure__content{animation:disclosure-open var(--ui-_duration-normal) var(--ui-_ease-default)}@keyframes disclosure-open{from{opacity:0;transform:translateY(calc(0.5rem * -1))}to{opacity:1;transform:translateY(0)}}.ui-disclosure--borderless{border:none;border-radius:0}.ui-disclosure--flush .ui-disclosure__trigger{padding-inline:0}.ui-disclosure--flush .ui-disclosure__content{padding-inline:0}@media(prefers-reduced-motion: reduce){.ui-disclosure--animate .ui-disclosure__content{animation:none}.ui-disclosure__icon{transition:none}}}
|
|
70
70
|
@layer components.tokens{.ui-alert{--ui-_weight-medium: var(--ui-weight-medium, 500);--ui-_row-1: var(--ui-row-1, 1rem);--ui-_font-size-sm: var(--ui-font-size-sm, 0.875rem);--ui-_color-text-muted: var(--ui-color-text-muted, hsl(220, 10%, 45%));--ui-_color-text: var(--ui-color-text, hsl(220, 10%, 10%));--ui-_accent: var(--ui-alert-accent, var(--ui-color-border, hsl(220, 10%, 90%)));--ui-_padding: var(--ui-alert-padding, var(--ui-space-2, 1rem));--ui-_border-width: var(--ui-alert-border-width, var(--ui-border-width-sm, 0.0625rem));--ui-_gap: var(--ui-alert-gap, var(--ui-space-1, 0.5rem));--ui-_radius: var(--ui-alert-radius, var(--ui-radius-md, 0.5rem));--ui-_bg: color-mix(in oklch, var(--ui-_accent) 8%, white);--ui-_border-color: var(--ui-_accent);--ui-_color: var(--ui-alert-color, var(--ui-color-text, hsl(220, 10%, 10%)));--ui-_font-size: var(--ui-alert-font-size, inherit);--ui-_padding-end: 0;--ui-_icon-color: var(--ui-_accent)}.ui-alert--info{--ui-_accent: var(--ui-color-primary, oklch(55% 0.22 250deg))}.ui-alert--success{--ui-_accent: var(--ui-color-success, oklch(60% 0.18 145deg))}.ui-alert--warning{--ui-_accent: var(--ui-color-warning, oklch(75% 0.18 70deg))}.ui-alert--danger{--ui-_accent: var(--ui-color-danger, oklch(60% 0.22 25deg))}.ui-alert--sm{--ui-_padding: var(--ui-alert-padding-sm, var(--ui-space-1, 0.5rem));--ui-_gap: var(--ui-alert-gap-sm, calc(0.5rem * 0.5));--ui-_font-size: var(--ui-alert-font-size-sm, var(--ui-font-size-sm, 0.875rem))}.ui-alert--lg{--ui-_padding: var(--ui-alert-padding-lg, var(--ui-space-4, 2rem));--ui-_gap: var(--ui-alert-gap-lg, var(--ui-space-2, 1rem));--ui-_font-size: var(--ui-alert-font-size-lg, var(--ui-font-size-lg, 1.25rem))}.ui-alert--dismissible{--ui-_padding-end: var(--ui-alert-padding-end, calc(0.5rem * 5))}}
|
|
71
71
|
@layer components.styles{.ui-alert{display:flex;align-items:flex-start;gap:var(--ui-_gap);padding:calc(var(--ui-_padding) - var(--ui-_border-width));padding-inline:var(--ui-_padding);padding-inline-end:calc(var(--ui-_padding) + var(--ui-_padding-end));font-size:var(--ui-_font-size);color:var(--ui-_color);background:var(--ui-_bg);border:var(--ui-_border-width) solid var(--ui-_border-color);border-radius:var(--ui-_radius);border-inline-start-width:calc(0.5rem*.5)}.ui-alert__icon{flex-shrink:0;color:var(--ui-_icon-color)}.ui-alert__content{flex:1;min-inline-size:0}.ui-alert__title{margin:0;font-weight:var(--ui-_weight-medium);line-height:var(--ui-_row-1)}.ui-alert__description{margin:0;margin-block-start:calc(0.5rem*1);font-size:var(--ui-_font-size-sm);line-height:var(--ui-_row-1);color:var(--ui-_color-text-muted)}.ui-alert__close{flex-shrink:0;align-self:flex-start;padding:0;color:var(--ui-_color-text-muted);background:none;border:none;cursor:pointer}.ui-alert__close:hover{color:var(--ui-_color-text)}}
|
|
72
|
+
@property --ui-progress-value{syntax:"<percentage>";inherits:false;initial-value:0%}
|
|
72
73
|
@layer components.tokens{.ui-progress{--ui-_duration-normal: var(--ui-duration-normal, 200ms);--ui-_ease-default: var(--ui-ease-default, cubic-bezier(0.4, 0, 0.2, 1));--ui-_height: var(--ui-progress-height, calc(0.5rem * 1));--ui-_bg: var(--ui-progress-bg, var(--ui-color-bg-subtle, rgba(0, 0, 0, 0.1)));--ui-_fill: var(--ui-progress-fill, var(--ui-color-primary, oklch(55% 0.22 250deg)));--ui-_radius: var(--ui-progress-radius, var(--ui-radius-full, 9999px))}.ui-progress--sm{--ui-_height: calc(0.5rem * 1)}.ui-progress--lg{--ui-_height: calc(0.5rem * 2)}}
|
|
73
|
-
@layer components.styles{.ui-progress{position:relative;block-size:var(--ui-_height);overflow:hidden;background:var(--ui-_bg);border-radius:var(--ui-_radius)}.ui-progress__bar{block-size:100%;background:var(--ui-_fill);border-radius:var(--ui-_radius);transition:inline-size var(--ui-_duration-normal) var(--ui-_ease-default)}.ui-progress--indeterminate .ui-progress__bar{inline-size:30%;animation:progress-indeterminate 1.5s infinite ease-in-out}@keyframes progress-indeterminate{0%{transform:translateX(-100%)}100%{transform:translateX(400%)}}.ui-progress--striped .ui-progress__bar{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:0.5rem 0.5rem}.ui-progress--animated .ui-progress__bar{animation:progress-stripes 1s linear infinite}@keyframes progress-stripes{from{background-position:0.5rem 0}to{background-position:0 0}}@media(prefers-reduced-motion: reduce){.ui-progress--indeterminate .ui-progress__bar{animation:none}.ui-progress--animated .ui-progress__bar{animation:none}}.ui-progress--success{--ui-_fill: var(--ui-color-success, oklch(60% 0.18 145deg))}.ui-progress--warning{--ui-_fill: var(--ui-color-warning, oklch(75% 0.18 70deg))}.ui-progress--danger{--ui-_fill: var(--ui-color-danger, oklch(60% 0.22 25deg))}}
|
|
74
|
+
@layer components.styles{.ui-progress{position:relative;block-size:var(--ui-_height);overflow:hidden;background:var(--ui-_bg);border-radius:var(--ui-_radius)}.ui-progress__bar{block-size:100%;inline-size:var(--ui-progress-value, auto);background:var(--ui-_fill);border-radius:var(--ui-_radius);transition:inline-size var(--ui-_duration-normal) var(--ui-_ease-default),--ui-progress-value var(--ui-_duration-normal) var(--ui-_ease-default)}.ui-progress--indeterminate .ui-progress__bar{inline-size:30%;animation:progress-indeterminate 1.5s infinite ease-in-out}@keyframes progress-indeterminate{0%{transform:translateX(-100%)}100%{transform:translateX(400%)}}.ui-progress--striped .ui-progress__bar{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:0.5rem 0.5rem}.ui-progress--animated .ui-progress__bar{animation:progress-stripes 1s linear infinite}@keyframes progress-stripes{from{background-position:0.5rem 0}to{background-position:0 0}}@media(prefers-reduced-motion: reduce){.ui-progress--indeterminate .ui-progress__bar{animation:none}.ui-progress--animated .ui-progress__bar{animation:none}}.ui-progress--success{--ui-_fill: var(--ui-color-success, oklch(60% 0.18 145deg))}.ui-progress--warning{--ui-_fill: var(--ui-color-warning, oklch(75% 0.18 70deg))}.ui-progress--danger{--ui-_fill: var(--ui-color-danger, oklch(60% 0.22 25deg))}}
|
|
75
|
+
@property --ui-progress-circle-value{syntax:"<number>";inherits:false;initial-value:0}
|
|
74
76
|
@layer components.tokens{.ui-progress-circle{--ui-_duration-slow: var(--ui-duration-slow, 250ms);--ui-_ease-default: var(--ui-ease-default, cubic-bezier(0.4, 0, 0.2, 1));--ui-_size: var(--ui-progress-circle-size, calc(var(--ui-unit, 0.5rem) * 6));--ui-_stroke-width: var(--ui-progress-circle-stroke-width, 8);--ui-_fill-color: var(--ui-progress-circle-fill-color, var(--ui-color-primary, oklch(55% 0.22 250deg)));--ui-_track-color: var(--ui-progress-circle-track-color, var(--ui-color-border, hsl(220, 10%, 90%)));--ui-_value: var(--ui-progress-circle-value, 0);--ui-_circumference: 282.743}.ui-progress-circle--sm{--ui-_size: var(--ui-progress-circle-size-sm, calc(var(--ui-unit, 0.5rem) * 4))}.ui-progress-circle--lg{--ui-_size: var(--ui-progress-circle-size-lg, calc(var(--ui-unit, 0.5rem) * 8))}.ui-progress-circle--xl{--ui-_size: var(--ui-progress-circle-size-xl, calc(var(--ui-unit, 0.5rem) * 12))}.ui-progress-circle--success{--ui-_fill-color: var(--ui-color-success, oklch(60% 0.18 145deg))}.ui-progress-circle--warning{--ui-_fill-color: var(--ui-color-warning, oklch(75% 0.18 70deg))}.ui-progress-circle--danger{--ui-_fill-color: var(--ui-color-danger, oklch(60% 0.22 25deg))}}
|
|
75
|
-
@layer components.styles{.ui-progress-circle{display:inline-block;flex-shrink:0;block-size:var(--ui-_size);inline-size:var(--ui-_size);vertical-align:middle;transform:rotate(-90deg)}.ui-progress-circle__track{fill:none;stroke:var(--ui-_track-color);stroke-width:var(--ui-_stroke-width)}.ui-progress-circle__fill{fill:none;stroke:var(--ui-_fill-color);stroke-width:var(--ui-_stroke-width);stroke-linecap:round;stroke-dasharray:var(--ui-_circumference);stroke-dashoffset:calc(var(--ui-_circumference)*(1 - var(--ui-_value)/100));transition:stroke-dashoffset var(--ui-_duration-slow) var(--ui-_ease-default)}.ui-progress-circle--indeterminate{animation:progress-circle-rotate 1.4s linear infinite}.ui-progress-circle--indeterminate .ui-progress-circle__fill{stroke-dashoffset:calc(var(--ui-_circumference)*.25);transition:none}@keyframes progress-circle-rotate{from{transform:rotate(-90deg)}to{transform:rotate(270deg)}}@media(prefers-reduced-motion: reduce){.ui-progress-circle--indeterminate{animation:none}}}
|
|
77
|
+
@layer components.styles{.ui-progress-circle{display:inline-block;flex-shrink:0;block-size:var(--ui-_size);inline-size:var(--ui-_size);vertical-align:middle;transform:rotate(-90deg)}.ui-progress-circle__track{fill:none;stroke:var(--ui-_track-color);stroke-width:var(--ui-_stroke-width)}.ui-progress-circle__fill{fill:none;stroke:var(--ui-_fill-color);stroke-width:var(--ui-_stroke-width);stroke-linecap:round;stroke-dasharray:var(--ui-_circumference);stroke-dashoffset:calc(var(--ui-_circumference)*(1 - var(--ui-_value)/100));transition:stroke-dashoffset var(--ui-_duration-slow) var(--ui-_ease-default),--ui-progress-circle-value var(--ui-_duration-slow) var(--ui-_ease-default)}.ui-progress-circle--indeterminate{animation:progress-circle-rotate 1.4s linear infinite}.ui-progress-circle--indeterminate .ui-progress-circle__fill{stroke-dashoffset:calc(var(--ui-_circumference)*.25);transition:none}@keyframes progress-circle-rotate{from{transform:rotate(-90deg)}to{transform:rotate(270deg)}}@media(prefers-reduced-motion: reduce){.ui-progress-circle--indeterminate{animation:none}}}
|
|
76
78
|
@layer components.tokens{.ui-skeleton{--ui-_bg: var(--ui-skeleton-bg, var(--ui-color-bg-subtle, rgba(0, 0, 0, 0.1)));--ui-_shimmer: var(--ui-skeleton-shimmer, rgba(255, 255, 255, 0.5));--ui-_radius: var(--ui-skeleton-radius, var(--ui-radius-sm, calc(0.5rem / 2)))}}
|
|
77
79
|
@layer components.styles{.ui-skeleton{display:block;position:relative;overflow:hidden;background:var(--ui-_bg);border-radius:var(--ui-_radius)}.ui-skeleton::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg, transparent 0%, var(--ui-_shimmer) 50%, transparent 100%);animation:skeleton-shimmer 1.5s infinite;transform:translateX(-100%)}@keyframes skeleton-shimmer{100%{transform:translateX(100%)}}.ui-skeleton--text{block-size:calc(0.5rem*2);inline-size:100%}.ui-skeleton--heading{block-size:calc(0.5rem*3);inline-size:60%}.ui-skeleton--circle{block-size:calc(0.5rem*5);inline-size:calc(0.5rem*5);border-radius:50%}.ui-skeleton--rect{block-size:calc(0.5rem*20);inline-size:100%}.ui-skeleton--static::after{animation:none}.ui-skeleton--pulse{animation:skeleton-pulse 1.5s infinite ease-in-out}.ui-skeleton--pulse::after{display:none}@keyframes skeleton-pulse{0%,100%{opacity:1}50%{opacity:.5}}@media(prefers-reduced-motion: reduce){.ui-skeleton::after{animation:none}.ui-skeleton--pulse{animation:none}}}
|
|
78
80
|
@layer components.tokens{.ui-spinner{--ui-_size: var(--ui-spinner-size, calc(var(--ui-unit, 0.5rem) * 4));--ui-_border-width: var(--ui-spinner-border-width, var(--ui-border-width-md, 0.125rem));--ui-_color: var(--ui-spinner-color, currentcolor);--ui-_track-color: var(--ui-spinner-track-color, transparent);--ui-_duration: var(--ui-spinner-duration, 750ms)}.ui-spinner--xs{--ui-_size: var(--ui-spinner-size-xs, calc(var(--ui-unit, 0.5rem) * 2));--ui-_border-width: var(--ui-spinner-border-width-xs, var(--ui-border-width-sm, 0.0625rem))}.ui-spinner--sm{--ui-_size: var(--ui-spinner-size-sm, calc(var(--ui-unit, 0.5rem) * 3));--ui-_border-width: var(--ui-spinner-border-width-sm, var(--ui-border-width-md, 0.125rem))}.ui-spinner--lg{--ui-_size: var(--ui-spinner-size-lg, calc(var(--ui-unit, 0.5rem) * 5));--ui-_border-width: var(--ui-spinner-border-width-lg, var(--ui-border-width-md, 0.125rem))}.ui-spinner--xl{--ui-_size: var(--ui-spinner-size-xl, calc(var(--ui-unit, 0.5rem) * 6));--ui-_border-width: var(--ui-spinner-border-width-xl, var(--ui-border-width-lg, 0.25rem))}}
|
|
@@ -138,7 +140,7 @@
|
|
|
138
140
|
@layer components.tokens{.ui-popover{--ui-_row-1: var(--ui-row-1, 1rem);--ui-_border-width-sm: var(--ui-border-width-sm, 0.0625rem);--ui-_font-size-md: var(--ui-font-size-md, 1rem);--ui-_weight-semibold: var(--ui-weight-semibold, 600);--ui-_duration-fast: var(--ui-duration-fast, 100ms);--ui-_ease-default: var(--ui-ease-default, ease);--ui-_bg: var(--ui-popover-bg, var(--ui-color-bg, white));--ui-_border-color: var(--ui-popover-border-color, var(--ui-color-border, hsl(220, 10%, 90%)));--ui-_radius: var(--ui-popover-radius, var(--ui-radius-md, calc(0.5rem * 1)));--ui-_shadow: var(--ui-popover-shadow, 0 calc(0.5rem / 2) calc(0.5rem * 2) rgb(0 0 0 / 0.15));--ui-_padding: var(--ui-popover-padding, calc(0.5rem * 2));--ui-_max-width: var(--ui-popover-max-width, calc(0.5rem * 40));--ui-_z: var(--ui-popover-z, var(--ui-z-popover, 500));--ui-_arrow-size: var(--ui-popover-arrow-size, calc(0.5rem))}}
|
|
139
141
|
@layer components.styles{.ui-popover{position:absolute;z-index:var(--ui-_z);max-inline-size:var(--ui-_max-width);padding:var(--ui-_padding);line-height:var(--ui-_row-1);background:var(--ui-_bg);border-radius:var(--ui-_radius);outline:var(--ui-_border-width-sm) solid var(--ui-_border-color);box-shadow:var(--ui-_shadow);outline-offset:calc(var(--ui-_border-width-sm)*-1)}.ui-popover__header{padding-block-end:calc(0.5rem*2);margin-block-end:calc(0.5rem*2);box-shadow:inset 0 calc(var(--ui-_border-width-sm)*-1) 0 var(--ui-_border-color)}.ui-popover__title{margin:0;font-size:var(--ui-_font-size-md);font-weight:var(--ui-_weight-semibold)}.ui-popover--top::after{content:"";position:absolute;inset-block-start:100%;inset-inline-start:50%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-block-start-color:var(--ui-_bg);transform:translateX(-50%)}.ui-popover--top::before{content:"";position:absolute;inset-block-start:100%;inset-inline-start:50%;border:calc(var(--ui-_arrow-size) + 1px) solid rgba(0,0,0,0);border-block-start-color:var(--ui-_border-color);transform:translateX(-50%)}.ui-popover--bottom::after{content:"";position:absolute;inset-block-end:100%;inset-inline-start:50%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-block-end-color:var(--ui-_bg);transform:translateX(-50%)}.ui-popover--bottom::before{content:"";position:absolute;inset-block-end:100%;inset-inline-start:50%;border:calc(var(--ui-_arrow-size) + 1px) solid rgba(0,0,0,0);border-block-end-color:var(--ui-_border-color);transform:translateX(-50%)}.ui-popover--visible{opacity:1}.ui-popover--hidden{opacity:0;pointer-events:none}.ui-popover--animate{transition:opacity var(--ui-_duration-fast) var(--ui-_ease-default)}}
|
|
140
142
|
@layer components.tokens{.ui-tooltip{--ui-_duration-fast: var(--ui-duration-fast, 100ms);--ui-_ease-default: var(--ui-ease-default, ease);--ui-_bg: var(--ui-tooltip-bg, var(--ui-color-text, hsl(220, 10%, 10%)));--ui-_color: var(--ui-tooltip-color, var(--ui-color-bg, hsl(220, 10%, 98%)));--ui-_radius: var(--ui-tooltip-radius, var(--ui-radius-sm, calc(0.5rem / 2)));--ui-_padding-x: var(--ui-tooltip-padding-x, calc(0.5rem * 1));--ui-_padding-y: var(--ui-tooltip-padding-y, calc(0.5rem / 2));--ui-_font-size: var(--ui-tooltip-font-size, var(--ui-font-size-sm, 0.875rem));--ui-_z: var(--ui-tooltip-z, var(--ui-z-tooltip, 600));--ui-_arrow-size: var(--ui-tooltip-arrow-size, calc(0.5rem / 2))}}
|
|
141
|
-
@layer components.styles{.ui-tooltip{position:absolute;z-index:var(--ui-_z);max-inline-size:calc(0.5rem*25);padding:var(--ui-_padding-y) var(--ui-_padding-x);font-size:var(--ui-_font-size);line-height:calc(0.5rem*2);text-align:center;white-space:nowrap;color:var(--ui-_color);background:var(--ui-_bg);border-radius:var(--ui-_radius)}.ui-tooltip--top::after{content:"";position:absolute;inset-block-start:100%;inset-inline-start:50%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-block-start-color:var(--ui-_bg);transform:translateX(-50%)}.ui-tooltip--bottom::after{content:"";position:absolute;inset-block-end:100%;inset-inline-start:50%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-block-end-color:var(--ui-_bg);transform:translateX(-50%)}.ui-tooltip--start::after{content:"";position:absolute;inset-block-start:50%;inset-inline-start:100%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-inline-start-color:var(--ui-_bg);transform:translateY(-50%)}.ui-tooltip--end::after{content:"";position:absolute;inset-block-start:50%;inset-inline-end:100%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-inline-end-color:var(--ui-_bg);transform:translateY(-50%)}.ui-tooltip--visible{opacity:1}.ui-tooltip--hidden{opacity:0;pointer-events:none}.ui-tooltip--animate{transition:opacity var(--ui-_duration-fast) var(--ui-_ease-default)}}
|
|
143
|
+
@layer components.styles{.ui-tooltip{position:absolute;z-index:var(--ui-_z);max-inline-size:calc(0.5rem*25);padding:var(--ui-_padding-y) var(--ui-_padding-x);font-size:var(--ui-_font-size);line-height:calc(0.5rem*2);text-align:center;white-space:nowrap;color:var(--ui-_color);background:var(--ui-_bg);border-radius:var(--ui-_radius)}.ui-tooltip--top::after{content:"";position:absolute;inset-block-start:100%;inset-inline-start:50%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-block-start-color:var(--ui-_bg);transform:translateX(-50%)}.ui-tooltip--bottom::after{content:"";position:absolute;inset-block-end:100%;inset-inline-start:50%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-block-end-color:var(--ui-_bg);transform:translateX(-50%)}.ui-tooltip--start::after{content:"";position:absolute;inset-block-start:50%;inset-inline-start:100%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-inline-start-color:var(--ui-_bg);transform:translateY(-50%)}.ui-tooltip--end::after{content:"";position:absolute;inset-block-start:50%;inset-inline-end:100%;border:var(--ui-_arrow-size) solid rgba(0,0,0,0);border-inline-end-color:var(--ui-_bg);transform:translateY(-50%)}.ui-tooltip--visible{opacity:1}.ui-tooltip--hidden{opacity:0;pointer-events:none}.ui-tooltip--animate{transition:opacity var(--ui-_duration-fast) var(--ui-_ease-default)}@supports(anchor-name: --tooltip){.ui-tooltip--anchored{position:fixed;position-anchor:--tooltip;inset:auto;inset-area:block-start center;position-try-fallbacks:flip-block,flip-inline,flip-block flip-inline;margin-block-end:var(--ui-_arrow-size)}.ui-tooltip--anchored::after{content:none}.ui-tooltip-anchor{anchor-name:--tooltip}}}
|
|
142
144
|
@layer components.tokens{.ui-blockquote{--ui-_space-1: var(--ui-space-1, 0.5rem);--ui-_font-size-sm: var(--ui-font-size-sm, 0.875rem);--ui-_leading-sm: var(--ui-leading-sm, 1.5rem);--ui-_color-text-muted: var(--ui-color-text-muted, hsl(220, 10%, 45%));--ui-_border-color: var(--ui-blockquote-border-color, var(--ui-color-border-strong, hsl(220, 10%, 80%)));--ui-_border-width: var(--ui-blockquote-border-width, var(--ui-border-width-lg, 0.25rem));--ui-_padding-inline: var(--ui-blockquote-padding-inline, var(--ui-space-3, 1.5rem));--ui-_color: var(--ui-blockquote-color, var(--ui-color-text-muted, hsl(220, 10%, 45%)));--ui-_font-size: var(--ui-blockquote-font-size, var(--ui-font-size-lg, 1.25rem));--ui-_line-height: var(--ui-blockquote-line-height, var(--ui-leading-lg, 2rem))}.ui-blockquote--accent{--ui-_border-color: var(--ui-color-primary, oklch(55% 0.22 250deg))}}
|
|
143
145
|
@layer components.styles{.ui-blockquote{padding-inline-start:var(--ui-_padding-inline);margin:0;font-size:var(--ui-_font-size);font-style:italic;line-height:var(--ui-_line-height);color:var(--ui-_color);border-inline-start:var(--ui-_border-width) solid var(--ui-_border-color)}.ui-blockquote__cite{display:block;margin-block-start:var(--ui-_space-1);font-size:var(--ui-_font-size-sm);font-style:normal;line-height:var(--ui-_leading-sm);color:var(--ui-_color-text-muted)}}
|
|
144
146
|
@layer components.tokens{.ui-code{--ui-_font-mono: var(--ui-font-mono, ui-monospace, sfmono-regular, SF Mono, menlo, consolas, Liberation Mono, monospace);--ui-_leading-tight-sm: var(--ui-leading-tight-sm, 1rem);--ui-_border-width-sm: var(--ui-border-width-sm, 0.0625rem);--ui-_font-size: var(--ui-code-font-size, var(--ui-font-size-sm, 0.875rem));--ui-_bg: var(--ui-code-bg, var(--ui-color-bg-muted, hsl(220, 10%, 90%)));--ui-_padding-x: var(--ui-code-padding-x, var(--ui-space-1, 0.5rem));--ui-_padding-y: var(--ui-code-padding-y, var(--ui-space-0, 0.25rem));--ui-_radius: var(--ui-code-radius, var(--ui-radius-sm, 0.25rem))}.ui-code--sm{--ui-_font-size: var(--ui-font-size-xs, 0.75rem)}.ui-code-block{--ui-_font-size: var(--ui-code-font-size-block, var(--ui-font-size-sm, 0.875rem));--ui-_bg: var(--ui-code-bg-block, var(--ui-color-bg-muted, hsl(220, 10%, 90%)));--ui-_padding: var(--ui-code-padding-block, var(--ui-space-3, 1.5rem));--ui-_radius: var(--ui-code-radius-block, var(--ui-radius-md, 0.5rem));--ui-_border-color: var(--ui-code-border-color-block, var(--ui-color-border, hsl(220, 10%, 90%)))}}
|
|
@@ -163,6 +165,7 @@
|
|
|
163
165
|
@view-transition{navigation:auto}
|
|
164
166
|
@layer utilities{@keyframes vt-fade-in{from{opacity:0}}@keyframes vt-fade-out{to{opacity:0}}@keyframes vt-slide-in-up{from{opacity:0;transform:translateY(1.25rem)}}@keyframes vt-slide-out-up{to{opacity:0;transform:translateY(-1.25rem)}}@keyframes vt-slide-in-down{from{opacity:0;transform:translateY(-1.25rem)}}@keyframes vt-slide-out-down{to{opacity:0;transform:translateY(1.25rem)}}@keyframes vt-slide-in-start{from{opacity:0;transform:translateX(-1.25rem)}}@keyframes vt-slide-out-start{to{opacity:0;transform:translateX(-1.25rem)}}@keyframes vt-slide-in-end{from{opacity:0;transform:translateX(1.25rem)}}@keyframes vt-slide-out-end{to{opacity:0;transform:translateX(1.25rem)}}@keyframes vt-scale-in{from{opacity:0;transform:scale(0.95)}}@keyframes vt-scale-out{to{opacity:0;transform:scale(1.05)}}.ui-transition-name-sidebar{view-transition-name:sidebar}.ui-transition-name-main{view-transition-name:main}.ui-transition-name-header{view-transition-name:header}.ui-transition-name-hero{view-transition-name:hero}.ui-transition-name-card{view-transition-name:card}.ui-transition-name-modal{view-transition-name:modal}.ui-transition-name-slide-up{view-transition-name:slide-up}.ui-transition-name-slide-down{view-transition-name:slide-down}.ui-transition-name-slide-start{view-transition-name:slide-start}.ui-transition-name-slide-end{view-transition-name:slide-end}.ui-transition-name-scale{view-transition-name:scale}.ui-transition-name-fade{view-transition-name:fade}.ui-transition-name-none{view-transition-name:none}::view-transition-old(sidebar),::view-transition-new(sidebar),::view-transition-old(header),::view-transition-new(header){animation:none}::view-transition-old(root),::view-transition-new(root){animation-duration:var(--ui-duration-base);animation-timing-function:var(--ui-ease-default)}::view-transition-old(fade){animation:vt-fade-out var(--ui-duration-base) var(--ui-ease-out)}::view-transition-new(fade){animation:vt-fade-in var(--ui-duration-base) var(--ui-ease-out)}::view-transition-old(slide-up),::view-transition-old(main){animation:vt-slide-out-up var(--ui-duration-base) var(--ui-ease-out)}::view-transition-new(slide-up),::view-transition-new(main){animation:vt-slide-in-up var(--ui-duration-base) var(--ui-ease-out)}::view-transition-old(slide-down){animation:vt-slide-out-down var(--ui-duration-base) var(--ui-ease-out)}::view-transition-new(slide-down){animation:vt-slide-in-down var(--ui-duration-base) var(--ui-ease-out)}::view-transition-old(slide-start){animation:vt-slide-out-start var(--ui-duration-base) var(--ui-ease-out)}::view-transition-new(slide-start){animation:vt-slide-in-start var(--ui-duration-base) var(--ui-ease-out)}::view-transition-old(slide-end){animation:vt-slide-out-end var(--ui-duration-base) var(--ui-ease-out)}::view-transition-new(slide-end){animation:vt-slide-in-end var(--ui-duration-base) var(--ui-ease-out)}::view-transition-old(scale),::view-transition-old(modal),::view-transition-old(card){animation:vt-scale-out var(--ui-duration-base) var(--ui-ease-out)}::view-transition-new(scale),::view-transition-new(modal),::view-transition-new(card){animation:vt-scale-in var(--ui-duration-base) var(--ui-ease-out)}::view-transition-group(hero){animation-duration:var(--ui-duration-slow);animation-timing-function:var(--ui-ease-in-out)}@media(prefers-reduced-motion: reduce){::view-transition-old(*),::view-transition-new(*),::view-transition-group(*){animation-duration:0s !important}}}
|
|
165
167
|
@layer utilities{.ui-snap-x{overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain}.ui-snap-y{overflow-y:auto;scroll-snap-type:y mandatory;overscroll-behavior-y:contain}.ui-snap-x-proximity{overflow-x:auto;scroll-snap-type:x proximity}.ui-snap-y-proximity{overflow-y:auto;scroll-snap-type:y proximity}.ui-snap-none{scroll-snap-type:none}.ui-snap-start{scroll-snap-align:start}.ui-snap-center{scroll-snap-align:center}.ui-snap-end{scroll-snap-align:end}.ui-snap-always{scroll-snap-stop:always}.ui-snap-p-1{scroll-padding:var(--ui-space-1)}.ui-snap-p-2{scroll-padding:var(--ui-space-2)}.ui-snap-p-4{scroll-padding:var(--ui-space-4)}}
|
|
168
|
+
@layer utilities{@supports(animation-timeline: scroll()){.ui-scroll-progress{position:fixed;inset-block-start:0;inset-inline-start:0;z-index:var(--ui-z-toast, 700);block-size:var(--ui-scroll-progress-height, var(--ui-space-half, 0.25rem));inline-size:100%;background:var(--ui-scroll-progress-bg, var(--ui-color-primary));transform-origin:inline-start;scale:0 1;animation:scroll-progress-fill auto linear;animation-timeline:scroll()}@keyframes scroll-progress-fill{to{scale:1 1}}.ui-view-fade{animation:view-fade-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-fade-in{from{opacity:0}to{opacity:1}}.ui-view-slide-up{animation:view-slide-up-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-slide-up-in{from{opacity:0;transform:translateY(var(--ui-space-4, 2rem))}to{opacity:1;transform:translateY(0)}}.ui-view-slide-start{animation:view-slide-start-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-slide-start-in{from{opacity:0;transform:translateX(calc(var(--ui-space-4, 2rem) * -1))}to{opacity:1;transform:translateX(0)}}.ui-view-scale{animation:view-scale-in auto linear both;animation-timeline:view();animation-range:entry 0% entry 100%}@keyframes view-scale-in{from{opacity:0;scale:.9}to{opacity:1;scale:1}}@media(prefers-reduced-motion: reduce){.ui-scroll-progress,.ui-view-fade,.ui-view-slide-up,.ui-view-slide-start,.ui-view-scale{opacity:1;transform:none;scale:1 1;animation:none}}}}
|
|
166
169
|
@layer utilities{.ui-container-inline{container-type:inline-size}.ui-container-size{container-type:size}.ui-container-normal{container-type:normal}}
|
|
167
170
|
.ui-debug-grid,.ui-debug-grid-rows,.ui-debug-baseline{position:relative}
|
|
168
171
|
.ui-debug-grid{--ui-debug-color: hsl(var(--ui-hue-primary, 220) 80% 50% / 0.15)}
|
package/package.json
CHANGED
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
// Progress - progress bar indicator
|
|
6
6
|
// Shows completion status of a task
|
|
7
7
|
|
|
8
|
+
// Register --ui-progress-value as typed property so browsers can
|
|
9
|
+
// interpolate percentage values — enables smooth CSS-only transitions
|
|
10
|
+
// when value changes via JS (no inline width needed)
|
|
11
|
+
@property --ui-progress-value {
|
|
12
|
+
syntax: "<percentage>";
|
|
13
|
+
inherits: false;
|
|
14
|
+
initial-value: 0%;
|
|
15
|
+
}
|
|
16
|
+
|
|
8
17
|
@layer components.tokens {
|
|
9
18
|
.progress {
|
|
10
19
|
--_duration-normal: var(--ui-duration-normal, #{t.$duration-normal});
|
|
@@ -42,11 +51,16 @@
|
|
|
42
51
|
|
|
43
52
|
.progress__bar {
|
|
44
53
|
block-size: 100%;
|
|
54
|
+
// Typed --ui-progress-value enables CSS-only transitions;
|
|
55
|
+
// falls back to inline style width for older browsers
|
|
56
|
+
inline-size: var(--ui-progress-value, auto);
|
|
45
57
|
|
|
46
58
|
background: var(--_fill);
|
|
47
59
|
border-radius: var(--_radius);
|
|
48
60
|
|
|
49
|
-
transition:
|
|
61
|
+
transition:
|
|
62
|
+
inline-size var(--_duration-normal) var(--_ease-default),
|
|
63
|
+
--ui-progress-value var(--_duration-normal) var(--_ease-default);
|
|
50
64
|
}
|
|
51
65
|
|
|
52
66
|
// Indeterminate state - animated stripe
|
|
Binary file
|
|
@@ -230,6 +230,59 @@
|
|
|
230
230
|
"code": "<div class=\"ui-progress ui-progress--indeterminate\"\n role=\"progressbar\" aria-label=\"Loading\">\n <div class=\"ui-progress__bar\"></div>\n</div>"
|
|
231
231
|
}
|
|
232
232
|
]
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"title": "Typed Custom Property",
|
|
236
|
+
"description": "Set value via --ui-progress-value instead of inline width. The @property registration enables smooth CSS transitions when JS updates the value.",
|
|
237
|
+
"examples": [
|
|
238
|
+
{
|
|
239
|
+
"items": [
|
|
240
|
+
{
|
|
241
|
+
"tag": "div",
|
|
242
|
+
"attrs": {
|
|
243
|
+
"style": "display: flex; flex-direction: column; gap: var(--ui-space-2);"
|
|
244
|
+
},
|
|
245
|
+
"children": [
|
|
246
|
+
{
|
|
247
|
+
"tag": "div",
|
|
248
|
+
"class": "ui-progress",
|
|
249
|
+
"attrs": {
|
|
250
|
+
"role": "progressbar",
|
|
251
|
+
"aria-valuenow": "25",
|
|
252
|
+
"aria-valuemin": "0",
|
|
253
|
+
"aria-valuemax": "100"
|
|
254
|
+
},
|
|
255
|
+
"children": [
|
|
256
|
+
{
|
|
257
|
+
"tag": "div",
|
|
258
|
+
"class": "ui-progress__bar",
|
|
259
|
+
"style": { "--ui-progress-value": "25%" }
|
|
260
|
+
}
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"tag": "div",
|
|
265
|
+
"class": "ui-progress",
|
|
266
|
+
"attrs": {
|
|
267
|
+
"role": "progressbar",
|
|
268
|
+
"aria-valuenow": "75",
|
|
269
|
+
"aria-valuemin": "0",
|
|
270
|
+
"aria-valuemax": "100"
|
|
271
|
+
},
|
|
272
|
+
"children": [
|
|
273
|
+
{
|
|
274
|
+
"tag": "div",
|
|
275
|
+
"class": "ui-progress__bar",
|
|
276
|
+
"style": { "--ui-progress-value": "75%" }
|
|
277
|
+
}
|
|
278
|
+
]
|
|
279
|
+
}
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
"code": "<!-- CSS-only smooth transitions via @property -->\n<div class=\"ui-progress\" role=\"progressbar\" aria-valuenow=\"75\">\n <div class=\"ui-progress__bar\"\n style=\"--ui-progress-value: 75%;\"></div>\n</div>\n\n<!-- Update from JS: el.style.setProperty('--ui-progress-value', '90%') -->"
|
|
284
|
+
}
|
|
285
|
+
]
|
|
233
286
|
}
|
|
234
287
|
],
|
|
235
288
|
"customization": [
|
|
@@ -252,6 +305,11 @@
|
|
|
252
305
|
"token": "--ui-progress-radius",
|
|
253
306
|
"default": "var(--ui-radius-full)",
|
|
254
307
|
"description": "Border radius"
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"token": "--ui-progress-value",
|
|
311
|
+
"default": "0%",
|
|
312
|
+
"description": "Progress value as percentage (typed via @property for smooth transitions)"
|
|
255
313
|
}
|
|
256
314
|
]
|
|
257
315
|
}
|
|
@@ -5,6 +5,14 @@
|
|
|
5
5
|
// Progress Circle - circular progress indicator
|
|
6
6
|
// Uses SVG circles with stroke-dasharray/dashoffset driven by --ui-progress-circle-value
|
|
7
7
|
|
|
8
|
+
// Register typed property so browsers can interpolate the value
|
|
9
|
+
// — enables smooth stroke-dashoffset transitions via CSS alone
|
|
10
|
+
@property --ui-progress-circle-value {
|
|
11
|
+
syntax: "<number>";
|
|
12
|
+
inherits: false;
|
|
13
|
+
initial-value: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
8
16
|
@layer components.tokens {
|
|
9
17
|
.progress-circle {
|
|
10
18
|
--_duration-slow: var(--ui-duration-slow, #{t.$duration-slow});
|
|
@@ -78,7 +86,9 @@
|
|
|
78
86
|
stroke-dasharray: var(--_circumference);
|
|
79
87
|
stroke-dashoffset: calc(var(--_circumference) * (1 - var(--_value) / 100));
|
|
80
88
|
|
|
81
|
-
transition:
|
|
89
|
+
transition:
|
|
90
|
+
stroke-dashoffset var(--_duration-slow) var(--_ease-default),
|
|
91
|
+
--ui-progress-circle-value var(--_duration-slow) var(--_ease-default);
|
|
82
92
|
}
|
|
83
93
|
|
|
84
94
|
// Indeterminate - rotating partial arc
|
|
@@ -114,4 +114,29 @@
|
|
|
114
114
|
.tooltip--animate {
|
|
115
115
|
transition: opacity var(--_duration-fast) var(--_ease-default);
|
|
116
116
|
}
|
|
117
|
+
|
|
118
|
+
// Anchor-positioned tooltip (progressive enhancement)
|
|
119
|
+
// Browser auto-positions relative to anchor element, no JS needed
|
|
120
|
+
// @modifier boolean anchored
|
|
121
|
+
@supports (anchor-name: --tooltip) {
|
|
122
|
+
.tooltip--anchored {
|
|
123
|
+
position: fixed;
|
|
124
|
+
position-anchor: --tooltip;
|
|
125
|
+
inset: auto;
|
|
126
|
+
inset-area: block-start center;
|
|
127
|
+
position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
|
|
128
|
+
|
|
129
|
+
margin-block-end: var(--_arrow-size);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Hide CSS arrows — browser handles positioning
|
|
133
|
+
.tooltip--anchored::after {
|
|
134
|
+
content: none;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Anchor source: place on trigger element
|
|
138
|
+
.tooltip-anchor {
|
|
139
|
+
anchor-name: --tooltip;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
117
142
|
}
|
|
Binary file
|
|
@@ -64,6 +64,36 @@
|
|
|
64
64
|
"code": "<span class=\"ui-tooltip ui-tooltip--top ui-tooltip--animate ui-tooltip--visible\">\n Animated tooltip\n</span>"
|
|
65
65
|
}
|
|
66
66
|
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"title": "Anchor Positioned",
|
|
70
|
+
"description": "Browser-native positioning via CSS Anchor Positioning. No JS needed for placement. Wrapped in @supports — falls back to manual positioning in unsupported browsers.",
|
|
71
|
+
"examples": [
|
|
72
|
+
{
|
|
73
|
+
"items": [
|
|
74
|
+
{
|
|
75
|
+
"tag": "div",
|
|
76
|
+
"attrs": {
|
|
77
|
+
"style": "position: relative; padding: var(--ui-space-4); display: flex; gap: var(--ui-space-4);"
|
|
78
|
+
},
|
|
79
|
+
"children": [
|
|
80
|
+
{
|
|
81
|
+
"tag": "button",
|
|
82
|
+
"class": "ui-button",
|
|
83
|
+
"attrs": { "style": "anchor-name: --tooltip;" },
|
|
84
|
+
"text": "Hover me"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"tag": "span",
|
|
88
|
+
"class": "ui-tooltip ui-tooltip--anchored ui-tooltip--visible",
|
|
89
|
+
"text": "Anchored tooltip"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"code": "<!-- Add anchor-name: --tooltip to trigger -->\n<button class=\"ui-button\" style=\"anchor-name: --tooltip\">Hover me</button>\n<span class=\"ui-tooltip ui-tooltip--anchored ui-tooltip--visible\">\n Anchored tooltip\n</span>\n\n<!-- Or use the helper class -->\n<button class=\"ui-button\" style=\"anchor-name: --tooltip\">Trigger</button>"
|
|
95
|
+
}
|
|
96
|
+
]
|
|
67
97
|
}
|
|
68
98
|
],
|
|
69
99
|
"customization": [
|
package/src/utilities/index.scss
CHANGED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
@use '../../config/tokens/variables' as t;
|
|
2
|
+
// Scroll-driven animation utilities
|
|
3
|
+
// Progressive enhancement: all rules wrapped in @supports
|
|
4
|
+
|
|
5
|
+
@layer utilities {
|
|
6
|
+
@supports (animation-timeline: scroll()) {
|
|
7
|
+
// ========================================================================
|
|
8
|
+
// SCROLL PROGRESS INDICATOR
|
|
9
|
+
// Fixed bar at top of viewport showing page scroll progress
|
|
10
|
+
// ========================================================================
|
|
11
|
+
.scroll-progress {
|
|
12
|
+
position: fixed;
|
|
13
|
+
inset-block-start: 0;
|
|
14
|
+
inset-inline-start: 0;
|
|
15
|
+
z-index: var(--ui-z-toast, #{t.$z-toast});
|
|
16
|
+
|
|
17
|
+
block-size: var(--ui-scroll-progress-height, var(--ui-space-half, #{t.$space-0}));
|
|
18
|
+
inline-size: 100%;
|
|
19
|
+
|
|
20
|
+
background: var(--ui-scroll-progress-bg, var(--ui-color-primary));
|
|
21
|
+
transform-origin: inline-start;
|
|
22
|
+
scale: 0 1;
|
|
23
|
+
|
|
24
|
+
animation: scroll-progress-fill auto linear;
|
|
25
|
+
animation-timeline: scroll();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@keyframes scroll-progress-fill {
|
|
29
|
+
to {
|
|
30
|
+
scale: 1 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ========================================================================
|
|
35
|
+
// VIEW-DRIVEN FADE IN
|
|
36
|
+
// Fade in when element enters viewport
|
|
37
|
+
// ========================================================================
|
|
38
|
+
.view-fade {
|
|
39
|
+
animation: view-fade-in auto linear both;
|
|
40
|
+
animation-timeline: view();
|
|
41
|
+
animation-range: entry 0% entry 100%;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@keyframes view-fade-in {
|
|
45
|
+
from {
|
|
46
|
+
opacity: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
to {
|
|
50
|
+
opacity: 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ========================================================================
|
|
55
|
+
// VIEW-DRIVEN SLIDE UP
|
|
56
|
+
// Slide up and fade in when element enters viewport
|
|
57
|
+
// ========================================================================
|
|
58
|
+
.view-slide-up {
|
|
59
|
+
animation: view-slide-up-in auto linear both;
|
|
60
|
+
animation-timeline: view();
|
|
61
|
+
animation-range: entry 0% entry 100%;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@keyframes view-slide-up-in {
|
|
65
|
+
from {
|
|
66
|
+
opacity: 0;
|
|
67
|
+
transform: translateY(var(--ui-space-4, #{t.$space-4}));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
to {
|
|
71
|
+
opacity: 1;
|
|
72
|
+
transform: translateY(0);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ========================================================================
|
|
77
|
+
// VIEW-DRIVEN SLIDE START (left in LTR)
|
|
78
|
+
// ========================================================================
|
|
79
|
+
.view-slide-start {
|
|
80
|
+
animation: view-slide-start-in auto linear both;
|
|
81
|
+
animation-timeline: view();
|
|
82
|
+
animation-range: entry 0% entry 100%;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@keyframes view-slide-start-in {
|
|
86
|
+
from {
|
|
87
|
+
opacity: 0;
|
|
88
|
+
transform: translateX(calc(var(--ui-space-4, #{t.$space-4}) * -1));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
to {
|
|
92
|
+
opacity: 1;
|
|
93
|
+
transform: translateX(0);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ========================================================================
|
|
98
|
+
// VIEW-DRIVEN SCALE
|
|
99
|
+
// Scale up and fade in on viewport entry
|
|
100
|
+
// ========================================================================
|
|
101
|
+
.view-scale {
|
|
102
|
+
animation: view-scale-in auto linear both;
|
|
103
|
+
animation-timeline: view();
|
|
104
|
+
animation-range: entry 0% entry 100%;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@keyframes view-scale-in {
|
|
108
|
+
from {
|
|
109
|
+
opacity: 0;
|
|
110
|
+
scale: 0.9;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
to {
|
|
114
|
+
opacity: 1;
|
|
115
|
+
scale: 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ========================================================================
|
|
120
|
+
// ACCESSIBILITY: disable all scroll-driven animations for reduced motion
|
|
121
|
+
// ========================================================================
|
|
122
|
+
@media (prefers-reduced-motion: reduce) {
|
|
123
|
+
.scroll-progress,
|
|
124
|
+
.view-fade,
|
|
125
|
+
.view-slide-up,
|
|
126
|
+
.view-slide-start,
|
|
127
|
+
.view-scale {
|
|
128
|
+
opacity: 1;
|
|
129
|
+
transform: none;
|
|
130
|
+
scale: 1 1;
|
|
131
|
+
|
|
132
|
+
animation: none;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "scroll-animation",
|
|
3
|
+
"type": "utility",
|
|
4
|
+
"utilities": ["scroll-progress", "view-fade", "view-slide-up", "view-slide-start", "view-scale"],
|
|
5
|
+
"cssVars": [
|
|
6
|
+
{
|
|
7
|
+
"name": "--ui-scroll-progress-height",
|
|
8
|
+
"default": "var(--ui-space-half)",
|
|
9
|
+
"description": "Scroll progress indicator height"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "--ui-scroll-progress-bg",
|
|
13
|
+
"default": "var(--ui-color-primary)",
|
|
14
|
+
"description": "Scroll progress indicator color"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "scroll-animation-utils",
|
|
3
|
+
"type": "utility",
|
|
4
|
+
"title": "Scroll Animation",
|
|
5
|
+
"description": "Scroll-driven animation utilities for progress indicators and viewport-triggered effects. Wrapped in @supports — no impact on unsupported browsers.",
|
|
6
|
+
"api": "scroll-animation.api.json",
|
|
7
|
+
"sections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Scroll Progress Indicator",
|
|
10
|
+
"description": "Fixed bar at the top of the viewport that fills as the user scrolls down.",
|
|
11
|
+
"examples": [
|
|
12
|
+
{
|
|
13
|
+
"items": [
|
|
14
|
+
{
|
|
15
|
+
"tag": "div",
|
|
16
|
+
"attrs": { "style": "position: relative; block-size: 12rem; overflow-y: auto;" },
|
|
17
|
+
"children": [
|
|
18
|
+
{
|
|
19
|
+
"tag": "div",
|
|
20
|
+
"class": "ui-scroll-progress",
|
|
21
|
+
"attrs": { "style": "position: absolute;" }
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"tag": "div",
|
|
25
|
+
"attrs": { "style": "block-size: 40rem; padding: var(--ui-space-2);" },
|
|
26
|
+
"children": [{ "tag": "p", "text": "Scroll down to see the progress bar fill." }]
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"code": "<div class=\"ui-scroll-progress\"></div>\n<!-- Fills as page scrolls -->"
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"title": "View Fade",
|
|
37
|
+
"description": "Elements fade in as they enter the viewport.",
|
|
38
|
+
"examples": [
|
|
39
|
+
{
|
|
40
|
+
"items": [
|
|
41
|
+
{
|
|
42
|
+
"tag": "div",
|
|
43
|
+
"class": "ui-view-fade ui-card ui-p-2",
|
|
44
|
+
"text": "I fade in on scroll"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"code": "<div class=\"ui-view-fade\">I fade in on scroll</div>"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"title": "View Slide Up",
|
|
53
|
+
"description": "Elements slide up and fade in on viewport entry.",
|
|
54
|
+
"examples": [
|
|
55
|
+
{
|
|
56
|
+
"items": [
|
|
57
|
+
{
|
|
58
|
+
"tag": "div",
|
|
59
|
+
"class": "ui-view-slide-up ui-card ui-p-2",
|
|
60
|
+
"text": "I slide up into view"
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"code": "<div class=\"ui-view-slide-up\">I slide up into view</div>"
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"title": "View Slide Start",
|
|
69
|
+
"description": "Elements slide in from the start edge (left in LTR) on viewport entry.",
|
|
70
|
+
"examples": [
|
|
71
|
+
{
|
|
72
|
+
"items": [
|
|
73
|
+
{
|
|
74
|
+
"tag": "div",
|
|
75
|
+
"class": "ui-view-slide-start ui-card ui-p-2",
|
|
76
|
+
"text": "I slide from the start"
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"code": "<div class=\"ui-view-slide-start\">I slide from the start</div>"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"title": "View Scale",
|
|
85
|
+
"description": "Elements scale up and fade in on viewport entry.",
|
|
86
|
+
"examples": [
|
|
87
|
+
{
|
|
88
|
+
"items": [
|
|
89
|
+
{
|
|
90
|
+
"tag": "div",
|
|
91
|
+
"class": "ui-view-scale ui-card ui-p-2",
|
|
92
|
+
"text": "I scale into view"
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"code": "<div class=\"ui-view-scale\">I scale into view</div>"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|