aeico-components 0.1.1

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 (174) hide show
  1. package/README.md +0 -0
  2. package/dist/index.cjs +4226 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.js +4226 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/types/aeico-component.d.ts +8 -0
  7. package/dist/types/aeico-field.d.ts +132 -0
  8. package/dist/types/alert/alert.d.ts +49 -0
  9. package/dist/types/alert/defines.d.ts +3 -0
  10. package/dist/types/alert/index.d.ts +3 -0
  11. package/dist/types/badge/badge.d.ts +34 -0
  12. package/dist/types/badge/defines.d.ts +3 -0
  13. package/dist/types/badge/index.d.ts +3 -0
  14. package/dist/types/breadcrumb/breadcrumb-item.d.ts +31 -0
  15. package/dist/types/breadcrumb/breadcrumb.d.ts +60 -0
  16. package/dist/types/breadcrumb/defines.d.ts +1 -0
  17. package/dist/types/breadcrumb/index.d.ts +5 -0
  18. package/dist/types/button/button.d.ts +60 -0
  19. package/dist/types/button/defines.d.ts +3 -0
  20. package/dist/types/button/index.d.ts +3 -0
  21. package/dist/types/button-group/button-group.d.ts +56 -0
  22. package/dist/types/button-group/index.d.ts +2 -0
  23. package/dist/types/card/card.d.ts +19 -0
  24. package/dist/types/card/defines.d.ts +2 -0
  25. package/dist/types/card/index.d.ts +3 -0
  26. package/dist/types/checkbox/checkbox.d.ts +37 -0
  27. package/dist/types/checkbox/defines.d.ts +1 -0
  28. package/dist/types/checkbox/index.d.ts +3 -0
  29. package/dist/types/detail/defines.d.ts +2 -0
  30. package/dist/types/detail/detail.d.ts +40 -0
  31. package/dist/types/detail/index.d.ts +3 -0
  32. package/dist/types/dialog/dialog.d.ts +29 -0
  33. package/dist/types/dialog/index.d.ts +2 -0
  34. package/dist/types/divider/divider.d.ts +34 -0
  35. package/dist/types/divider/index.d.ts +2 -0
  36. package/dist/types/dropdown/defines.d.ts +1 -0
  37. package/dist/types/dropdown/dropdown-button.d.ts +60 -0
  38. package/dist/types/dropdown/dropdown-item.d.ts +56 -0
  39. package/dist/types/dropdown/dropdown.d.ts +84 -0
  40. package/dist/types/dropdown/index.d.ts +7 -0
  41. package/dist/types/icon/defines.d.ts +10 -0
  42. package/dist/types/icon/icon.d.ts +21 -0
  43. package/dist/types/icon/index.d.ts +4 -0
  44. package/dist/types/icon/registry.d.ts +8 -0
  45. package/dist/types/icon-button/icon-button.d.ts +32 -0
  46. package/dist/types/icon-button/index.d.ts +2 -0
  47. package/dist/types/index.d.ts +74 -0
  48. package/dist/types/navbar/defines.d.ts +2 -0
  49. package/dist/types/navbar/index.d.ts +3 -0
  50. package/dist/types/navbar/navbar.d.ts +73 -0
  51. package/dist/types/radio-group/defines.d.ts +6 -0
  52. package/dist/types/radio-group/index.d.ts +5 -0
  53. package/dist/types/radio-group/radio-group.d.ts +41 -0
  54. package/dist/types/radio-group/radio.d.ts +47 -0
  55. package/dist/types/select/defines.d.ts +8 -0
  56. package/dist/types/select/index.d.ts +5 -0
  57. package/dist/types/select/select-option.d.ts +20 -0
  58. package/dist/types/select/select.d.ts +60 -0
  59. package/dist/types/slider/defines.d.ts +31 -0
  60. package/dist/types/slider/index.d.ts +3 -0
  61. package/dist/types/slider/slider.d.ts +45 -0
  62. package/dist/types/switch/index.d.ts +2 -0
  63. package/dist/types/switch/switch.d.ts +35 -0
  64. package/dist/types/tabs/defines.d.ts +1 -0
  65. package/dist/types/tabs/index.d.ts +3 -0
  66. package/dist/types/tabs/tab-panel.d.ts +11 -0
  67. package/dist/types/tabs/tab.d.ts +18 -0
  68. package/dist/types/tabs/tabs.d.ts +24 -0
  69. package/dist/types/tag/defines.d.ts +3 -0
  70. package/dist/types/tag/index.d.ts +3 -0
  71. package/dist/types/tag/tag.d.ts +36 -0
  72. package/dist/types/text-input/index.d.ts +2 -0
  73. package/dist/types/text-input/text-input.d.ts +26 -0
  74. package/dist/types/utils.d.ts +2 -0
  75. package/package.json +63 -0
  76. package/src/aeico-component.ts +17 -0
  77. package/src/aeico-field.ts +228 -0
  78. package/src/alert/alert.ts +107 -0
  79. package/src/alert/defines.ts +11 -0
  80. package/src/alert/index.ts +3 -0
  81. package/src/badge/badge.ts +62 -0
  82. package/src/badge/defines.ts +12 -0
  83. package/src/badge/index.ts +3 -0
  84. package/src/breadcrumb/breadcrumb-item.ts +61 -0
  85. package/src/breadcrumb/breadcrumb.ts +138 -0
  86. package/src/breadcrumb/defines.ts +10 -0
  87. package/src/breadcrumb/index.ts +5 -0
  88. package/src/button/button.ts +147 -0
  89. package/src/button/defines.ts +12 -0
  90. package/src/button/index.ts +3 -0
  91. package/src/button-group/button-group.ts +140 -0
  92. package/src/button-group/index.ts +2 -0
  93. package/src/card/card.ts +57 -0
  94. package/src/card/defines.ts +11 -0
  95. package/src/card/index.ts +3 -0
  96. package/src/checkbox/checkbox.ts +90 -0
  97. package/src/checkbox/defines.ts +1 -0
  98. package/src/checkbox/index.ts +3 -0
  99. package/src/detail/defines.ts +11 -0
  100. package/src/detail/detail.ts +122 -0
  101. package/src/detail/index.ts +3 -0
  102. package/src/dialog/dialog.ts +149 -0
  103. package/src/dialog/index.ts +2 -0
  104. package/src/divider/divider.ts +56 -0
  105. package/src/divider/index.ts +2 -0
  106. package/src/dropdown/defines.ts +13 -0
  107. package/src/dropdown/dropdown-button.ts +130 -0
  108. package/src/dropdown/dropdown-item.ts +136 -0
  109. package/src/dropdown/dropdown.ts +211 -0
  110. package/src/dropdown/index.ts +7 -0
  111. package/src/icon/defines.ts +21 -0
  112. package/src/icon/icon.ts +84 -0
  113. package/src/icon/index.ts +4 -0
  114. package/src/icon/registry.ts +25 -0
  115. package/src/icon-button/icon-button.ts +64 -0
  116. package/src/icon-button/index.ts +2 -0
  117. package/src/index.ts +85 -0
  118. package/src/navbar/defines.ts +11 -0
  119. package/src/navbar/index.ts +3 -0
  120. package/src/navbar/navbar.ts +162 -0
  121. package/src/radio-group/defines.ts +5 -0
  122. package/src/radio-group/index.ts +5 -0
  123. package/src/radio-group/radio-group.ts +227 -0
  124. package/src/radio-group/radio.ts +58 -0
  125. package/src/select/defines.ts +12 -0
  126. package/src/select/index.ts +5 -0
  127. package/src/select/select-option.ts +59 -0
  128. package/src/select/select.ts +387 -0
  129. package/src/slider/defines.ts +33 -0
  130. package/src/slider/index.ts +3 -0
  131. package/src/slider/slider.ts +364 -0
  132. package/src/styles/color.css +117 -0
  133. package/src/styles/components/alert.css +104 -0
  134. package/src/styles/components/badge.css +67 -0
  135. package/src/styles/components/breadcrumb-item.css +59 -0
  136. package/src/styles/components/breadcrumb.css +19 -0
  137. package/src/styles/components/button-group.css +25 -0
  138. package/src/styles/components/button.css +213 -0
  139. package/src/styles/components/card.css +64 -0
  140. package/src/styles/components/checkbox.css +78 -0
  141. package/src/styles/components/detail.css +127 -0
  142. package/src/styles/components/dialog.css +103 -0
  143. package/src/styles/components/divider.css +18 -0
  144. package/src/styles/components/dropdown-item.css +91 -0
  145. package/src/styles/components/dropdown.css +179 -0
  146. package/src/styles/components/icon-button.css +116 -0
  147. package/src/styles/components/icon.css +29 -0
  148. package/src/styles/components/navbar.css +250 -0
  149. package/src/styles/components/radio-group.css +360 -0
  150. package/src/styles/components/select-option.css +43 -0
  151. package/src/styles/components/select.css +222 -0
  152. package/src/styles/components/slider.css +326 -0
  153. package/src/styles/components/switch.css +117 -0
  154. package/src/styles/components/tab-panel.css +8 -0
  155. package/src/styles/components/tab.css +44 -0
  156. package/src/styles/components/tabs.css +16 -0
  157. package/src/styles/components/tag.css +107 -0
  158. package/src/styles/components/text-input.css +110 -0
  159. package/src/styles/layout.css +43 -0
  160. package/src/styles/size.css +7 -0
  161. package/src/styles/variables.css +368 -0
  162. package/src/switch/index.ts +2 -0
  163. package/src/switch/switch.ts +88 -0
  164. package/src/tabs/defines.ts +1 -0
  165. package/src/tabs/index.ts +3 -0
  166. package/src/tabs/tab-panel.ts +23 -0
  167. package/src/tabs/tab.ts +62 -0
  168. package/src/tabs/tabs.ts +134 -0
  169. package/src/tag/defines.ts +12 -0
  170. package/src/tag/index.ts +3 -0
  171. package/src/tag/tag.ts +85 -0
  172. package/src/text-input/index.ts +2 -0
  173. package/src/text-input/text-input.ts +75 -0
  174. package/src/utils.ts +6 -0
@@ -0,0 +1,110 @@
1
+ :host {
2
+ display: block;
3
+ flex: 1;
4
+ min-width: 0;
5
+ font-size: var(--size-base);
6
+
7
+ /* Layout variables */
8
+ --input-field-gap: 4px;
9
+
10
+ /* Input element variables */
11
+ --input-font-size: 1em;
12
+ --input-padding: 0.333em 0.583em;
13
+ --input-border-width: 1px;
14
+ --input-border-radius: 2px;
15
+ --input-border-color: var(--border-subtle);
16
+ --input-border-color-hover: var(--border-default);
17
+ --input-border-color-focus: var(--border-focus);
18
+ --input-bg: var(--surface-base);
19
+ --input-bg-hover: var(--surface-raised);
20
+ --input-bg-focus: var(--surface-raised);
21
+ --input-color: var(--color-text-muted);
22
+ --input-placeholder-color: var(--color-text-disabled);
23
+ --input-transition: border-color 0.12s, background 0.12s;
24
+ }
25
+
26
+ .input-container {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: var(--input-field-gap);
30
+ width: 100%;
31
+ }
32
+
33
+ input {
34
+ flex: 1;
35
+ min-width: 0;
36
+ font-size: var(--input-font-size);
37
+ padding: var(--input-padding);
38
+ border: var(--input-border-width) solid var(--input-border-color);
39
+ border-radius: var(--input-border-radius);
40
+ background: var(--input-bg);
41
+ color: var(--input-color);
42
+ transition: var(--input-transition);
43
+ }
44
+
45
+ input::placeholder {
46
+ color: var(--input-placeholder-color);
47
+ }
48
+
49
+ input:focus {
50
+ outline: none;
51
+ border-color: var(--input-border-color-focus);
52
+ background: var(--input-bg-focus);
53
+ }
54
+
55
+ input:hover:not(:focus) {
56
+ border-color: var(--input-border-color-hover);
57
+ background: var(--input-bg-hover);
58
+ }
59
+
60
+ input:disabled {
61
+ opacity: 0.5;
62
+ cursor: not-allowed;
63
+ }
64
+
65
+ /* Clear button styles */
66
+ .clear-btn {
67
+ width: 1.333em;
68
+ height: 1.333em;
69
+ border: none;
70
+ border-radius: var(--clear-btn-border-radius);
71
+ cursor: pointer;
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: center;
75
+ background: var(--clear-btn-bg);
76
+ color: var(--clear-btn-color);
77
+ transition: var(--clear-btn-transition);
78
+ flex-shrink: 0;
79
+ line-height: 1;
80
+ }
81
+
82
+ .clear-btn:hover {
83
+ background: var(--clear-btn-bg-hover);
84
+ color: var(--clear-btn-color-hover);
85
+ }
86
+
87
+ /* Reset button styles */
88
+ .reset-btn {
89
+ width: 1.333em;
90
+ height: 1.333em;
91
+ border: none;
92
+ border-radius: var(--reset-btn-border-radius);
93
+ cursor: pointer;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ background: var(--reset-btn-bg);
98
+ color: var(--reset-btn-color);
99
+ transition: var(--reset-btn-transition);
100
+ flex-shrink: 0;
101
+ line-height: 1;
102
+ }
103
+
104
+ .reset-btn:hover {
105
+ background: var(--reset-btn-bg-hover);
106
+ color: var(--reset-btn-color-hover);
107
+ }
108
+
109
+
110
+
@@ -0,0 +1,43 @@
1
+ /*
2
+ layout.css — Light DOM utility classes
3
+ This file is for use in the user's light DOM (regular HTML),
4
+ NOT imported by any Web Component internally.
5
+
6
+ Import it once in your page:
7
+ import 'aeico/styles/layout.css'
8
+ or:
9
+ <link rel="stylesheet" href="path/to/layout.css">
10
+
11
+ The layout tokens defined here on :root are intentionally mirrored
12
+ in variables.css (:root, :host) so that ae-navbar's shadow DOM
13
+ inner content also aligns automatically.
14
+ */
15
+
16
+ /* Layout tokens — defined on :root so all light DOM elements can use them */
17
+ :root {
18
+ --container-max-width: 1280px;
19
+ --container-padding-x: 1.5rem;
20
+ }
21
+
22
+ /*
23
+ .container
24
+ Fixed max-width, centred, with horizontal padding.
25
+ Same padding-x as ae-navbar's inner content area.
26
+ */
27
+ .container {
28
+ width: 100%;
29
+ max-width: var(--container-max-width, 1280px);
30
+ margin-inline: auto;
31
+ padding-inline: var(--container-padding-x, 1.5rem);
32
+ box-sizing: border-box;
33
+ }
34
+
35
+ /*
36
+ .container-fluid
37
+ Full-width, only applies horizontal padding.
38
+ */
39
+ .container-fluid {
40
+ width: 100%;
41
+ padding-inline: var(--container-padding-x, 1.5rem);
42
+ box-sizing: border-box;
43
+ }
@@ -0,0 +1,7 @@
1
+ :host([size="xs"]) { font-size: var(--size-xs); }
2
+ :host([size="sm"]) { font-size: var(--size-s); }
3
+ :host([size="md"]) { font-size: var(--size-m); }
4
+ :host([size="lg"]) { font-size: var(--size-l); }
5
+ :host([size="xl"]) { font-size: var(--size-xl); }
6
+ :host([size="3xs"]) { font-size: var(--size-3xs); }
7
+ :host([size="2xs"]) { font-size: var(--size-2xs); }
@@ -0,0 +1,368 @@
1
+ :root,
2
+ :host {
3
+ --ae-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue",
4
+ "Noto Sans", "Liberation Sans", Arial, sans-serif,
5
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
6
+ --ae-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas,
7
+ "Liberation Mono", "Courier New", monospace;
8
+ font-family: var(--ae-font-sans-serif);
9
+ --blue: #0e639c;
10
+ --green: #28a745;
11
+ --red: #dc3545;
12
+ --yellow: #ffc107;
13
+ --cyan: #17a2b8;
14
+ --gray: #6e6e6e;
15
+ --slate: #64748b;
16
+ --dark: #343a40;
17
+ --light: #f8f9fa;
18
+ }
19
+
20
+ :root,
21
+ :host {
22
+ /* Blue */
23
+ --blue-100: color-mix(in srgb, var(--blue) 20%, white);
24
+ --blue-200: color-mix(in srgb, var(--blue) 40%, white);
25
+ --blue-300: color-mix(in srgb, var(--blue) 60%, white);
26
+ --blue-400: color-mix(in srgb, var(--blue) 80%, white);
27
+ --blue-500: var(--blue);
28
+ --blue-600: color-mix(in srgb, var(--blue) 80%, black);
29
+ --blue-700: color-mix(in srgb, var(--blue) 60%, black);
30
+ --blue-800: color-mix(in srgb, var(--blue) 40%, black);
31
+ --blue-900: color-mix(in srgb, var(--blue) 20%, black);
32
+
33
+ /* Green */
34
+ --green-100: color-mix(in srgb, var(--green) 20%, white);
35
+ --green-200: color-mix(in srgb, var(--green) 40%, white);
36
+ --green-300: color-mix(in srgb, var(--green) 60%, white);
37
+ --green-400: color-mix(in srgb, var(--green) 80%, white);
38
+ --green-500: var(--green);
39
+ --green-600: color-mix(in srgb, var(--green) 80%, black);
40
+ --green-700: color-mix(in srgb, var(--green) 60%, black);
41
+ --green-800: color-mix(in srgb, var(--green) 40%, black);
42
+ --green-900: color-mix(in srgb, var(--green) 20%, black);
43
+
44
+ /* Red */
45
+ --red-100: color-mix(in srgb, var(--red) 20%, white);
46
+ --red-200: color-mix(in srgb, var(--red) 40%, white);
47
+ --red-300: color-mix(in srgb, var(--red) 60%, white);
48
+ --red-400: color-mix(in srgb, var(--red) 80%, white);
49
+ --red-500: var(--red);
50
+ --red-600: color-mix(in srgb, var(--red) 80%, black);
51
+ --red-700: color-mix(in srgb, var(--red) 60%, black);
52
+ --red-800: color-mix(in srgb, var(--red) 40%, black);
53
+ --red-900: color-mix(in srgb, var(--red) 20%, black);
54
+
55
+ /* Yellow */
56
+ --yellow-100: color-mix(in srgb, var(--yellow) 20%, white);
57
+ --yellow-200: color-mix(in srgb, var(--yellow) 40%, white);
58
+ --yellow-300: color-mix(in srgb, var(--yellow) 60%, white);
59
+ --yellow-400: color-mix(in srgb, var(--yellow) 80%, white);
60
+ --yellow-500: var(--yellow);
61
+ --yellow-600: color-mix(in srgb, var(--yellow) 80%, black);
62
+ --yellow-700: color-mix(in srgb, var(--yellow) 60%, black);
63
+ --yellow-800: color-mix(in srgb, var(--yellow) 40%, black);
64
+ --yellow-900: color-mix(in srgb, var(--yellow) 20%, black);
65
+
66
+ /* Cyan */
67
+ --cyan-100: color-mix(in srgb, var(--cyan) 20%, white);
68
+ --cyan-200: color-mix(in srgb, var(--cyan) 40%, white);
69
+ --cyan-300: color-mix(in srgb, var(--cyan) 60%, white);
70
+ --cyan-400: color-mix(in srgb, var(--cyan) 80%, white);
71
+ --cyan-500: var(--cyan);
72
+ --cyan-600: color-mix(in srgb, var(--cyan) 80%, black);
73
+ --cyan-700: color-mix(in srgb, var(--cyan) 60%, black);
74
+ --cyan-800: color-mix(in srgb, var(--cyan) 40%, black);
75
+ --cyan-900: color-mix(in srgb, var(--cyan) 20%, black);
76
+
77
+ /* Gray (neutral — base #6e6e6e) */
78
+ --gray-100: color-mix(in srgb, var(--gray) 20%, white);
79
+ --gray-200: color-mix(in srgb, var(--gray) 40%, white);
80
+ --gray-300: color-mix(in srgb, var(--gray) 60%, white);
81
+ --gray-400: color-mix(in srgb, var(--gray) 80%, white);
82
+ --gray-500: var(--gray);
83
+ --gray-600: color-mix(in srgb, var(--gray) 80%, black);
84
+ --gray-700: color-mix(in srgb, var(--gray) 60%, black);
85
+ --gray-800: color-mix(in srgb, var(--gray) 40%, black);
86
+ --gray-900: color-mix(in srgb, var(--gray) 20%, black);
87
+
88
+ /* Slate (blue-gray — base #64748b, used for 'secondary') */
89
+ --slate-100: color-mix(in srgb, var(--slate) 20%, white);
90
+ --slate-200: color-mix(in srgb, var(--slate) 40%, white);
91
+ --slate-300: color-mix(in srgb, var(--slate) 60%, white);
92
+ --slate-400: color-mix(in srgb, var(--slate) 80%, white);
93
+ --slate-500: var(--slate);
94
+ --slate-600: color-mix(in srgb, var(--slate) 80%, black);
95
+ --slate-700: color-mix(in srgb, var(--slate) 60%, black);
96
+ --slate-800: color-mix(in srgb, var(--slate) 40%, black);
97
+ --slate-900: color-mix(in srgb, var(--slate) 20%, black);
98
+
99
+ /* Dark (base #343a40) */
100
+ --dark-100: color-mix(in srgb, var(--dark) 20%, white);
101
+ --dark-200: color-mix(in srgb, var(--dark) 40%, white);
102
+ --dark-300: color-mix(in srgb, var(--dark) 60%, white);
103
+ --dark-400: color-mix(in srgb, var(--dark) 80%, white);
104
+ --dark-500: var(--dark);
105
+ --dark-600: color-mix(in srgb, var(--dark) 80%, black);
106
+ --dark-700: color-mix(in srgb, var(--dark) 60%, black);
107
+ --dark-800: color-mix(in srgb, var(--dark) 40%, black);
108
+ --dark-900: color-mix(in srgb, var(--dark) 20%, black);
109
+
110
+ /* Light (base #f8f9fa) */
111
+ --light-100: color-mix(in srgb, var(--light) 20%, white);
112
+ --light-200: color-mix(in srgb, var(--light) 40%, white);
113
+ --light-300: color-mix(in srgb, var(--light) 60%, white);
114
+ --light-400: color-mix(in srgb, var(--light) 80%, white);
115
+ --light-500: var(--light);
116
+ --light-600: color-mix(in srgb, var(--light) 80%, black);
117
+ --light-700: color-mix(in srgb, var(--light) 60%, black);
118
+ --light-800: color-mix(in srgb, var(--light) 40%, black);
119
+ --light-900: color-mix(in srgb, var(--light) 20%, black);
120
+ }
121
+
122
+ :root,
123
+ :host {
124
+ /* Hover / active mix (light default — overridden in § 6 dark) */
125
+ --color-mix-hover: black 10%;
126
+ --color-mix-active: black 20%;
127
+
128
+ /* Primary (Blue) */
129
+ --color-primary: var(--blue-500);
130
+ --color-primary-hover: color-mix(in srgb, var(--color-primary), var(--color-mix-hover));
131
+ --color-primary-active: color-mix(in srgb, var(--color-primary), var(--color-mix-active));
132
+ --color-primary-disabled: color-mix(in srgb, var(--blue) 50%, var(--gray-500));
133
+
134
+ /* Success (Green) */
135
+ --color-success: var(--green-500);
136
+ --color-success-hover: color-mix(in srgb, var(--color-success), var(--color-mix-hover));
137
+ --color-success-active: color-mix(in srgb, var(--color-success), var(--color-mix-active));
138
+ --color-success-disabled: color-mix(in srgb, var(--green) 50%, var(--gray-500));
139
+
140
+ /* Danger (Red) */
141
+ --color-danger: var(--red-500);
142
+ --color-danger-hover: color-mix(in srgb, var(--color-danger), var(--color-mix-hover));
143
+ --color-danger-active: color-mix(in srgb, var(--color-danger), var(--color-mix-active));
144
+ --color-danger-disabled: color-mix(in srgb, var(--red) 50%, var(--gray-500));
145
+
146
+ /* Warning (Yellow) */
147
+ --color-warning: var(--yellow-500);
148
+ --color-warning-hover: color-mix(in srgb, var(--color-warning), var(--color-mix-hover));
149
+ --color-warning-active: color-mix(in srgb, var(--color-warning), var(--color-mix-active));
150
+ --color-warning-disabled: color-mix(in srgb, var(--yellow) 50%, var(--gray-500));
151
+
152
+ /* Info (Cyan) */
153
+ --color-info: var(--cyan-500);
154
+ --color-info-hover: color-mix(in srgb, var(--color-info), var(--color-mix-hover));
155
+ --color-info-active: color-mix(in srgb, var(--color-info), var(--color-mix-active));
156
+ --color-info-disabled: color-mix(in srgb, var(--cyan) 50%, var(--gray-500));
157
+
158
+ /* Secondary (Slate) — base differs per theme, overridden in § 6 dark */
159
+ --color-secondary: var(--slate-500);
160
+ --color-secondary-hover: color-mix(in srgb, var(--color-secondary), var(--color-mix-hover));
161
+ --color-secondary-active: color-mix(in srgb, var(--color-secondary), var(--color-mix-active));
162
+ --color-secondary-text: var(--slate-700);
163
+
164
+ /* On-solid — text color on filled (saturated) backgrounds.
165
+ Fixed white: blue/green/red/cyan buttons always have white text.
166
+ Does NOT follow --color-text-main. */
167
+ --color-on-solid: white;
168
+ }
169
+
170
+
171
+ .theme-light,
172
+ :root[theme="light"],
173
+ :host([theme="light"]),
174
+ :host-context([theme="light"]),
175
+ :where(:root),
176
+ :host {
177
+ color-scheme: light;
178
+
179
+ /* Gray UI aliases — lighter palette steps for elements on white background */
180
+ --color-gray-dark: var(--gray-400);
181
+ --color-gray: var(--gray-300);
182
+ --color-gray-light: var(--gray-200);
183
+ --color-gray-lighter: var(--gray-100);
184
+ --color-gray-lightest: color-mix(in srgb, var(--gray) 10%, white);
185
+
186
+ /* Text */
187
+ --color-text-main: var(--dark-700);
188
+ --color-text-muted: var(--gray-600);
189
+ --color-text-disabled: var(--gray-300);
190
+ --color-text-link: var(--blue-500);
191
+ --color-text-link-hover: var(--blue-700);
192
+
193
+ /* Surfaces */
194
+ --surface-sunken: var(--light-500);
195
+ --surface-base: white;
196
+ --surface-raised: var(--light-500);
197
+ --surface-overlay: white;
198
+ --color-overlay: rgba(0, 0, 0, 0.4);
199
+
200
+ /* Borders */
201
+ --border-subtle: rgba(0, 0, 0, 0.08);
202
+ --border-default: rgba(0, 0, 0, 0.15);
203
+ --border-hover: rgba(0, 0, 0, 0.25);
204
+ --border-focus: var(--color-primary);
205
+ --border-disabled: rgba(0, 0, 0, 0.06);
206
+
207
+ /* Focus ring */
208
+ --focus-ring: rgb(from var(--blue) r g b / 0.30);
209
+ --focus-ring-sm: rgb(from var(--blue) r g b / 0.15);
210
+
211
+ /* Subtle intent tokens — light context */
212
+ --color-primary-bg-subtle: rgb(from var(--blue) r g b / 0.08);
213
+ --color-primary-border-subtle: rgb(from var(--blue) r g b / 0.40);
214
+ --color-primary-text-emphasis: var(--blue-700);
215
+
216
+ --color-success-bg-subtle: rgb(from var(--green) r g b / 0.08);
217
+ --color-success-border-subtle: rgb(from var(--green) r g b / 0.40);
218
+ --color-success-text-emphasis: var(--green-700);
219
+
220
+ --color-danger-bg-subtle: rgb(from var(--red) r g b / 0.08);
221
+ --color-danger-border-subtle: rgb(from var(--red) r g b / 0.40);
222
+ --color-danger-text-emphasis: var(--red-700);
223
+
224
+ --color-warning-bg-subtle: rgb(from var(--yellow) r g b / 0.08);
225
+ --color-warning-border-subtle: rgb(from var(--yellow) r g b / 0.40);
226
+ --color-warning-text-emphasis: var(--yellow-700);
227
+
228
+ --color-info-bg-subtle: rgb(from var(--cyan) r g b / 0.08);
229
+ --color-info-border-subtle: rgb(from var(--cyan) r g b / 0.40);
230
+ --color-info-text-emphasis: var(--cyan-700);
231
+
232
+ --color-secondary-bg-subtle: rgb(from var(--slate) r g b / 0.08);
233
+ --color-secondary-border-subtle: rgb(from var(--slate) r g b / 0.40);
234
+ --color-secondary-text-emphasis: var(--slate-700);
235
+
236
+ --color-light-bg-subtle: var(--gray-100); /* opaque on white: ~#e2e2e2 */
237
+ --color-light-border-subtle: var(--gray-200); /* opaque on white: ~#c4c4c4 */
238
+
239
+ --color-dark-bg-subtle: var(--dark-100); /* opaque on white: ~#d6d8d9 */
240
+ --color-dark-border-subtle: var(--dark-300); /* opaque on white: ~#85898c */
241
+
242
+ /* Component tokens — light defaults */
243
+ --action-btn-bg: var(--gray-200);
244
+ --action-btn-bg-hover: var(--color-primary);
245
+ --action-btn-color: var(--gray-600);
246
+ --action-btn-color-hover: white;
247
+
248
+ --clear-btn-bg-hover: var(--color-danger);
249
+ --clear-btn-color-hover: white;
250
+
251
+ --reset-btn-border-radius: 2px;
252
+ --reset-btn-bg: var(--action-btn-bg);
253
+ --reset-btn-bg-hover: var(--action-btn-bg-hover);
254
+ --reset-btn-color: var(--action-btn-color);
255
+ --reset-btn-color-hover: var(--action-btn-color-hover);
256
+ --reset-btn-transition: all 0.12s;
257
+
258
+ --clear-btn-border-radius: 2px;
259
+ --clear-btn-bg: var(--action-btn-bg);
260
+ --clear-btn-color: var(--action-btn-color);
261
+ --clear-btn-transition: all 0.12s;
262
+ }
263
+
264
+ :root,
265
+ :host {
266
+ --size-scale: 1;
267
+ --size-base: calc(1rem * var(--size-scale)); /* 16px */
268
+ --size-xl: round(calc(var(--size-l) * 1.125), 1px); /* 23px */
269
+ --size-l: round(calc(var(--size-m) * 1.125 * 1.125), 1px); /* 20px */
270
+ --size-m: var(--size-base); /* 16px */
271
+ --size-s: round(calc(var(--size-m) / 1.125), 1px); /* 14px */
272
+ --size-xs: round(calc(var(--size-s) / 1.125), 1px); /* 12px */
273
+ --size-2xs: round(calc(var(--size-xs) / 1.125), 1px); /* 11px */
274
+ --size-3xs: round(calc(var(--size-2xs) / 1.125), 1px); /* 10px */
275
+ }
276
+
277
+ /* Layout tokens — defined on :root so all light DOM elements can use them */
278
+ :root,
279
+ :host {
280
+ --container-max-width: 1280px;
281
+ --container-padding-x: 1.5rem;
282
+ }
283
+
284
+ .theme-dark,
285
+ :root[theme="dark"],
286
+ :host([theme="dark"]),
287
+ :host-context([theme="dark"]) {
288
+ color-scheme: dark;
289
+
290
+ /* Hover / active — slightly gentler on dark backgrounds */
291
+ --color-mix-hover: black 8%;
292
+ --color-mix-active: black 16%;
293
+
294
+ /* Gray UI aliases — darker palette steps for elements on dark background */
295
+ --color-gray-dark: var(--gray-800);
296
+ --color-gray: var(--gray-700);
297
+ --color-gray-light: var(--gray-600);
298
+ --color-gray-lighter: var(--gray-500);
299
+ --color-gray-lightest: var(--gray-400);
300
+
301
+ /* Secondary — deeper base on dark background */
302
+ --color-secondary: var(--slate-700);
303
+ --color-secondary-text: var(--slate-300);
304
+
305
+ /* Text */
306
+ --color-text-main: white;
307
+ --color-text-muted: var(--gray-200);
308
+ --color-text-disabled: var(--gray-500);
309
+ --color-text-link: var(--blue-300);
310
+ --color-text-link-hover: var(--blue-200);
311
+
312
+ /* Surfaces */
313
+ --surface-sunken: var(--gray-900);
314
+ --surface-base: color-mix(in srgb, var(--gray) 27%, black);
315
+ --surface-raised: color-mix(in srgb, var(--gray) 34%, black);
316
+ --surface-overlay: color-mix(in srgb, var(--gray) 38%, black);
317
+ --color-overlay: rgba(0, 0, 0, 0.6);
318
+
319
+ /* Borders */
320
+ --border-subtle: rgba(255, 255, 255, 0.08);
321
+ --border-default: rgba(255, 255, 255, 0.12);
322
+ --border-hover: rgba(255, 255, 255, 0.20);
323
+ --border-focus: var(--color-primary);
324
+ --border-disabled: rgba(255, 255, 255, 0.06);
325
+
326
+ /* Focus ring */
327
+ --focus-ring: rgb(from var(--blue) r g b / 0.25);
328
+ --focus-ring-sm: rgb(from var(--blue) r g b / 0.10);
329
+
330
+ /* Subtle intent tokens — dark context (more alpha, lighter text-emphasis) */
331
+ --color-primary-bg-subtle: rgb(from var(--blue) r g b / 0.10);
332
+ --color-primary-border-subtle: rgb(from var(--blue) r g b / 0.30);
333
+ --color-primary-text-emphasis: var(--blue-300);
334
+
335
+ --color-success-bg-subtle: rgb(from var(--green) r g b / 0.10);
336
+ --color-success-border-subtle: rgb(from var(--green) r g b / 0.30);
337
+ --color-success-text-emphasis: var(--green-300);
338
+
339
+ --color-danger-bg-subtle: rgb(from var(--red) r g b / 0.10);
340
+ --color-danger-border-subtle: rgb(from var(--red) r g b / 0.30);
341
+ --color-danger-text-emphasis: var(--red-300);
342
+
343
+ --color-warning-bg-subtle: rgb(from var(--yellow) r g b / 0.10);
344
+ --color-warning-border-subtle: rgb(from var(--yellow) r g b / 0.30);
345
+ --color-warning-text-emphasis: var(--yellow-300);
346
+
347
+ --color-info-bg-subtle: rgb(from var(--cyan) r g b / 0.10);
348
+ --color-info-border-subtle: rgb(from var(--cyan) r g b / 0.30);
349
+ --color-info-text-emphasis: var(--cyan-300);
350
+
351
+ --color-secondary-bg-subtle: rgb(from var(--slate) r g b / 0.10);
352
+ --color-secondary-border-subtle: rgb(from var(--slate) r g b / 0.30);
353
+ --color-secondary-text-emphasis: var(--slate-300);
354
+
355
+ --color-light-bg-subtle: rgb(from var(--light) r g b / 0.20);
356
+ --color-light-border-subtle: rgb(from var(--light) r g b / 0.25);
357
+
358
+ --color-dark-bg-subtle: rgb(from var(--dark) r g b / 0.30);
359
+ --color-dark-border-subtle: rgb(from var(--dark) r g b / 0.50);
360
+
361
+ /* Component tokens — dark overrides */
362
+ --action-btn-bg: var(--color-gray);
363
+ --action-btn-bg-hover: color-mix(in srgb, var(--blue) 25%, var(--gray-800));
364
+ --action-btn-color: var(--gray-400);
365
+ --action-btn-color-hover: var(--cyan-300);
366
+ --clear-btn-bg-hover: color-mix(in srgb, var(--red) 25%, var(--gray-800));
367
+ --clear-btn-color-hover: var(--red-300);
368
+ }
@@ -0,0 +1,2 @@
1
+ export { default, default as Switch } from './switch';
2
+ export type { SwitchProps } from './switch';
@@ -0,0 +1,88 @@
1
+ import AeicoField from '../aeico-field';
2
+ import type { InferProps, Props } from 'aeico';
3
+ import { html } from 'aeico';
4
+ import styleVariables from '../styles/variables.css?inline';
5
+ import sizeCSS from '../styles/size.css?inline';
6
+ import colorCSS from '../styles/color.css?inline';
7
+ import styles from '../styles/components/switch.css?inline';
8
+
9
+ class Switch extends AeicoField {
10
+ protected fieldElement: HTMLInputElement | null = null;
11
+
12
+ static tagName = 'switch';
13
+
14
+ static props: Props = {
15
+ checked: { type: Boolean },
16
+ defaultChecked: { type: Boolean },
17
+ };
18
+
19
+ declare checked?: boolean;
20
+ declare defaultChecked?: boolean;
21
+
22
+ protected static styles = [styleVariables, sizeCSS, colorCSS, styles];
23
+
24
+ protected getValue(): boolean {
25
+ return this.fieldElement?.checked ?? false;
26
+ }
27
+
28
+ protected writeValue(checked: boolean): void {
29
+ if (this.fieldElement) {
30
+ this.fieldElement.checked = Boolean(checked);
31
+ }
32
+ }
33
+
34
+ protected getEventPayload(checked: boolean, oldChecked: boolean, action: any) {
35
+ return { checked, oldChecked, action };
36
+ }
37
+
38
+ protected setValue(checked: boolean, options?: { silent?: boolean; action?: any }): void {
39
+ const oldChecked = this.getValue();
40
+ this.checked = checked;
41
+ this.writeValue(checked);
42
+ if (options?.silent === false) {
43
+ this.emit('change', {
44
+ detail: this.getEventPayload(checked, oldChecked, options.action || 'change'),
45
+ });
46
+ }
47
+ }
48
+
49
+ public reset(checked?: boolean, options?: { silent?: boolean }): void {
50
+ this.setValue(checked !== undefined ? checked : (this.defaultChecked ?? false), {
51
+ ...options,
52
+ action: 'reset',
53
+ });
54
+ }
55
+
56
+ public clear(options?: { silent?: boolean }): void {
57
+ this.setValue(false, { ...options, action: 'clear' });
58
+ }
59
+
60
+ render() {
61
+ return html(({ div, input, span }) => {
62
+ div({ className: 'switch-container' }, () => {
63
+ div({ className: 'switch-wrapper' }, () => {
64
+ this.fieldElement = input({
65
+ type: 'checkbox',
66
+ className: 'field-input',
67
+ checked: Boolean(this.checked),
68
+ disabled: Boolean(this.disabled),
69
+ '@change': this.boundOnChange,
70
+ });
71
+ span({ className: 'toggle-slider' });
72
+ });
73
+ this.renderActionButtons();
74
+ });
75
+ });
76
+ }
77
+ }
78
+
79
+ Switch.register();
80
+
81
+ declare global {
82
+ interface HTMLElementTagNameMap {
83
+ 'ae-switch': Switch;
84
+ }
85
+ }
86
+
87
+ export default Switch;
88
+ export type SwitchProps = InferProps<typeof Switch>;
@@ -0,0 +1 @@
1
+ export type TabActiveIndex = number;
@@ -0,0 +1,3 @@
1
+ export { default, default as Tabs } from './tabs';
2
+ export { default as Tab } from './tab';
3
+ export { default as TabPanel } from './tab-panel';
@@ -0,0 +1,23 @@
1
+ import tabPanelStyle from '../styles/components/tab-panel.css?inline';
2
+ import AeicoComponent from '../aeico-component';
3
+ import { html } from 'aeico';
4
+
5
+ class TabPanel extends AeicoComponent {
6
+ protected static styles = [tabPanelStyle];
7
+
8
+ protected render() {
9
+ return html(({ slot }) => {
10
+ slot();
11
+ });
12
+ }
13
+ }
14
+
15
+ TabPanel.register();
16
+
17
+ declare global {
18
+ interface HTMLElementTagNameMap {
19
+ 'ae-tab-panel': TabPanel;
20
+ }
21
+ }
22
+
23
+ export default TabPanel;