@atelier-ui/react 0.1.10 → 0.1.11

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.
@@ -0,0 +1,85 @@
1
+ /* Menu panel */
2
+ .llm-menu {
3
+ display: block;
4
+ min-width: 12rem;
5
+ padding: var(--ui-spacing-2) 0;
6
+ background: var(--ui-color-surface-raised);
7
+ border: 1px solid var(--ui-color-border);
8
+ border-radius: var(--ui-radius-lg);
9
+ box-shadow: var(--ui-shadow-lg);
10
+ font-family: var(--ui-font-family);
11
+ font-size: var(--ui-font-size-md);
12
+ color: var(--ui-color-text);
13
+ outline: none;
14
+ overflow: hidden;
15
+
16
+ /* Entry animation */
17
+ animation: llm-menu-enter var(--ui-duration-normal) var(--ui-ease-out) forwards;
18
+ }
19
+
20
+ .llm-menu.variant-compact {
21
+ font-size: var(--ui-font-size-sm);
22
+ padding: var(--ui-spacing-1) 0;
23
+ }
24
+
25
+ .llm-menu.variant-compact .llm-menu-item {
26
+ min-height: 2rem;
27
+ padding: var(--ui-spacing-1) var(--ui-spacing-3);
28
+ }
29
+
30
+ @keyframes llm-menu-enter {
31
+ from {
32
+ opacity: 0;
33
+ transform: translateY(-4px);
34
+ }
35
+ to {
36
+ opacity: 1;
37
+ transform: translateY(0);
38
+ }
39
+ }
40
+
41
+ /* Menu item */
42
+ .llm-menu-item {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: var(--ui-spacing-3);
46
+ min-height: 2.25rem;
47
+ padding: var(--ui-spacing-2) var(--ui-spacing-4);
48
+ cursor: pointer;
49
+ color: var(--ui-color-text);
50
+ transition: background var(--ui-transition-fast);
51
+ outline: none;
52
+ border: none;
53
+ background: none;
54
+ font: inherit;
55
+ width: 100%;
56
+ text-align: start;
57
+ }
58
+
59
+ .llm-menu-item:hover,
60
+ .llm-menu-item:focus-visible {
61
+ background: var(--ui-color-surface-sunken);
62
+ }
63
+
64
+ .llm-menu-item.is-disabled {
65
+ opacity: var(--ui-opacity-disabled);
66
+ cursor: not-allowed;
67
+ }
68
+
69
+ /* Separator */
70
+ .llm-menu-separator {
71
+ display: block;
72
+ height: 1px;
73
+ margin: var(--ui-spacing-2) 0;
74
+ background: var(--ui-color-border);
75
+ border: none;
76
+ }
77
+
78
+ /* Trigger panel — positioned absolutely below trigger */
79
+ .llm-menu-panel {
80
+ position: absolute;
81
+ z-index: var(--ui-z-dropdown, 100);
82
+ top: calc(100% + var(--ui-spacing-2));
83
+ left: 0;
84
+ min-width: 100%;
85
+ }
@@ -0,0 +1,80 @@
1
+ .llm-pagination {
2
+ display: block;
3
+ font-family: var(--ui-font-family);
4
+ }
5
+
6
+ .page-list {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ align-items: center;
10
+ gap: var(--ui-spacing-2);
11
+ list-style: none;
12
+ margin: 0;
13
+ padding: 0;
14
+ }
15
+
16
+ /* Page button */
17
+ .page-btn {
18
+ all: unset;
19
+ display: inline-flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ min-width: 2.25rem;
23
+ height: 2.25rem;
24
+ padding: 0 var(--ui-spacing-2);
25
+ border-radius: var(--ui-radius-md);
26
+ border: 1px solid transparent;
27
+ background: transparent;
28
+ color: var(--ui-color-text);
29
+ font-size: var(--ui-font-size-sm);
30
+ font-weight: var(--ui-font-weight-medium);
31
+ cursor: pointer;
32
+ user-select: none;
33
+ transition:
34
+ background-color var(--ui-transition-fast),
35
+ border-color var(--ui-transition-fast),
36
+ color var(--ui-transition-fast);
37
+ }
38
+
39
+ .page-btn:hover:not(:disabled) {
40
+ background-color: var(--ui-color-surface-sunken);
41
+ color: var(--ui-color-text);
42
+ }
43
+
44
+ .page-btn:focus-visible {
45
+ outline: none;
46
+ box-shadow: var(--ui-focus-ring);
47
+ }
48
+
49
+ /* Active (current) page — primary fill */
50
+ .page-btn.is-active {
51
+ background-color: var(--ui-color-primary);
52
+ border-color: var(--ui-color-primary);
53
+ color: var(--ui-color-text-on-primary);
54
+ font-weight: var(--ui-font-weight-semibold);
55
+ }
56
+
57
+ .page-btn.is-active:hover {
58
+ background-color: var(--ui-color-primary-hover);
59
+ border-color: var(--ui-color-primary-hover);
60
+ }
61
+
62
+ /* Disabled */
63
+ .page-btn.is-disabled,
64
+ .page-btn:disabled {
65
+ opacity: var(--ui-opacity-disabled);
66
+ pointer-events: none;
67
+ cursor: default;
68
+ }
69
+
70
+ /* Ellipsis */
71
+ .ellipsis {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ justify-content: center;
75
+ min-width: 2.25rem;
76
+ height: 2.25rem;
77
+ color: var(--ui-color-text-muted);
78
+ font-size: var(--ui-font-size-sm);
79
+ user-select: none;
80
+ }
@@ -0,0 +1,69 @@
1
+ .llm-progress {
2
+ display: block;
3
+ width: 100%;
4
+ font-family: var(--ui-font-family);
5
+ }
6
+
7
+ .track {
8
+ position: relative;
9
+ width: 100%;
10
+ border-radius: var(--ui-radius-full);
11
+ background-color: var(--ui-color-surface-sunken);
12
+ overflow: hidden;
13
+ }
14
+
15
+ /* Size variants — modernised for visibility (sm was 4px → 6px) */
16
+ .llm-progress.size-sm .track {
17
+ height: 6px;
18
+ }
19
+
20
+ .llm-progress.size-md .track {
21
+ height: 10px;
22
+ }
23
+
24
+ .llm-progress.size-lg .track {
25
+ height: 14px;
26
+ }
27
+
28
+ /* Fill */
29
+ .fill {
30
+ height: 100%;
31
+ border-radius: var(--ui-radius-full);
32
+ background-color: var(--ui-color-primary);
33
+ transition: width var(--ui-transition-normal);
34
+ }
35
+
36
+ /* Color variants */
37
+ .llm-progress.variant-success .fill {
38
+ background-color: var(--ui-color-success);
39
+ }
40
+
41
+ .llm-progress.variant-warning .fill {
42
+ background-color: var(--ui-color-warning);
43
+ }
44
+
45
+ .llm-progress.variant-danger .fill {
46
+ background-color: var(--ui-color-danger);
47
+ }
48
+
49
+ /* Indeterminate animation */
50
+ @keyframes progress-indeterminate {
51
+ 0% {
52
+ transform: translateX(-150%);
53
+ }
54
+ 100% {
55
+ transform: translateX(350%);
56
+ }
57
+ }
58
+
59
+ .llm-progress.is-indeterminate .fill {
60
+ width: 40% !important;
61
+ animation: progress-indeterminate 1.4s var(--ui-ease-in-out) infinite;
62
+ }
63
+
64
+ @media (prefers-reduced-motion: reduce) {
65
+ .llm-progress.is-indeterminate .fill {
66
+ animation: none;
67
+ opacity: 0.5;
68
+ }
69
+ }
@@ -0,0 +1,78 @@
1
+ .llm-radio {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: var(--ui-spacing-3);
5
+ cursor: pointer;
6
+ user-select: none;
7
+ color: var(--ui-color-text);
8
+ line-height: var(--ui-line-height-normal);
9
+ font-family: var(--ui-font-family);
10
+ font-size: var(--ui-font-size-md);
11
+ padding: var(--ui-spacing-1) 0;
12
+ min-height: 1.5rem;
13
+ transition: color var(--ui-transition-fast);
14
+ }
15
+
16
+ .llm-radio:hover:not(.is-disabled) {
17
+ color: var(--ui-color-primary);
18
+ }
19
+
20
+ .llm-radio input[type='radio'] {
21
+ appearance: none;
22
+ -webkit-appearance: none;
23
+ flex-shrink: 0;
24
+ width: 1.25rem;
25
+ height: 1.25rem;
26
+ border: 1.5px solid var(--ui-color-border-strong);
27
+ border-radius: 50%;
28
+ background-color: var(--ui-color-input-bg);
29
+ cursor: pointer;
30
+ position: relative;
31
+ transition: border-color var(--ui-transition-fast),
32
+ border-width var(--ui-transition-fast) var(--ui-ease-out),
33
+ background-color var(--ui-transition-fast),
34
+ box-shadow var(--ui-transition-fast);
35
+ outline: none;
36
+ margin: 0;
37
+ }
38
+
39
+ .llm-radio:hover input[type='radio']:not(:disabled) {
40
+ border-color: var(--ui-color-primary);
41
+ }
42
+
43
+ .llm-radio input[type='radio']:focus-visible {
44
+ box-shadow: var(--ui-focus-ring);
45
+ border-color: var(--ui-color-primary);
46
+ }
47
+
48
+ /* Checked state — thick inner ring */
49
+ .llm-radio input[type='radio']:checked {
50
+ border-color: var(--ui-color-primary);
51
+ border-width: 6px;
52
+ }
53
+
54
+ /* Invalid state */
55
+ .llm-radio.is-invalid input[type='radio'] {
56
+ border-color: var(--ui-color-input-border-invalid);
57
+ }
58
+
59
+ .llm-radio.is-invalid:hover input[type='radio'] {
60
+ border-color: var(--ui-color-danger-hover);
61
+ }
62
+
63
+ .llm-radio.is-invalid input[type='radio']:focus-visible {
64
+ border-color: var(--ui-color-input-border-invalid);
65
+ box-shadow: 0 0 0 2px var(--ui-color-surface), 0 0 0 4px var(--ui-color-danger);
66
+ }
67
+
68
+ /* Disabled state */
69
+ .llm-radio.is-disabled {
70
+ opacity: var(--ui-opacity-disabled);
71
+ cursor: not-allowed;
72
+ color: var(--ui-color-text-muted);
73
+ }
74
+
75
+ .llm-radio.is-disabled input[type='radio'] {
76
+ cursor: not-allowed;
77
+ border-color: var(--ui-color-border);
78
+ }
@@ -0,0 +1,31 @@
1
+ .llm-radio-group {
2
+ display: flex;
3
+ font-family: var(--ui-font-family);
4
+ gap: var(--ui-spacing-3);
5
+ }
6
+
7
+ .llm-radio-group.orientation-vertical {
8
+ flex-direction: column;
9
+ }
10
+
11
+ .llm-radio-group.orientation-horizontal {
12
+ flex-direction: row;
13
+ flex-wrap: wrap;
14
+ }
15
+
16
+ .llm-radio-group.is-disabled {
17
+ opacity: var(--ui-opacity-disabled);
18
+ cursor: not-allowed;
19
+ }
20
+
21
+ /* Error messages */
22
+ .llm-radio-group .errors {
23
+ margin-top: var(--ui-spacing-2);
24
+ }
25
+
26
+ .llm-radio-group .error-message {
27
+ margin: 0;
28
+ font-size: var(--ui-font-size-sm);
29
+ color: var(--ui-color-error-text);
30
+ line-height: var(--ui-line-height-normal);
31
+ }
@@ -0,0 +1,83 @@
1
+ .llm-select {
2
+ display: inline-block;
3
+ position: relative;
4
+ font-family: var(--ui-font-family);
5
+ font-size: var(--ui-font-size-md);
6
+ }
7
+
8
+ .llm-select label {
9
+ display: block;
10
+ margin-bottom: var(--ui-spacing-2);
11
+ font-size: var(--ui-font-size-sm);
12
+ color: var(--ui-color-text);
13
+ font-weight: var(--ui-font-weight-medium);
14
+ }
15
+
16
+ /* Select wrapper — holds native select + arrow icon */
17
+ .llm-select .select-wrapper {
18
+ position: relative;
19
+ display: flex;
20
+ align-items: center;
21
+ }
22
+
23
+ .llm-select select {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ width: 100%;
28
+ min-height: 2.5rem;
29
+ padding: 0.625rem var(--ui-spacing-4);
30
+ padding-inline-end: calc(var(--ui-spacing-4) + 1.25rem);
31
+ background: var(--ui-color-input-bg);
32
+ border: 1px solid var(--ui-color-input-border);
33
+ border-radius: var(--ui-radius-md);
34
+ color: var(--ui-color-text);
35
+ font-family: inherit;
36
+ font-size: inherit;
37
+ cursor: pointer;
38
+ appearance: none;
39
+ -webkit-appearance: none;
40
+ transition:
41
+ border-color var(--ui-transition-fast),
42
+ box-shadow var(--ui-transition-fast),
43
+ background-color var(--ui-transition-fast);
44
+ }
45
+
46
+ .llm-select select:hover:not(:disabled) {
47
+ border-color: var(--ui-color-input-border-hover);
48
+ }
49
+
50
+ .llm-select select:focus-visible {
51
+ outline: none;
52
+ box-shadow: var(--ui-focus-ring);
53
+ border-color: var(--ui-color-input-border-focus);
54
+ }
55
+
56
+ .llm-select select:disabled {
57
+ opacity: var(--ui-opacity-disabled);
58
+ cursor: not-allowed;
59
+ }
60
+
61
+ .llm-select.is-invalid select {
62
+ border-color: var(--ui-color-input-border-invalid);
63
+ }
64
+
65
+ /* Arrow icon */
66
+ .llm-select .select-arrow {
67
+ position: absolute;
68
+ inset-inline-end: var(--ui-spacing-4);
69
+ pointer-events: none;
70
+ font-size: var(--ui-font-size-xs);
71
+ color: var(--ui-color-text-muted);
72
+ }
73
+
74
+ /* Error display */
75
+ .llm-select .errors {
76
+ margin-top: var(--ui-spacing-2);
77
+ }
78
+
79
+ .llm-select .error-message {
80
+ margin: 0;
81
+ font-size: var(--ui-font-size-sm);
82
+ color: var(--ui-color-error-text);
83
+ }
@@ -0,0 +1,51 @@
1
+ .llm-skeleton {
2
+ display: block;
3
+ background: var(--ui-color-border);
4
+ overflow: hidden;
5
+ position: relative;
6
+ }
7
+
8
+ /* Variant shapes */
9
+ .llm-skeleton.variant-text {
10
+ border-radius: var(--ui-radius-sm);
11
+ }
12
+
13
+ .llm-skeleton.variant-circular {
14
+ border-radius: var(--ui-radius-full, 9999px);
15
+ }
16
+
17
+ .llm-skeleton.variant-rectangular {
18
+ border-radius: var(--ui-radius-md);
19
+ }
20
+
21
+ /* Shimmer animation — uses currentColor-aware overlay so it reads on
22
+ * both light and dark surfaces (was hardcoded white at 0.3 alpha,
23
+ * which only showed on dark backgrounds). */
24
+ .llm-skeleton.is-animated::after {
25
+ content: '';
26
+ position: absolute;
27
+ inset: 0;
28
+ background: linear-gradient(
29
+ 90deg,
30
+ transparent 0%,
31
+ color-mix(in srgb, var(--ui-color-surface-raised) 80%, transparent) 50%,
32
+ transparent 100%
33
+ );
34
+ animation: shimmer 1.5s infinite;
35
+ }
36
+
37
+ @keyframes shimmer {
38
+ 0% {
39
+ transform: translateX(-100%);
40
+ }
41
+ 100% {
42
+ transform: translateX(100%);
43
+ }
44
+ }
45
+
46
+ /* Respect reduced motion */
47
+ @media (prefers-reduced-motion: reduce) {
48
+ .llm-skeleton.is-animated::after {
49
+ animation: none;
50
+ }
51
+ }
@@ -0,0 +1,171 @@
1
+ .llm-stepper {
2
+ display: block;
3
+ font-family: var(--ui-font-family);
4
+ }
5
+
6
+ /* ─── Header ─── */
7
+ .stepper-header {
8
+ display: flex;
9
+ align-items: center;
10
+ }
11
+
12
+ /* ─── Step item ─── */
13
+ .step-item {
14
+ display: flex;
15
+ flex-direction: column;
16
+ align-items: center;
17
+ min-width: 0;
18
+ }
19
+
20
+ /* ─── Connector ─── */
21
+ .step-connector {
22
+ flex: 1;
23
+ height: 2px;
24
+ background: var(--ui-color-border);
25
+ border-radius: var(--ui-radius-full);
26
+ transition: background var(--ui-transition-normal) var(--ui-ease-out);
27
+ min-width: var(--ui-spacing-4);
28
+ }
29
+
30
+ .step-connector.is-active {
31
+ background: var(--ui-color-primary);
32
+ }
33
+
34
+ /* ─── Step circle button ─── */
35
+ .step-circle {
36
+ all: unset;
37
+ box-sizing: border-box;
38
+ display: inline-flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ width: 36px;
42
+ height: 36px;
43
+ border-radius: 50%;
44
+ border: 2px solid var(--ui-color-border);
45
+ background: var(--ui-color-surface);
46
+ color: var(--ui-color-text-muted);
47
+ font-size: var(--ui-font-size-sm);
48
+ font-weight: var(--ui-font-weight-semibold);
49
+ cursor: pointer;
50
+ transition: var(--ui-transition-normal) var(--ui-ease-out);
51
+ transition-property: border-color, background-color, color, box-shadow;
52
+ user-select: none;
53
+ flex-shrink: 0;
54
+ }
55
+
56
+ .step-circle:focus-visible {
57
+ outline: none;
58
+ box-shadow: var(--ui-focus-ring);
59
+ }
60
+
61
+ .step-circle:disabled {
62
+ cursor: not-allowed;
63
+ }
64
+
65
+ /* ─── Step text ─── */
66
+ .step-text {
67
+ display: flex;
68
+ flex-direction: column;
69
+ align-items: center;
70
+ margin-top: var(--ui-spacing-2);
71
+ text-align: center;
72
+ }
73
+
74
+ .step-label {
75
+ font-size: var(--ui-font-size-sm);
76
+ font-weight: var(--ui-font-weight-medium);
77
+ color: var(--ui-color-text-muted);
78
+ white-space: nowrap;
79
+ }
80
+
81
+ .step-description {
82
+ font-size: var(--ui-font-size-xs);
83
+ color: var(--ui-color-text-muted);
84
+ margin-top: 2px;
85
+ }
86
+
87
+ .step-optional {
88
+ font-size: var(--ui-font-size-xs);
89
+ color: var(--ui-color-text-muted);
90
+ font-style: italic;
91
+ margin-top: 2px;
92
+ }
93
+
94
+ /* ─── Content ─── */
95
+ .stepper-content {
96
+ margin-top: var(--ui-spacing-6);
97
+ }
98
+
99
+ .stepper-content [role="tabpanel"][hidden] {
100
+ display: none;
101
+ }
102
+
103
+ /* ─── Active state ─── */
104
+ .step-item.is-active .step-circle {
105
+ border-color: var(--ui-color-primary);
106
+ color: var(--ui-color-primary);
107
+ }
108
+
109
+ .step-item.is-active .step-label {
110
+ color: var(--ui-color-text);
111
+ font-weight: var(--ui-font-weight-semibold);
112
+ }
113
+
114
+ /* ─── Completed state ─── */
115
+ .step-item.is-completed .step-circle {
116
+ border-color: var(--ui-color-primary);
117
+ background: var(--ui-color-primary);
118
+ color: var(--ui-color-text-on-primary);
119
+ }
120
+
121
+ .step-item.is-completed .step-label {
122
+ color: var(--ui-color-text);
123
+ }
124
+
125
+ /* ─── Error state ─── */
126
+ .step-item.is-error .step-circle {
127
+ border-color: var(--ui-color-danger);
128
+ background: var(--ui-color-danger);
129
+ color: var(--ui-color-text-on-danger, #ffffff);
130
+ }
131
+
132
+ .step-item.is-error .step-label {
133
+ color: var(--ui-color-danger);
134
+ }
135
+
136
+ /* ─── Disabled state ─── */
137
+ .step-item.is-disabled .step-circle {
138
+ opacity: var(--ui-opacity-disabled);
139
+ cursor: not-allowed;
140
+ }
141
+
142
+ .step-item.is-disabled .step-label {
143
+ opacity: var(--ui-opacity-disabled);
144
+ }
145
+
146
+ /* ─── Vertical orientation ─── */
147
+ .llm-stepper.orientation-vertical .stepper-header {
148
+ flex-direction: column;
149
+ align-items: stretch;
150
+ }
151
+
152
+ .llm-stepper.orientation-vertical .step-item {
153
+ flex-direction: row;
154
+ align-items: flex-start;
155
+ gap: var(--ui-spacing-3);
156
+ }
157
+
158
+ .llm-stepper.orientation-vertical .step-text {
159
+ align-items: flex-start;
160
+ text-align: left;
161
+ margin-top: 0;
162
+ padding-top: var(--ui-spacing-1);
163
+ }
164
+
165
+ .llm-stepper.orientation-vertical .step-connector {
166
+ flex: none;
167
+ width: 2px;
168
+ height: var(--ui-spacing-6);
169
+ margin-left: 17px;
170
+ min-width: 0;
171
+ }