@agorapulse/ui-theme 20.1.18 → 20.1.20

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 (49) hide show
  1. package/agorapulse-ui-theme-20.1.20.tgz +0 -0
  2. package/assets/desktop_variables.css +10 -0
  3. package/assets/mobile_variables.css +10 -0
  4. package/assets/style/_table.scss +5 -5
  5. package/assets/style/_tooltip.scss +6 -1
  6. package/assets/style/css-ui/_action-dropdown.scss +163 -0
  7. package/assets/style/css-ui/_avatar.scss +236 -0
  8. package/assets/style/css-ui/_badge.scss +28 -0
  9. package/assets/style/css-ui/_button.scss +261 -0
  10. package/assets/style/css-ui/_checkbox.scss +168 -0
  11. package/assets/style/css-ui/_counter.scss +76 -0
  12. package/assets/style/css-ui/_datepicker.scss +307 -0
  13. package/assets/style/css-ui/_dot-stepper.scss +67 -0
  14. package/assets/style/{_helpers.scss → css-ui/_helpers.scss} +14 -13
  15. package/assets/style/css-ui/_icon-button.scss +162 -0
  16. package/assets/style/css-ui/_infobox.scss +154 -0
  17. package/assets/style/css-ui/_input.scss +133 -0
  18. package/assets/style/css-ui/_label.scss +89 -0
  19. package/assets/style/css-ui/_link.scss +91 -0
  20. package/assets/style/css-ui/_loader.scss +178 -0
  21. package/assets/style/css-ui/_mixins.scss +50 -0
  22. package/assets/style/css-ui/_pagination.scss +177 -0
  23. package/assets/style/css-ui/_radio-card.scss +200 -0
  24. package/assets/style/css-ui/_radio.scss +111 -0
  25. package/assets/style/css-ui/_select.scss +656 -0
  26. package/assets/style/css-ui/_selection-dropdown.scss +183 -0
  27. package/assets/style/css-ui/_snackbar.scss +166 -0
  28. package/assets/style/css-ui/_split-button.scss +79 -0
  29. package/assets/style/css-ui/_status.scss +71 -0
  30. package/assets/style/css-ui/_stepper.scss +127 -0
  31. package/assets/style/css-ui/_table.scss +325 -0
  32. package/assets/style/css-ui/_tabs.scss +182 -0
  33. package/assets/style/css-ui/_tag.scss +169 -0
  34. package/assets/style/css-ui/_textarea.scss +121 -0
  35. package/assets/style/css-ui/_toggle.scss +136 -0
  36. package/assets/style/css-ui/_tooltip.scss +122 -0
  37. package/assets/style/{_mat-typography.scss → css-ui/_typography.scss} +34 -26
  38. package/assets/style/css-ui/index.css +4723 -0
  39. package/assets/style/css-ui/index.css.map +1 -0
  40. package/assets/style/css-ui/index.scss +34 -0
  41. package/assets/style/theme.scss +9 -2
  42. package/package.json +13 -2
  43. package/src/tokens/system/icon.json +33 -0
  44. package/agorapulse-ui-theme-20.1.18.tgz +0 -0
  45. package/assets/style/lovable/lovable-button.css +0 -446
  46. package/assets/style/lovable/lovable-input.css +0 -119
  47. package/assets/style/lovable/lovable-radio.css +0 -109
  48. package/assets/style/lovable/lovable-toggle.css +0 -161
  49. package/assets/style/lovable/tailwind.config.ts +0 -431
@@ -0,0 +1,154 @@
1
+ // Agorapulse Infobox Styles
2
+ @use 'mixins' as m;
3
+
4
+ .ap-infobox {
5
+ container: infobox / inline-size;
6
+ display: flex;
7
+ width: 100%;
8
+ max-width: 100%;
9
+ font-size: var(--ref-font-size-sm);
10
+ line-height: var(--ref-font-line-height-sm);
11
+ align-items: flex-start;
12
+ color: var(--ref-color-grey-100);
13
+ padding: var(--comp-infobox-padding-top) var(--comp-infobox-padding-right) var(--comp-infobox-padding-bottom) var(--comp-infobox-padding-left);
14
+ border-radius: var(--comp-infobox-border-radius);
15
+ overflow: hidden;
16
+ font-family: var(--comp-infobox-text-title-font-family);
17
+ box-sizing: border-box;
18
+ position: relative;
19
+ gap: var(--ref-spacing-xs);
20
+
21
+ // Left banner via pseudo-element (no HTML needed)
22
+ &::before {
23
+ content: '';
24
+ position: absolute;
25
+ left: 0;
26
+ top: 0;
27
+ width: var(--comp-infobox-border-width, 4px);
28
+ height: 100%;
29
+ }
30
+
31
+ // Icon — direct <i> child, size defaulted to sm (no wrapper, no size class needed)
32
+ > i {
33
+ font-size: var(--sys-icon-css-sm);
34
+ flex-shrink: 0;
35
+ margin-top: 1px;
36
+ }
37
+
38
+ // With title — center icon vertically with the title+message block
39
+ &.has-title {
40
+ align-items: center;
41
+
42
+ > i {
43
+ margin-top: 0;
44
+ }
45
+ }
46
+
47
+ // Variants
48
+ &.info {
49
+ background-color: var(--comp-infobox-info-background-color);
50
+ > i { color: var(--comp-infobox-info-icon-color); }
51
+ &::before { background-color: var(--comp-infobox-info-border-left-color); }
52
+ }
53
+
54
+ &.warning {
55
+ background-color: var(--comp-infobox-warning-background-color);
56
+ > i { color: var(--comp-infobox-warning-icon-color); }
57
+ &::before { background-color: var(--comp-infobox-warning-border-left-color); }
58
+ }
59
+
60
+ &.error {
61
+ background-color: var(--comp-infobox-error-background-color);
62
+ > i { color: var(--comp-infobox-error-icon-color); }
63
+ &::before { background-color: var(--comp-infobox-error-border-left-color); }
64
+ }
65
+
66
+ &.success {
67
+ background-color: var(--comp-infobox-success-background-color);
68
+ > i { color: var(--comp-infobox-success-icon-color); }
69
+ &::before { background-color: var(--comp-infobox-success-border-left-color); }
70
+ }
71
+ }
72
+
73
+ // Content wrapper
74
+ .ap-infobox-content {
75
+ display: flex;
76
+ flex-direction: column;
77
+ align-items: flex-start;
78
+ flex: 1;
79
+ justify-content: space-between;
80
+ gap: var(--ref-spacing-xxs);
81
+ min-width: 0;
82
+
83
+ > .ap-button {
84
+ width: unset;
85
+ }
86
+ }
87
+
88
+ // Text content
89
+ .ap-infobox-texts {
90
+ display: flex;
91
+ flex-direction: column;
92
+ overflow-wrap: anywhere;
93
+ width: 100%;
94
+ }
95
+
96
+ // Title
97
+ .ap-infobox-title {
98
+ font-weight: var(--comp-infobox-text-title-weight);
99
+ font-family: var(--comp-infobox-text-title-font-family);
100
+ font-size: var(--comp-infobox-text-title-size);
101
+ line-height: var(--comp-infobox-text-title-line-height);
102
+ }
103
+
104
+ // Message/Body text
105
+ .ap-infobox-message {
106
+ font-weight: var(--comp-infobox-text-content-weight);
107
+ font-family: var(--comp-infobox-text-content-font-family);
108
+ font-size: var(--comp-infobox-text-content-size);
109
+ line-height: var(--comp-infobox-text-content-line-height);
110
+ }
111
+
112
+ // Close button
113
+ .ap-infobox-close {
114
+ display: flex;
115
+ justify-content: center;
116
+ align-items: center;
117
+ @include m.fixed-size(var(--comp-close-button-size));
118
+ border-radius: 50%;
119
+ background: transparent;
120
+ border: none;
121
+ padding: var(--comp-close-button-padding);
122
+ cursor: pointer;
123
+ flex-shrink: 0;
124
+ transition: background 0.25s;
125
+
126
+ @media (hover: hover) {
127
+ &:focus:not(:active) {
128
+ @include m.focus-ring;
129
+ }
130
+ }
131
+
132
+ &:hover {
133
+ background: var(--comp-close-button-hover-background);
134
+ }
135
+
136
+ &:active {
137
+ background: var(--comp-close-button-active-background);
138
+ }
139
+
140
+ // Close icon (implicit > i)
141
+ > i {
142
+ color: var(--ref-color-grey-80);
143
+ }
144
+ }
145
+
146
+ // Wide layout via container query
147
+ // Threshold adjusted from 588px to 560px to compensate for infobox padding (28px)
148
+ // so the breakpoint triggers at the same visual width as the Angular component.
149
+ @container infobox (min-width: 560px) {
150
+ .ap-infobox-content {
151
+ flex-direction: row;
152
+ align-items: center;
153
+ }
154
+ }
@@ -0,0 +1,133 @@
1
+ // Agorapulse Input Styles
2
+ @use 'mixins' as m;
3
+ @use 'ui-symbol/icons/build/ap-icons-data' as icons;
4
+
5
+ // Form field container
6
+ .ap-form-field {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--ref-spacing-xxs);
10
+
11
+ // Label — implicit > label
12
+ > label {
13
+ @include m.text-style('body');
14
+ color: var(--ref-color-grey-100);
15
+ }
16
+ }
17
+
18
+ // Input group container
19
+ .ap-input-group {
20
+ width: 100%;
21
+ display: inline-flex;
22
+ align-items: center;
23
+ height: var(--comp-input-height);
24
+ border: 1px solid var(--comp-input-border-default-color);
25
+ box-sizing: border-box;
26
+ border-radius: var(--comp-input-border-radius);
27
+ overflow: hidden;
28
+ background-color: var(--comp-input-fill-color);
29
+ gap: var(--ref-spacing-xxs);
30
+ padding: 0 var(--ref-spacing-xs);
31
+
32
+ // Disabled input
33
+ &:has(input:disabled) {
34
+ background-color: var(--comp-input-fill-disabled-color);
35
+ color: var(--comp-input-text-disabled-color);
36
+ }
37
+
38
+ // Hover state
39
+ &:hover:not(:has(input:disabled)) {
40
+ border-color: var(--comp-input-border-hover-color);
41
+ }
42
+
43
+ // Focus state
44
+ &:focus-within:not(:has(input:disabled)) {
45
+ border-color: var(--comp-input-border-focused-color);
46
+ }
47
+
48
+ // Invalid state
49
+ &.invalid,
50
+ &:has(input.invalid) {
51
+ border-color: var(--comp-input-border-error-color);
52
+ }
53
+
54
+ // Valid state
55
+ &.valid,
56
+ &:has(input.valid) {
57
+ border-color: var(--comp-input-border-success-color);
58
+ }
59
+
60
+ // Icon on right
61
+ &.inverse {
62
+ flex-direction: row-reverse;
63
+ }
64
+
65
+ // Input — implicit > input
66
+ > input {
67
+ flex: 1;
68
+ border: none;
69
+ outline: none;
70
+ background: transparent;
71
+ color: var(--comp-input-text-default-color);
72
+ font-family: var(--comp-input-text-font-family);
73
+ font-size: var(--comp-input-text-size);
74
+ font-weight: var(--comp-input-text-font-weight);
75
+ padding: 0;
76
+ min-width: 0;
77
+
78
+ &::placeholder {
79
+ color: var(--comp-input-text-placeholder-color);
80
+ }
81
+
82
+ &:disabled {
83
+ color: var(--comp-input-text-disabled-color);
84
+ }
85
+ }
86
+
87
+ // Icon — implicit > i
88
+ > i {
89
+ flex-shrink: 0;
90
+ width: var(--comp-input-icon-size);
91
+ height: var(--comp-input-icon-size);
92
+ color: var(--comp-input-icon-color);
93
+ pointer-events: none;
94
+ }
95
+ }
96
+
97
+ // Form message (error/success)
98
+ .ap-form-message {
99
+ font-size: var(--comp-forms-status-text-size);
100
+ font-weight: var(--comp-forms-status-text-font-weight);
101
+ line-height: var(--comp-forms-status-text-line-height);
102
+ font-family: var(--comp-forms-status-text-font-family);
103
+ margin: 0;
104
+ display: flex;
105
+ align-items: center;
106
+ gap: var(--ref-spacing-xxxs);
107
+
108
+ // Icon injected via ::before (no <i> needed in HTML)
109
+ &::before {
110
+ @include icons.icon-base;
111
+ width: var(--comp-forms-status-icon-size);
112
+ height: var(--comp-forms-status-icon-size);
113
+ flex-shrink: 0;
114
+ }
115
+
116
+ &.error {
117
+ color: var(--comp-forms-status-text-error-color);
118
+
119
+ &::before {
120
+ @include icons.icon('error_fill');
121
+ color: var(--comp-forms-status-icon-error-color);
122
+ }
123
+ }
124
+
125
+ &.success {
126
+ color: var(--comp-forms-status-text-success-color);
127
+
128
+ &::before {
129
+ @include icons.icon('rounded-check_fill');
130
+ color: var(--comp-forms-status-icon-success-color);
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,89 @@
1
+ // Agorapulse Label Styles
2
+ @use 'mixins' as m;
3
+
4
+ .ap-label {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ max-width: 100%;
8
+ background: var(--comp-label-background-color);
9
+ border-radius: var(--comp-label-border-radius);
10
+ padding: 0 var(--comp-label-padding-right) 0 var(--comp-label-padding-left);
11
+ height: var(--comp-label-height);
12
+ box-sizing: border-box;
13
+
14
+ // Text styles on container (span optional)
15
+ color: var(--comp-label-text-color);
16
+ font-family: var(--comp-label-text-style-font-family);
17
+ font-size: var(--comp-label-text-style-size);
18
+ font-weight: var(--comp-label-text-style-font-weight);
19
+ line-height: var(--comp-label-text-style-line-height);
20
+ white-space: nowrap;
21
+ text-decoration: none;
22
+
23
+ // Auto-detect close button — tighter padding + gap
24
+ &:has(> button) {
25
+ gap: var(--comp-label-closable-spacing);
26
+ padding: 0 var(--comp-label-closable-padding-right) 0 var(--ref-spacing-xxs);
27
+ }
28
+
29
+ // Text truncation — use > span when combined with a close button
30
+ > span {
31
+ @include m.truncate;
32
+ max-width: 180px;
33
+ }
34
+
35
+ // Icon slot — implicit > i
36
+ > i {
37
+ width: 12px;
38
+ height: 12px;
39
+ }
40
+
41
+ // Close button with <i class="ap-icon-close"> inside
42
+ > button {
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ flex-shrink: 0;
47
+ width: calc(var(--comp-label-height) - 4px);
48
+ height: calc(var(--comp-label-height) - 4px);
49
+ min-width: calc(var(--comp-label-height) - 4px);
50
+ border: none;
51
+ background: transparent;
52
+ border-radius: 50%;
53
+ cursor: pointer;
54
+ padding: 0;
55
+ color: var(--comp-label-text-color);
56
+ transition: background-color 0.15s;
57
+
58
+ &:hover {
59
+ background: var(--ref-color-electric-blue-40);
60
+ }
61
+
62
+ &:active {
63
+ background: var(--ref-color-electric-blue-60);
64
+ }
65
+
66
+ > i {
67
+ width: 12px;
68
+ height: 12px;
69
+ }
70
+ }
71
+
72
+ // button.ap-label — focus ring for clickable labels
73
+ &:is(button) {
74
+ cursor: pointer;
75
+
76
+ @media (hover: hover) {
77
+ &:focus:not(:disabled):not(:active) {
78
+ @include m.focus-ring;
79
+ }
80
+ }
81
+ }
82
+ }
83
+
84
+ // Label list container
85
+ .ap-label-list {
86
+ display: flex;
87
+ flex-wrap: wrap;
88
+ gap: var(--ref-spacing-xxs);
89
+ }
@@ -0,0 +1,91 @@
1
+ // Agorapulse Link Styles
2
+ @use 'mixins' as m;
3
+
4
+ // Base link styling
5
+ .ap-link {
6
+ display: inline-flex;
7
+ gap: var(--comp-link-spacing);
8
+ font-family: var(--comp-link-text-font-family);
9
+ font-weight: var(--comp-link-text-font-weight);
10
+ line-height: var(--comp-link-text-line-height);
11
+ font-size: var(--comp-link-text-size);
12
+ align-items: center;
13
+ text-decoration: underline;
14
+ -webkit-tap-highlight-color: transparent;
15
+ cursor: pointer;
16
+ color: var(--comp-link-default-color);
17
+
18
+ // Size variants
19
+ &.small {
20
+ font-family: var(--comp-link-small-text-style-font-family);
21
+ font-weight: var(--comp-link-small-text-style-font-weight);
22
+ line-height: var(--comp-link-small-text-style-line-height);
23
+ font-size: var(--comp-link-small-text-style-size);
24
+ }
25
+
26
+ &.big {
27
+ font-family: var(--comp-link-big-text-style-font-family);
28
+ font-weight: var(--comp-link-big-text-style-font-weight);
29
+ line-height: var(--comp-link-big-text-style-line-height);
30
+ font-size: var(--comp-link-big-text-style-size);
31
+ }
32
+
33
+ // Standalone variant (no underline)
34
+ &.standalone {
35
+ text-decoration: none;
36
+ font-family: var(--comp-link-standalone-default-text-style-font-family);
37
+ font-weight: var(--comp-link-standalone-default-text-style-font-weight);
38
+ line-height: var(--comp-link-standalone-default-text-style-line-height);
39
+ font-size: var(--comp-link-standalone-default-text-style-size);
40
+ color: var(--comp-link-default-color);
41
+
42
+ &.small {
43
+ font-family: var(--comp-link-standalone-small-text-style-font-family);
44
+ font-weight: var(--comp-link-standalone-small-text-style-font-weight);
45
+ line-height: var(--comp-link-standalone-small-text-style-line-height);
46
+ font-size: var(--comp-link-standalone-small-text-style-size);
47
+ }
48
+ }
49
+
50
+ // States
51
+ &:hover {
52
+ color: var(--comp-link-hover-color);
53
+ }
54
+
55
+ &:active:not(:visited):not(.disabled) {
56
+ color: var(--comp-link-clicked-color);
57
+ }
58
+
59
+ &:visited:not(.standalone) {
60
+ color: var(--comp-link-visited-color);
61
+ }
62
+
63
+ // Disabled state
64
+ &.disabled,
65
+ &[aria-disabled='true'] {
66
+ color: var(--comp-link-disabled-color);
67
+ pointer-events: none;
68
+ cursor: default;
69
+ }
70
+
71
+ // Icon positioning
72
+ &.inverse {
73
+ flex-direction: row-reverse;
74
+ }
75
+
76
+ // Focus state for accessibility
77
+ &:focus-visible {
78
+ @include m.focus-ring;
79
+ outline-offset: 2px;
80
+ border-radius: 2px;
81
+ }
82
+
83
+ // Icon sizing — implicit > i
84
+ > i {
85
+ min-width: var(--comp-link-icon-size);
86
+ min-height: var(--comp-link-icon-size);
87
+ max-width: var(--comp-link-icon-size);
88
+ max-height: var(--comp-link-icon-size);
89
+ flex-shrink: 0;
90
+ }
91
+ }
@@ -0,0 +1,178 @@
1
+ // Agorapulse Loader Styles
2
+ // SVG-based loader with CSS-driven geometry and animation
3
+ // Usage: <div class="ap-loader orange size-48"><svg><circle/><circle/></svg></div>
4
+ //
5
+ // Zero attributes on SVG elements — all geometry, stroke, and animation in CSS.
6
+ // Reproduces the Angular loader exactly: round caps, per-size dasharray, dual easing.
7
+
8
+ .ap-loader {
9
+ --_track: var(--ref-color-electric-blue-10);
10
+ --_color: var(--ref-color-electric-blue-100);
11
+
12
+ display: inline-block;
13
+ position: relative;
14
+ line-height: 0;
15
+
16
+ svg {
17
+ width: 100%;
18
+ height: 100%;
19
+ }
20
+
21
+ circle {
22
+ cx: 50%;
23
+ cy: 50%;
24
+ fill: transparent;
25
+ stroke-linecap: round;
26
+ transform: rotate(-90deg);
27
+ transform-origin: center;
28
+ }
29
+
30
+ circle:first-child {
31
+ stroke: var(--_track);
32
+ }
33
+
34
+ circle:last-child {
35
+ stroke: var(--_color);
36
+ }
37
+
38
+ // Color variants
39
+ &.blue {
40
+ --_track: var(--ref-color-electric-blue-10);
41
+ --_color: var(--ref-color-electric-blue-100);
42
+ }
43
+
44
+ &.orange {
45
+ --_track: var(--ref-color-orange-40);
46
+ --_color: var(--ref-color-orange-100);
47
+ }
48
+
49
+ &.white {
50
+ --_track: rgba(255, 255, 255, 0.4);
51
+ --_color: #ffffff;
52
+ }
53
+
54
+ &.grey {
55
+ --_track: var(--ref-color-grey-20);
56
+ --_color: var(--ref-color-grey-80);
57
+ }
58
+
59
+ // Size variants — r, stroke-width, dasharray from Angular source
60
+ &.size-16 {
61
+ width: 16px;
62
+ height: 16px;
63
+ circle {
64
+ r: 6.5px;
65
+ stroke-width: 3;
66
+ stroke-dasharray: 40;
67
+ stroke-dashoffset: 47;
68
+ }
69
+ circle:first-child { animation: ap-loader-16 1.5s cubic-bezier(0.42, 0, 0.78, 1) infinite; }
70
+ circle:last-child { animation: ap-loader-16 1.5s cubic-bezier(0.42, 0, 0.58, 1) infinite; }
71
+ }
72
+
73
+ &.size-24 {
74
+ width: 24px;
75
+ height: 24px;
76
+ circle {
77
+ r: 10px;
78
+ stroke-width: 4;
79
+ stroke-dasharray: 62;
80
+ stroke-dashoffset: 69;
81
+ }
82
+ circle:first-child { animation: ap-loader-24 1.5s cubic-bezier(0.42, 0, 0.78, 1) infinite; }
83
+ circle:last-child { animation: ap-loader-24 1.5s cubic-bezier(0.42, 0, 0.58, 1) infinite; }
84
+ }
85
+
86
+ &.size-30 {
87
+ width: 30px;
88
+ height: 30px;
89
+ circle {
90
+ r: 12.5px;
91
+ stroke-width: 5;
92
+ stroke-dasharray: 78;
93
+ stroke-dashoffset: 84;
94
+ }
95
+ circle:first-child { animation: ap-loader-30 1.5s cubic-bezier(0.42, 0, 0.78, 1) infinite; }
96
+ circle:last-child { animation: ap-loader-30 1.5s cubic-bezier(0.42, 0, 0.58, 1) infinite; }
97
+ }
98
+
99
+ &.size-48 {
100
+ width: 48px;
101
+ height: 48px;
102
+ circle {
103
+ r: 20.5px;
104
+ stroke-width: 7;
105
+ stroke-dasharray: 128;
106
+ stroke-dashoffset: 131;
107
+ }
108
+ circle:first-child { animation: ap-loader-48 1.5s cubic-bezier(0.42, 0, 0.78, 1) infinite; }
109
+ circle:last-child { animation: ap-loader-48 1.5s cubic-bezier(0.42, 0, 0.58, 1) infinite; }
110
+ }
111
+
112
+ &.size-60 {
113
+ width: 60px;
114
+ height: 60px;
115
+ circle {
116
+ r: 26px;
117
+ stroke-width: 8;
118
+ stroke-dasharray: 163;
119
+ stroke-dashoffset: 166;
120
+ }
121
+ circle:first-child { animation: ap-loader-60 1.5s cubic-bezier(0.42, 0, 0.78, 1) infinite; }
122
+ circle:last-child { animation: ap-loader-60 1.5s cubic-bezier(0.42, 0, 0.58, 1) infinite; }
123
+ }
124
+ }
125
+
126
+ // Keyframes per size — exact Angular stroke-dashoffset values
127
+ // 0%: full dashoffset (invisible) → 50%: ~55% mark (arc visible) → 100%: back to full + 630deg rotation
128
+
129
+ @keyframes ap-loader-16 {
130
+ 0% { stroke-dashoffset: 47; }
131
+ 50% { stroke-dashoffset: 25; }
132
+ 100% { stroke-dashoffset: 47; transform: rotate(630deg); }
133
+ }
134
+
135
+ @keyframes ap-loader-24 {
136
+ 0% { stroke-dashoffset: 69; }
137
+ 50% { stroke-dashoffset: 37; }
138
+ 100% { stroke-dashoffset: 69; transform: rotate(630deg); }
139
+ }
140
+
141
+ @keyframes ap-loader-30 {
142
+ 0% { stroke-dashoffset: 84; }
143
+ 50% { stroke-dashoffset: 46; }
144
+ 100% { stroke-dashoffset: 84; transform: rotate(630deg); }
145
+ }
146
+
147
+ @keyframes ap-loader-48 {
148
+ 0% { stroke-dashoffset: 131; }
149
+ 50% { stroke-dashoffset: 72; }
150
+ 100% { stroke-dashoffset: 131; transform: rotate(630deg); }
151
+ }
152
+
153
+ @keyframes ap-loader-60 {
154
+ 0% { stroke-dashoffset: 166; }
155
+ 50% { stroke-dashoffset: 91; }
156
+ 100% { stroke-dashoffset: 166; transform: rotate(630deg); }
157
+ }
158
+
159
+ // Loader container for centered display
160
+ .ap-loader-container {
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: center;
164
+ }
165
+
166
+ // Full page loader overlay
167
+ .ap-loader-overlay {
168
+ position: fixed;
169
+ top: 0;
170
+ left: 0;
171
+ right: 0;
172
+ bottom: 0;
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ background: rgba(255, 255, 255, 0.8);
177
+ z-index: 9999;
178
+ }
@@ -0,0 +1,50 @@
1
+ // Shared mixins for css-ui components
2
+
3
+ // Focus ring standard
4
+ @mixin focus-ring {
5
+ outline: 2px solid var(--ref-color-electric-blue-100);
6
+ outline-offset: 1px;
7
+ }
8
+
9
+ // Focus ring with 3px width (checkbox, radio)
10
+ @mixin focus-ring-3px {
11
+ outline: 3px solid var(--ref-color-electric-blue-100);
12
+ outline-offset: 1px;
13
+ }
14
+
15
+ // Visually hidden, accessible to screen readers
16
+ @mixin sr-only {
17
+ position: absolute;
18
+ clip: rect(0, 0, 0, 0);
19
+ width: 1px;
20
+ height: 1px;
21
+ margin: -1px;
22
+ padding: 0;
23
+ border: 0;
24
+ overflow: hidden;
25
+ }
26
+
27
+ // Truncate text with ellipsis
28
+ @mixin truncate {
29
+ white-space: nowrap;
30
+ overflow: hidden;
31
+ text-overflow: ellipsis;
32
+ }
33
+
34
+ // Fixed size (width + height + min + max)
35
+ @mixin fixed-size($size) {
36
+ width: $size;
37
+ height: $size;
38
+ min-width: $size;
39
+ min-height: $size;
40
+ max-width: $size;
41
+ max-height: $size;
42
+ }
43
+
44
+ // Text-style shorthand
45
+ @mixin text-style($name) {
46
+ font-family: var(--sys-text-style-#{$name}-font-family);
47
+ font-size: var(--sys-text-style-#{$name}-size);
48
+ font-weight: var(--sys-text-style-#{$name}-weight);
49
+ line-height: var(--sys-text-style-#{$name}-line-height);
50
+ }