@atelier-ui/react 0.1.9 → 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.
Files changed (35) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/package.json +1 -1
  3. package/src/lib/accordion/llm-accordion.css +120 -0
  4. package/src/lib/alert/llm-alert.css +80 -0
  5. package/src/lib/avatar/llm-avatar.css +106 -0
  6. package/src/lib/badge/llm-badge.css +60 -0
  7. package/src/lib/breadcrumbs/llm-breadcrumbs.css +62 -0
  8. package/src/lib/button/llm-button.css +139 -0
  9. package/src/lib/card/llm-card.css +70 -0
  10. package/src/lib/chat/llm-chat.css +446 -0
  11. package/src/lib/checkbox/llm-checkbox.css +123 -0
  12. package/src/lib/code-block/llm-code-block.css +112 -0
  13. package/src/lib/combobox/llm-combobox.css +169 -0
  14. package/src/lib/dialog/llm-dialog.css +174 -0
  15. package/src/lib/drawer/llm-drawer.css +228 -0
  16. package/src/lib/icon/llm-icon.css +29 -0
  17. package/src/lib/input/llm-input.css +94 -0
  18. package/src/lib/menu/llm-menu.css +85 -0
  19. package/src/lib/pagination/llm-pagination.css +80 -0
  20. package/src/lib/progress/llm-progress.css +69 -0
  21. package/src/lib/radio/llm-radio.css +78 -0
  22. package/src/lib/radio-group/llm-radio-group.css +31 -0
  23. package/src/lib/select/llm-select.css +83 -0
  24. package/src/lib/skeleton/llm-skeleton.css +51 -0
  25. package/src/lib/spec.d.ts +2 -2
  26. package/src/lib/spec.d.ts.map +1 -1
  27. package/src/lib/spec.js.map +1 -1
  28. package/src/lib/stepper/llm-stepper.css +171 -0
  29. package/src/lib/table/llm-table.css +200 -0
  30. package/src/lib/tabs/llm-tabs.css +120 -0
  31. package/src/lib/textarea/llm-textarea.css +100 -0
  32. package/src/lib/toast/llm-toast.css +137 -0
  33. package/src/lib/toggle/llm-toggle.css +118 -0
  34. package/src/lib/tooltip/llm-tooltip.css +80 -0
  35. package/styles/tokens.css +346 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## 0.1.11 (2026-07-10)
2
+
3
+ ### 🩹 Fixes
4
+
5
+ - **build:** ship component CSS + tokens.css in packages ([10d19ad](https://github.com/DominikPieper/atelier-ui/commit/10d19ad))
6
+ - **tokens:** dark-mode on-success fg + light-theme symmetry ([#4](https://github.com/DominikPieper/atelier-ui/issues/4), [#0](https://github.com/DominikPieper/atelier-ui/issues/0))
7
+
8
+ ### ❤️ Thank You
9
+
10
+ - Claude Fable 5
11
+ - Dominik Pieper @DominikPieper
12
+
13
+ ## 0.1.10 (2026-07-06)
14
+
15
+ ### 🚀 Features
16
+
17
+ - **a11y:** cross-framework a11y-tree conformance gate (ADR-0025) ([ebf980d](https://github.com/DominikPieper/atelier-ui/commit/ebf980d))
18
+
19
+ ### ❤️ Thank You
20
+
21
+ - Claude Fable 5
22
+ - Dominik Pieper @DominikPieper
23
+
1
24
  ## 0.1.9 (2026-06-12)
2
25
 
3
26
  ### 🩹 Fixes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atelier-ui/react",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Atelier component library for React — LLM-optimised, accessible, design-token-driven",
5
5
  "keywords": [
6
6
  "react",
@@ -0,0 +1,120 @@
1
+ /* ── AccordionGroup ──────────────────────────────────────────────────────── */
2
+ .llm-accordion-group {
3
+ display: block;
4
+ font-family: var(--ui-font-family);
5
+ color: var(--ui-color-text);
6
+ }
7
+
8
+ /* ── Default variant — shared borders between items ──────────────────────── */
9
+ .llm-accordion-group.variant-default {
10
+ border-top: 1px solid var(--ui-color-border);
11
+ }
12
+
13
+ .llm-accordion-group.variant-default .llm-accordion-item {
14
+ border-bottom: 1px solid var(--ui-color-border);
15
+ }
16
+
17
+ /* ── Bordered variant — outer border + radius ────────────────────────────── */
18
+ .llm-accordion-group.variant-bordered {
19
+ border: 1px solid var(--ui-color-border);
20
+ border-radius: var(--ui-radius-lg);
21
+ overflow: hidden;
22
+ }
23
+
24
+ .llm-accordion-group.variant-bordered .llm-accordion-item:not(:last-child) {
25
+ border-bottom: 1px solid var(--ui-color-border);
26
+ }
27
+
28
+ /* ── Separated variant — card-like items with gap ────────────────────────── */
29
+ .llm-accordion-group.variant-separated {
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: var(--ui-spacing-2);
33
+ }
34
+
35
+ .llm-accordion-group.variant-separated .llm-accordion-item {
36
+ border: 1px solid var(--ui-color-border);
37
+ border-radius: var(--ui-radius-lg);
38
+ overflow: hidden;
39
+ }
40
+
41
+ /* ── AccordionItem ──────────────────────────────────────────────────────────── */
42
+ .llm-accordion-item {
43
+ display: block;
44
+ }
45
+
46
+ /* ── Heading reset ─────────────────────────────────────────────────────────── */
47
+ .accordion-heading {
48
+ all: unset;
49
+ display: block;
50
+ }
51
+
52
+ /* ── Trigger button ────────────────────────────────────────────────────────── */
53
+ .accordion-trigger {
54
+ all: unset;
55
+ box-sizing: border-box;
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: space-between;
59
+ gap: var(--ui-spacing-3);
60
+ width: 100%;
61
+ min-height: 3.25rem;
62
+ padding: var(--ui-spacing-4) var(--ui-spacing-5);
63
+ font-size: var(--ui-font-size-md);
64
+ font-weight: var(--ui-font-weight-semibold);
65
+ color: var(--ui-color-text);
66
+ cursor: pointer;
67
+ transition: background-color var(--ui-transition-fast);
68
+ user-select: none;
69
+ }
70
+
71
+ .accordion-trigger:hover:not(.is-disabled) {
72
+ background: var(--ui-color-surface-sunken);
73
+ }
74
+
75
+ .accordion-trigger:focus-visible {
76
+ outline: none;
77
+ box-shadow: var(--ui-focus-ring);
78
+ position: relative;
79
+ z-index: 1;
80
+ }
81
+
82
+ .accordion-trigger.is-disabled {
83
+ opacity: var(--ui-opacity-disabled);
84
+ cursor: not-allowed;
85
+ }
86
+
87
+ /* ── Chevron icon ──────────────────────────────────────────────────────────── */
88
+ .chevron {
89
+ flex-shrink: 0;
90
+ color: var(--ui-color-text-muted);
91
+ transition: transform var(--ui-duration-normal) var(--ui-ease-out);
92
+ }
93
+
94
+ .chevron.is-expanded {
95
+ transform: rotate(180deg);
96
+ }
97
+
98
+ /* ── Collapsible panel wrapper — CSS grid height animation ─────────────────── */
99
+ .accordion-panel-wrapper {
100
+ display: grid;
101
+ grid-template-rows: 0fr;
102
+ transition: grid-template-rows var(--ui-duration-normal) var(--ui-ease-out);
103
+ }
104
+
105
+ .accordion-panel-wrapper.is-expanded {
106
+ grid-template-rows: 1fr;
107
+ }
108
+
109
+ /* ── Inner panel ───────────────────────────────────────────────────────────── */
110
+ .accordion-panel {
111
+ overflow: hidden;
112
+ }
113
+
114
+ .accordion-panel-wrapper.is-expanded .accordion-panel {
115
+ padding: 0 var(--ui-spacing-5) var(--ui-spacing-5);
116
+ }
117
+
118
+ .accordion-panel-wrapper:not(.is-expanded) .accordion-panel {
119
+ padding: 0 var(--ui-spacing-5);
120
+ }
@@ -0,0 +1,80 @@
1
+ .llm-alert {
2
+ display: flex;
3
+ align-items: flex-start;
4
+ gap: var(--ui-spacing-3);
5
+ padding: var(--ui-spacing-4) var(--ui-spacing-5);
6
+ border-radius: var(--ui-radius-lg);
7
+ border: 1px solid transparent;
8
+ font-family: var(--ui-font-family);
9
+ font-size: var(--ui-font-size-sm);
10
+ line-height: var(--ui-line-height-normal);
11
+ box-sizing: border-box;
12
+ width: 100%;
13
+ }
14
+
15
+ .llm-alert .content {
16
+ flex: 1;
17
+ }
18
+
19
+ /* Variants — semantic-tinted bg + matching text + faint border. */
20
+ .llm-alert.variant-info {
21
+ background-color: var(--ui-color-info-bg);
22
+ color: var(--ui-color-info-text);
23
+ border-color: color-mix(in srgb, var(--ui-color-info-text) 20%, transparent);
24
+ }
25
+
26
+ .llm-alert.variant-success {
27
+ background-color: var(--ui-color-success-bg);
28
+ color: var(--ui-color-success-text);
29
+ border-color: color-mix(in srgb, var(--ui-color-success-text) 20%, transparent);
30
+ }
31
+
32
+ .llm-alert.variant-warning {
33
+ background-color: var(--ui-color-warning-bg);
34
+ color: var(--ui-color-warning-text);
35
+ border-color: color-mix(in srgb, var(--ui-color-warning-text) 20%, transparent);
36
+ }
37
+
38
+ .llm-alert.variant-danger {
39
+ background-color: var(--ui-color-danger-bg);
40
+ color: var(--ui-color-danger-text);
41
+ border-color: color-mix(in srgb, var(--ui-color-danger-text) 20%, transparent);
42
+ }
43
+
44
+ /* Dismiss button */
45
+ .llm-alert .dismiss {
46
+ display: inline-flex;
47
+ align-items: center;
48
+ justify-content: center;
49
+ flex-shrink: 0;
50
+ width: 1.75rem;
51
+ height: 1.75rem;
52
+ padding: 0;
53
+ background: transparent;
54
+ border: none;
55
+ border-radius: var(--ui-radius-sm);
56
+ cursor: pointer;
57
+ color: inherit;
58
+ opacity: 0.7;
59
+ transition: opacity var(--ui-transition-fast), background-color var(--ui-transition-fast);
60
+ line-height: 1;
61
+ }
62
+
63
+ .llm-alert .dismiss:hover {
64
+ opacity: 1;
65
+ background-color: color-mix(in srgb, currentColor 10%, transparent);
66
+ }
67
+
68
+ .llm-alert .dismiss:focus-visible {
69
+ outline: none;
70
+ box-shadow: var(--ui-focus-ring);
71
+ opacity: 1;
72
+ }
73
+
74
+ /* Semantic indicator glyph — non-color differentiation (WCAG 1.4.1). */
75
+ .llm-alert .content .variant-icon {
76
+ display: inline-block;
77
+ font-weight: 700;
78
+ margin-right: 0.4em;
79
+ line-height: 1;
80
+ }
@@ -0,0 +1,106 @@
1
+ /* === LlmAvatar === */
2
+
3
+ .llm-avatar {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ position: relative;
8
+ overflow: hidden;
9
+ flex-shrink: 0;
10
+ font-family: var(--ui-font-family);
11
+ font-weight: var(--ui-font-weight-semibold);
12
+ background-color: color-mix(in srgb, var(--ui-color-primary) 12%, var(--ui-color-surface-sunken));
13
+ color: var(--ui-color-primary);
14
+ user-select: none;
15
+ }
16
+
17
+ /* Sizes */
18
+ .llm-avatar.size-xs { width: 24px; height: 24px; font-size: 0.625rem; }
19
+ .llm-avatar.size-sm { width: 32px; height: 32px; font-size: var(--ui-font-size-xs); }
20
+ .llm-avatar.size-md { width: 40px; height: 40px; font-size: var(--ui-font-size-sm); }
21
+ .llm-avatar.size-lg { width: 48px; height: 48px; font-size: var(--ui-font-size-md); }
22
+ .llm-avatar.size-xl { width: 64px; height: 64px; font-size: var(--ui-font-size-lg); }
23
+
24
+ /* Shapes */
25
+ .llm-avatar.shape-circle { border-radius: var(--ui-radius-full); }
26
+ .llm-avatar.shape-square { border-radius: var(--ui-radius-md); }
27
+
28
+ /* Image */
29
+ .llm-avatar img {
30
+ width: 100%;
31
+ height: 100%;
32
+ object-fit: cover;
33
+ display: block;
34
+ }
35
+
36
+ /* Initials */
37
+ .llm-avatar .initials {
38
+ line-height: 1;
39
+ letter-spacing: 0.02em;
40
+ }
41
+
42
+ /* Fallback icon */
43
+ .llm-avatar .icon {
44
+ width: 55%;
45
+ height: 55%;
46
+ opacity: 0.6;
47
+ }
48
+
49
+ /* Status dot */
50
+ .llm-avatar .status-dot {
51
+ position: absolute;
52
+ bottom: 0;
53
+ right: 0;
54
+ width: 25%;
55
+ height: 25%;
56
+ min-width: 6px;
57
+ min-height: 6px;
58
+ max-width: 14px;
59
+ max-height: 14px;
60
+ border-radius: var(--ui-radius-full);
61
+ border: 2px solid var(--ui-color-surface);
62
+ box-sizing: content-box;
63
+ }
64
+
65
+ .llm-avatar .status-dot.status-online { background-color: var(--ui-color-success); }
66
+ .llm-avatar .status-dot.status-offline { background-color: var(--ui-color-text-muted); }
67
+ .llm-avatar .status-dot.status-away { background-color: var(--ui-color-warning); }
68
+ .llm-avatar .status-dot.status-busy { background-color: var(--ui-color-danger); }
69
+
70
+ /* === LlmAvatarGroup === */
71
+
72
+ .llm-avatar-group {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ background: none;
76
+ overflow: visible;
77
+ padding-inline-start: 4px;
78
+ }
79
+
80
+ /* Overlap ring applied to avatars inside a group */
81
+ .llm-avatar-group > .llm-avatar {
82
+ box-shadow: 0 0 0 2px var(--ui-color-surface);
83
+ margin-inline-start: -8px;
84
+ }
85
+
86
+ /* Overflow count badge */
87
+ .overflow-badge {
88
+ display: inline-flex;
89
+ align-items: center;
90
+ justify-content: center;
91
+ flex-shrink: 0;
92
+ background-color: var(--ui-color-surface-sunken);
93
+ color: var(--ui-color-text-muted);
94
+ border: 1px solid var(--ui-color-border);
95
+ border-radius: var(--ui-radius-full);
96
+ font-family: var(--ui-font-family);
97
+ font-weight: var(--ui-font-weight-semibold);
98
+ box-shadow: 0 0 0 2px var(--ui-color-surface);
99
+ margin-inline-start: -8px;
100
+ }
101
+
102
+ .overflow-badge.size-xs { width: 24px; height: 24px; font-size: 0.5625rem; }
103
+ .overflow-badge.size-sm { width: 32px; height: 32px; font-size: var(--ui-font-size-xs); }
104
+ .overflow-badge.size-md { width: 40px; height: 40px; font-size: var(--ui-font-size-sm); }
105
+ .overflow-badge.size-lg { width: 48px; height: 48px; font-size: var(--ui-font-size-sm); }
106
+ .overflow-badge.size-xl { width: 64px; height: 64px; font-size: var(--ui-font-size-md); }
@@ -0,0 +1,60 @@
1
+ .llm-badge {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ border-radius: var(--ui-radius-full);
6
+ font-family: var(--ui-font-family);
7
+ font-weight: var(--ui-font-weight-semibold);
8
+ line-height: var(--ui-line-height-tight);
9
+ white-space: nowrap;
10
+ letter-spacing: 0.01em;
11
+ }
12
+
13
+ /* Sizes */
14
+ .llm-badge.size-sm {
15
+ padding: 0.1875rem var(--ui-spacing-2);
16
+ font-size: var(--ui-font-size-xs);
17
+ }
18
+
19
+ .llm-badge.size-md {
20
+ padding: 0.3125rem var(--ui-spacing-3);
21
+ font-size: var(--ui-font-size-sm);
22
+ }
23
+
24
+ /* Variants */
25
+ .llm-badge.variant-default {
26
+ background-color: var(--ui-color-surface-sunken);
27
+ color: var(--ui-color-text-muted);
28
+ border: 1px solid var(--ui-color-border);
29
+ }
30
+
31
+ .llm-badge.variant-success {
32
+ background-color: var(--ui-color-success-bg);
33
+ color: var(--ui-color-success-text);
34
+ border: 1px solid color-mix(in srgb, var(--ui-color-success-text) 25%, transparent);
35
+ }
36
+
37
+ .llm-badge.variant-warning {
38
+ background-color: var(--ui-color-warning-bg);
39
+ color: var(--ui-color-warning-text);
40
+ border: 1px solid color-mix(in srgb, var(--ui-color-warning-text) 25%, transparent);
41
+ }
42
+
43
+ .llm-badge.variant-danger {
44
+ background-color: var(--ui-color-danger-bg);
45
+ color: var(--ui-color-danger-text);
46
+ border: 1px solid color-mix(in srgb, var(--ui-color-danger-text) 25%, transparent);
47
+ }
48
+
49
+ .llm-badge.variant-info {
50
+ background-color: var(--ui-color-info-bg);
51
+ color: var(--ui-color-info-text);
52
+ border: 1px solid color-mix(in srgb, var(--ui-color-info-text) 25%, transparent);
53
+ }
54
+
55
+ /* Semantic indicator glyph — non-color differentiation (WCAG 1.4.1). */
56
+ .llm-badge .variant-icon {
57
+ font-weight: 700;
58
+ margin-right: 0.3em;
59
+ line-height: 1;
60
+ }
@@ -0,0 +1,62 @@
1
+ /* LlmBreadcrumbs */
2
+ .llm-breadcrumbs {
3
+ display: block;
4
+ font-family: var(--ui-font-family);
5
+ }
6
+
7
+ .breadcrumbs-list {
8
+ display: flex;
9
+ flex-wrap: wrap;
10
+ align-items: center;
11
+ gap: 0;
12
+ list-style: none;
13
+ margin: 0;
14
+ padding: 0;
15
+ font-size: var(--ui-font-size-sm);
16
+ color: var(--ui-color-text-muted);
17
+ }
18
+
19
+ /* LlmBreadcrumbItem */
20
+ .llm-breadcrumb-item {
21
+ display: flex;
22
+ align-items: center;
23
+ }
24
+
25
+ /* Separator — chevron, CSS-generated, not read by screen readers */
26
+ .llm-breadcrumb-item::after {
27
+ content: var(--llm-separator, '›');
28
+ margin: 0 var(--ui-spacing-2);
29
+ color: var(--ui-color-border-hover);
30
+ font-size: var(--ui-font-size-md);
31
+ line-height: 1;
32
+ }
33
+
34
+ .llm-breadcrumb-item.is-current::after {
35
+ display: none;
36
+ }
37
+
38
+ /* Links (navigable breadcrumbs) */
39
+ .llm-breadcrumb-item .breadcrumb-link {
40
+ color: var(--ui-color-text-muted);
41
+ text-decoration: none;
42
+ border-radius: var(--ui-radius-sm);
43
+ padding: var(--ui-spacing-1) var(--ui-spacing-2);
44
+ margin: calc(var(--ui-spacing-1) * -1) calc(var(--ui-spacing-2) * -1);
45
+ transition: color var(--ui-transition-fast), background-color var(--ui-transition-fast);
46
+ }
47
+
48
+ .llm-breadcrumb-item .breadcrumb-link:hover {
49
+ color: var(--ui-color-text);
50
+ background-color: var(--ui-color-surface-sunken);
51
+ }
52
+
53
+ .llm-breadcrumb-item .breadcrumb-link:focus-visible {
54
+ outline: none;
55
+ box-shadow: var(--ui-focus-ring);
56
+ }
57
+
58
+ /* Current item (plain text) */
59
+ .llm-breadcrumb-item .breadcrumb-current {
60
+ color: var(--ui-color-text);
61
+ font-weight: var(--ui-font-weight-semibold);
62
+ }
@@ -0,0 +1,139 @@
1
+ .llm-button {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ gap: var(--ui-spacing-2);
6
+ border: 1px solid transparent;
7
+ border-radius: var(--ui-radius-md);
8
+ font-family: var(--ui-font-family);
9
+ font-size: var(--ui-font-size-md);
10
+ font-weight: var(--ui-font-weight-semibold);
11
+ line-height: var(--ui-line-height-tight);
12
+ letter-spacing: -0.01em;
13
+ cursor: pointer;
14
+ transition: background-color var(--ui-transition-fast),
15
+ border-color var(--ui-transition-fast),
16
+ color var(--ui-transition-fast),
17
+ box-shadow var(--ui-transition-fast);
18
+ white-space: nowrap;
19
+ text-decoration: none;
20
+ user-select: none;
21
+ }
22
+
23
+ .llm-button:focus-visible {
24
+ outline: none;
25
+ box-shadow: var(--ui-focus-ring);
26
+ }
27
+
28
+ /* Variants — flat by default; subtle state shifts only */
29
+ .llm-button.variant-primary {
30
+ background-color: var(--ui-color-primary);
31
+ color: var(--ui-color-text-on-primary);
32
+ border-color: var(--ui-color-primary);
33
+ }
34
+
35
+ .llm-button.variant-primary:hover:not(.is-disabled) {
36
+ background-color: var(--ui-color-primary-hover);
37
+ border-color: var(--ui-color-primary-hover);
38
+ }
39
+
40
+ .llm-button.variant-primary:active:not(.is-disabled) {
41
+ background-color: var(--ui-color-primary-active);
42
+ border-color: var(--ui-color-primary-active);
43
+ }
44
+
45
+ .llm-button.variant-secondary {
46
+ background-color: var(--ui-color-secondary);
47
+ color: var(--ui-color-text-on-secondary);
48
+ border-color: var(--ui-color-secondary);
49
+ }
50
+
51
+ .llm-button.variant-secondary:hover:not(.is-disabled) {
52
+ background-color: var(--ui-color-secondary-hover);
53
+ border-color: var(--ui-color-secondary-hover);
54
+ }
55
+
56
+ .llm-button.variant-secondary:active:not(.is-disabled) {
57
+ background-color: var(--ui-color-secondary-active);
58
+ border-color: var(--ui-color-secondary-active);
59
+ }
60
+
61
+ .llm-button.variant-outline {
62
+ background-color: var(--ui-color-surface-raised);
63
+ color: var(--ui-color-primary);
64
+ border-color: var(--ui-color-border-strong);
65
+ }
66
+
67
+ .llm-button.variant-outline:hover:not(.is-disabled) {
68
+ background-color: var(--ui-color-surface-sunken);
69
+ border-color: var(--ui-color-primary);
70
+ }
71
+
72
+ .llm-button.variant-outline:active:not(.is-disabled) {
73
+ background-color: var(--ui-color-surface-sunken);
74
+ border-color: var(--ui-color-primary-active);
75
+ }
76
+
77
+ /* Non-color differentiation (WCAG 1.4.1): danger variant carries
78
+ * a darker inset border so its silhouette is recognizable in greyscale
79
+ * and color-blind simulations, not only by red fill. */
80
+ .llm-button.variant-danger {
81
+ background-color: var(--ui-color-danger);
82
+ color: var(--ui-color-text-on-danger);
83
+ border-color: var(--ui-color-danger);
84
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
85
+ }
86
+
87
+ .llm-button.variant-danger:hover:not(.is-disabled) {
88
+ background-color: var(--ui-color-danger-hover);
89
+ border-color: var(--ui-color-danger-hover);
90
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
91
+ }
92
+
93
+ .llm-button.variant-danger:active:not(.is-disabled) {
94
+ background-color: var(--ui-color-danger-active);
95
+ border-color: var(--ui-color-danger-active);
96
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
97
+ }
98
+
99
+ /* Sizes — modern target heights (sm 32px / md 40px / lg 48px) */
100
+ .llm-button.size-sm {
101
+ padding: 0.375rem 0.875rem;
102
+ font-size: var(--ui-font-size-sm);
103
+ min-height: 2rem;
104
+ }
105
+
106
+ .llm-button.size-md {
107
+ padding: 0.5625rem 1.125rem;
108
+ font-size: var(--ui-font-size-md);
109
+ min-height: 2.5rem;
110
+ }
111
+
112
+ .llm-button.size-lg {
113
+ padding: 0.75rem 1.5rem;
114
+ font-size: var(--ui-font-size-lg);
115
+ min-height: 3rem;
116
+ }
117
+
118
+ /* Disabled */
119
+ .llm-button.is-disabled {
120
+ opacity: var(--ui-opacity-disabled);
121
+ cursor: not-allowed;
122
+ pointer-events: none;
123
+ }
124
+
125
+ /* Loading spinner */
126
+ .spinner {
127
+ display: inline-block;
128
+ width: 1em;
129
+ height: 1em;
130
+ border: 1.5px solid currentColor;
131
+ border-top-color: transparent;
132
+ border-radius: var(--ui-radius-full);
133
+ animation: llm-spin 0.7s linear infinite;
134
+ flex-shrink: 0;
135
+ }
136
+
137
+ @keyframes llm-spin {
138
+ to { transform: rotate(360deg); }
139
+ }
@@ -0,0 +1,70 @@
1
+ .llm-card {
2
+ display: block;
3
+ border-radius: var(--ui-radius-xl);
4
+ background-color: var(--ui-color-surface-raised);
5
+ overflow: hidden;
6
+ }
7
+
8
+ /* Modernised variants — single soft shadow on elevated, no shadow on
9
+ * outlined or flat. Cards rest on the page; they don't float off it. */
10
+ .llm-card.variant-elevated {
11
+ box-shadow: var(--ui-shadow-sm);
12
+ border: 1px solid var(--ui-color-border);
13
+ }
14
+
15
+ .llm-card.variant-outlined {
16
+ border: 1px solid var(--ui-color-border);
17
+ background-color: var(--ui-color-surface-raised);
18
+ }
19
+
20
+ .llm-card.variant-flat {
21
+ background-color: var(--ui-color-surface-sunken);
22
+ }
23
+
24
+ /* Padding on .llm-card directly affects all slots */
25
+ .llm-card.padding-none .llm-card-header,
26
+ .llm-card.padding-none .llm-card-content,
27
+ .llm-card.padding-none .llm-card-footer {
28
+ padding: 0;
29
+ }
30
+
31
+ .llm-card.padding-sm .llm-card-header,
32
+ .llm-card.padding-sm .llm-card-content,
33
+ .llm-card.padding-sm .llm-card-footer {
34
+ padding: var(--ui-spacing-4);
35
+ }
36
+
37
+ .llm-card.padding-md .llm-card-header,
38
+ .llm-card.padding-md .llm-card-content,
39
+ .llm-card.padding-md .llm-card-footer {
40
+ padding: var(--ui-spacing-6);
41
+ }
42
+
43
+ .llm-card.padding-lg .llm-card-header,
44
+ .llm-card.padding-lg .llm-card-content,
45
+ .llm-card.padding-lg .llm-card-footer {
46
+ padding: var(--ui-spacing-8);
47
+ }
48
+
49
+ /* Sub-component layouts */
50
+ .llm-card-header {
51
+ display: block;
52
+ font-size: var(--ui-font-size-lg);
53
+ font-weight: var(--ui-font-weight-semibold);
54
+ color: var(--ui-color-text);
55
+ border-bottom: 1px solid var(--ui-color-border);
56
+ letter-spacing: var(--ui-letter-spacing-tight);
57
+ }
58
+
59
+ .llm-card-content {
60
+ display: block;
61
+ color: var(--ui-color-text);
62
+ line-height: var(--ui-line-height-normal);
63
+ }
64
+
65
+ .llm-card-footer {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: var(--ui-spacing-3);
69
+ border-top: 1px solid var(--ui-color-border);
70
+ }