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,91 @@
1
+ :host {
2
+ display: block;
3
+
4
+ --dropdown-item-padding: 0.5rem 0.875rem;
5
+ --dropdown-item-bg: transparent;
6
+ --dropdown-item-bg-hover: var(--surface-raised, rgba(0, 0, 0, 0.05));
7
+ --dropdown-item-bg-active: var(--surface-raised-active, rgba(0, 0, 0, 0.1));
8
+ --dropdown-item-color: var(--color-text-main, inherit);
9
+ --dropdown-item-color-disabled: var(--color-text-disabled, rgba(0, 0, 0, 0.35));
10
+ --dropdown-item-font-size: 0.9375rem;
11
+ --dropdown-item-gap: 0.5rem;
12
+ --dropdown-item-transition: background 0.1s;
13
+ --dropdown-item-border-radius: var(--ae-radius-sm, 4px);
14
+ }
15
+
16
+ .item {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: var(--dropdown-item-gap);
20
+ width: 100%;
21
+ padding: var(--dropdown-item-padding);
22
+ font-size: var(--dropdown-item-font-size);
23
+ font-family: inherit;
24
+ color: var(--dropdown-item-color);
25
+ background: var(--dropdown-item-bg);
26
+ border: none;
27
+ border-radius: var(--dropdown-item-border-radius);
28
+ text-align: left;
29
+ text-decoration: none;
30
+ cursor: pointer;
31
+ user-select: none;
32
+ white-space: nowrap;
33
+ box-sizing: border-box;
34
+ transition: var(--dropdown-item-transition);
35
+ outline: none;
36
+ }
37
+
38
+ .item:hover:not(:disabled):not([aria-disabled="true"]) {
39
+ background: var(--dropdown-item-bg-hover);
40
+ }
41
+
42
+ .item:active:not(:disabled):not([aria-disabled="true"]) {
43
+ background: var(--dropdown-item-bg-active);
44
+ }
45
+
46
+ .item:focus-visible {
47
+ background: var(--dropdown-item-bg-hover);
48
+ outline: 2px solid var(--color-primary, #0e639c);
49
+ outline-offset: -2px;
50
+ }
51
+
52
+ /* disabled */
53
+ :host([disabled]) .item,
54
+ .item:disabled {
55
+ color: var(--dropdown-item-color-disabled);
56
+ cursor: default;
57
+ pointer-events: none;
58
+ }
59
+
60
+ /* Active item — current selection, current route, etc. */
61
+ :host([active]) .item {
62
+ background: var(--dropdown-item-bg-selected, rgba(0, 0, 0, 0.06));
63
+ color: var(--dropdown-item-color-active, var(--color-primary, #0e639c));
64
+ font-weight: 500;
65
+ }
66
+
67
+ /* Checkbox mode — fixed-width indicator column */
68
+ .check-indicator {
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: 1em;
73
+ flex-shrink: 0;
74
+ }
75
+
76
+ /* CSS-drawn checkmark (border trick) */
77
+ .check-indicator::after {
78
+ content: '';
79
+ display: block;
80
+ width: 0.3em;
81
+ height: 0.55em;
82
+ border-right: 0.125em solid currentColor;
83
+ border-bottom: 0.125em solid currentColor;
84
+ transform: rotate(45deg) translateY(-0.1em);
85
+ opacity: 0;
86
+ transition: opacity 0.1s;
87
+ }
88
+
89
+ :host([checked]) .check-indicator::after {
90
+ opacity: 1;
91
+ }
@@ -0,0 +1,179 @@
1
+ :host {
2
+ display: inline-block;
3
+ position: relative;
4
+
5
+ --dropdown-z-index: 1000;
6
+ --dropdown-bg: var(--surface-overlay, #fff);
7
+ --dropdown-border: 1px solid var(--color-border, rgba(0, 0, 0, 0.12));
8
+ --dropdown-border-radius: var(--ae-radius-md, 6px);
9
+ --dropdown-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
10
+ --dropdown-min-width: 10rem;
11
+ --dropdown-padding: 0.25rem 0;
12
+ }
13
+
14
+ .trigger-wrapper {
15
+ display: flex;
16
+ align-items: stretch;
17
+ height: 100%;
18
+ }
19
+
20
+ /* Internal trigger rendered when `label` prop is set.
21
+ Uses --dropdown-trigger-* variables. Context components (e.g. ae-navbar)
22
+ map their own tokens to these variables via ::slotted(ae-dropdown). */
23
+ .trigger-label {
24
+ display: inline-flex;
25
+ align-items: center;
26
+ height: var(--dropdown-trigger-height, auto);
27
+ padding: 0 var(--dropdown-trigger-padding-x, 0.75rem);
28
+ color: var(--dropdown-trigger-color, inherit);
29
+ background: var(--dropdown-trigger-bg, none);
30
+ border: none;
31
+ border-radius: var(--dropdown-trigger-radius, 0);
32
+ -webkit-appearance: none;
33
+ appearance: none;
34
+ cursor: pointer;
35
+ font: inherit;
36
+ font-size: var(--dropdown-trigger-font-size, inherit);
37
+ white-space: nowrap;
38
+ transition: color 0.15s ease, background-color 0.15s ease;
39
+ outline-offset: 2px;
40
+ }
41
+
42
+ .trigger-label:hover {
43
+ color: var(--dropdown-trigger-hover-color, inherit);
44
+ background-color: var(--dropdown-trigger-hover-bg, transparent);
45
+ }
46
+
47
+ :host([disabled]) .trigger-label {
48
+ opacity: 0.5;
49
+ cursor: not-allowed;
50
+ pointer-events: none;
51
+ }
52
+
53
+ /* Bootstrap-style CSS border caret — shadow DOM only, no global injection needed */
54
+ .ae-dropdown-arrow {
55
+ display: inline-block;
56
+ width: 0;
57
+ height: 0;
58
+ margin-left: 0.3em;
59
+ vertical-align: 0.2em;
60
+ flex-shrink: 0;
61
+ }
62
+ .ae-dropdown-arrow--bottom {
63
+ border-top: 0.35em solid;
64
+ border-right: 0.35em solid transparent;
65
+ border-left: 0.35em solid transparent;
66
+ }
67
+ .ae-dropdown-arrow--top {
68
+ border-bottom: 0.35em solid;
69
+ border-right: 0.35em solid transparent;
70
+ border-left: 0.35em solid transparent;
71
+ }
72
+ .ae-dropdown-arrow--right {
73
+ border-left: 0.35em solid;
74
+ border-top: 0.35em solid transparent;
75
+ border-bottom: 0.35em solid transparent;
76
+ }
77
+ .ae-dropdown-arrow--left {
78
+ border-right: 0.35em solid;
79
+ border-top: 0.35em solid transparent;
80
+ border-bottom: 0.35em solid transparent;
81
+ }
82
+
83
+ .panel {
84
+ display: none;
85
+ position: absolute;
86
+ z-index: var(--dropdown-z-index);
87
+ background: var(--dropdown-bg);
88
+ border: var(--dropdown-border);
89
+ border-radius: var(--dropdown-border-radius);
90
+ box-shadow: var(--dropdown-shadow);
91
+ min-width: var(--dropdown-min-width);
92
+ padding: var(--dropdown-padding);
93
+ box-sizing: border-box;
94
+ /* Prevent panel from being wider than viewport */
95
+ max-width: calc(100vw - 16px);
96
+ }
97
+
98
+ .panel.open {
99
+ display: block;
100
+ }
101
+
102
+ /* placement variants */
103
+ .panel.placement-bottom-start {
104
+ top: 100%;
105
+ left: 0;
106
+ margin-top: 4px;
107
+ }
108
+
109
+ .panel.placement-bottom-end {
110
+ top: 100%;
111
+ right: 0;
112
+ margin-top: 4px;
113
+ }
114
+
115
+ .panel.placement-bottom {
116
+ top: 100%;
117
+ left: 50%;
118
+ transform: translateX(-50%);
119
+ margin-top: 4px;
120
+ }
121
+
122
+ .panel.placement-top-start {
123
+ bottom: 100%;
124
+ left: 0;
125
+ margin-bottom: 4px;
126
+ }
127
+
128
+ .panel.placement-top-end {
129
+ bottom: 100%;
130
+ right: 0;
131
+ margin-bottom: 4px;
132
+ }
133
+
134
+ .panel.placement-top {
135
+ bottom: 100%;
136
+ left: 50%;
137
+ transform: translateX(-50%);
138
+ margin-bottom: 4px;
139
+ }
140
+
141
+ /* right placements */
142
+ .panel.placement-right-start {
143
+ top: 0;
144
+ left: 100%;
145
+ margin-left: 4px;
146
+ }
147
+
148
+ .panel.placement-right-end {
149
+ bottom: 0;
150
+ left: 100%;
151
+ margin-left: 4px;
152
+ }
153
+
154
+ .panel.placement-right {
155
+ top: 50%;
156
+ left: 100%;
157
+ transform: translateY(-50%);
158
+ margin-left: 4px;
159
+ }
160
+
161
+ /* left placements */
162
+ .panel.placement-left-start {
163
+ top: 0;
164
+ right: 100%;
165
+ margin-right: 4px;
166
+ }
167
+
168
+ .panel.placement-left-end {
169
+ bottom: 0;
170
+ right: 100%;
171
+ margin-right: 4px;
172
+ }
173
+
174
+ .panel.placement-left {
175
+ top: 50%;
176
+ right: 100%;
177
+ transform: translateY(-50%);
178
+ margin-right: 4px;
179
+ }
@@ -0,0 +1,116 @@
1
+ /* @deprecated – Use <ae-button> with <ae-icon> slot instead. */
2
+
3
+ :host {
4
+ display: inline-flex;
5
+ font-size: var(--size-m);
6
+ --btn-solid-bg: var(--color-solid);
7
+ --btn-solid-bg-hover: var(--color-solid-hover);
8
+ --btn-solid-bg-active: var(--color-solid-active);
9
+ --btn-solid-color: var(--color-on-solid);
10
+ --btn-solid-color-hover: var(--color-on-solid-hover);
11
+ --btn-border: var(--color-border);
12
+ --btn-border-hover: var(--color-border-hover);
13
+ --btn-accent: var(--color-accent);
14
+ --btn-accent-hover: var(--color-accent-hover);
15
+ --btn-subtle-bg: var(--color-subtle);
16
+ --btn-subtle-bg-hover: var(--color-subtle-hover);
17
+ }
18
+
19
+ button {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ padding: 0;
24
+ font-size: 1em;
25
+ cursor: pointer;
26
+ border-radius: 4px;
27
+ transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
28
+ outline: none;
29
+ user-select: none;
30
+ flex-shrink: 0;
31
+ width: 2.286em;
32
+ height: 2.286em;
33
+ --ib-icon-size: 1.286em;
34
+ background: var(--btn-solid-bg);
35
+ border: 1px solid var(--btn-border);
36
+ color: var(--btn-solid-color);
37
+ }
38
+
39
+ button:focus { outline: none; }
40
+ button:active { transform: translateY(1px); }
41
+
42
+ button:hover:not(:disabled) {
43
+ background: var(--btn-solid-bg-hover);
44
+ border-color: var(--btn-border-hover);
45
+ color: var(--btn-solid-color-hover, var(--btn-solid-color));
46
+ }
47
+
48
+ button:active:not(:disabled) { background: var(--btn-solid-bg-active); }
49
+
50
+ button:disabled {
51
+ opacity: 0.5;
52
+ cursor: not-allowed;
53
+ }
54
+
55
+ :host([size="xs"]) button,
56
+ :host([size="sm"]) button { border-radius: 3px; }
57
+
58
+ :host([variant="outlined"]) button {
59
+ background: transparent;
60
+ border-color: var(--btn-border);
61
+ color: var(--btn-accent);
62
+ }
63
+
64
+ :host([variant="outlined"]) button:hover:not(:disabled) {
65
+ background: var(--btn-subtle-bg);
66
+ border-color: var(--btn-border-hover);
67
+ color: var(--btn-accent-hover);
68
+ }
69
+
70
+ :host([variant="outlined"]) button:active:not(:disabled) {
71
+ background: var(--btn-subtle-bg-hover);
72
+ }
73
+
74
+ :host([variant="subtle"]) button {
75
+ background: var(--btn-subtle-bg);
76
+ border-color: transparent;
77
+ color: var(--btn-accent);
78
+ }
79
+
80
+ :host([variant="subtle"]) button:hover:not(:disabled) {
81
+ background: var(--btn-subtle-bg-hover);
82
+ color: var(--btn-accent-hover);
83
+ }
84
+
85
+ :host([variant="subtle"]) button:active:not(:disabled) {
86
+ background: var(--btn-subtle-bg-hover);
87
+ }
88
+
89
+ :host([variant="text"]) button {
90
+ background: transparent;
91
+ border-color: transparent;
92
+ color: var(--btn-accent);
93
+ }
94
+
95
+ :host([variant="text"]) button:hover:not(:disabled) {
96
+ background: var(--btn-subtle-bg);
97
+ color: var(--btn-accent-hover);
98
+ }
99
+
100
+ :host([variant="text"]) button:active:not(:disabled) {
101
+ background: var(--btn-subtle-bg-hover);
102
+ }
103
+
104
+ .icon-svg {
105
+ display: block;
106
+ width: var(--ib-icon-size);
107
+ height: var(--ib-icon-size);
108
+ fill: var(--icon-fill, currentColor);
109
+ stroke: var(--icon-stroke, none);
110
+ stroke-width: var(--icon-stroke-width, 2);
111
+ stroke-linecap: var(--icon-stroke-linecap, round);
112
+ stroke-linejoin: var(--icon-stroke-linejoin, round);
113
+ pointer-events: none;
114
+ overflow: visible;
115
+ flex-shrink: 0;
116
+ }
@@ -0,0 +1,29 @@
1
+ :host {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ font-size: 20px;
6
+ width: 1em;
7
+ height: 1em;
8
+ color: inherit;
9
+ flex-shrink: 0;
10
+ line-height: 0;
11
+ vertical-align: middle;
12
+ }
13
+
14
+ :host([color]) {
15
+ color: var(--color-solid);
16
+ }
17
+
18
+ .icon-svg {
19
+ display: block;
20
+ width: 100%;
21
+ height: 100%;
22
+ fill: var(--icon-fill, currentColor);
23
+ stroke: var(--icon-stroke, none);
24
+ stroke-width: var(--icon-stroke-width, 2);
25
+ stroke-linecap: var(--icon-stroke-linecap, round);
26
+ stroke-linejoin: var(--icon-stroke-linejoin, round);
27
+ pointer-events: none;
28
+ overflow: visible;
29
+ }
@@ -0,0 +1,250 @@
1
+ :host {
2
+ /* layout — padding lives in .inner so document * { padding:0 } cannot override it */
3
+ display: block;
4
+ position: static;
5
+ top: auto;
6
+ z-index: var(--ae-navbar-z-index, 100);
7
+ box-sizing: border-box;
8
+ height: var(--ae-navbar-height, 3.25rem);
9
+ border-radius: var(--ae-navbar-radius, 0);
10
+
11
+ /* color */
12
+ background: var(--ae-navbar-bg, var(--surface-base));
13
+ color: var(--ae-navbar-color, var(--color-text-main));
14
+ border-bottom: var(--ae-navbar-border-width, 1px) solid var(--ae-navbar-border-color, var(--border-default));
15
+ box-shadow: var(--ae-navbar-shadow, none);
16
+
17
+ /* layout tokens — declared here so they are clearly part of the public API */
18
+ --ae-navbar-radius: 0;
19
+ /* Default padding-x references the global layout token so ae-navbar content
20
+ automatically aligns with .container / .container-fluid in light DOM.
21
+ Override with --ae-navbar-padding-x to decouple if needed. */
22
+ --ae-navbar-padding-x: var(--container-padding-x, 1.5rem);
23
+ --ae-navbar-gap: 0.5rem;
24
+
25
+ /* link style tokens — text mode defaults.
26
+ CSS custom properties inherit into slotted content, so
27
+ ::slotted(a[slot="start"]) can reference --ae-navbar-height. */
28
+ --ae-navbar-link-color: inherit;
29
+ --ae-navbar-link-font-size: inherit;
30
+ --ae-navbar-link-padding-x: 0.75rem; /* horizontal padding only; height fills vertically */
31
+ --ae-navbar-link-radius: 0;
32
+ --ae-navbar-link-hover-color: var(--color-text-link-hover);
33
+ --ae-navbar-link-hover-bg: transparent;
34
+ --ae-navbar-link-active-color: var(--color-text-link);
35
+ --ae-navbar-link-active-font-weight: 600;
36
+ }
37
+
38
+ :host([sticky]) {
39
+ position: sticky;
40
+ top: 0;
41
+ }
42
+
43
+ :host([color]) {
44
+ --ae-navbar-bg: var(--color-solid);
45
+ --ae-navbar-color: var(--color-on-solid);
46
+ --ae-navbar-border-color: transparent;
47
+ --ae-navbar-link-hover-color: var(--color-on-solid);
48
+ --ae-navbar-link-active-color: var(--color-on-solid);
49
+ }
50
+
51
+ /* block preset: hover shows a subtle filled block */
52
+ :host([appearance="block"]) {
53
+ --ae-navbar-link-hover-bg: var(--color-bg-subtle);
54
+ --ae-navbar-link-hover-color: inherit;
55
+ }
56
+
57
+ /* block preset on colored navbar: use semi-transparent white */
58
+ :host([color][appearance="block"]) {
59
+ --ae-navbar-link-hover-bg: rgba(255, 255, 255, 0.15);
60
+ --ae-navbar-link-hover-color: var(--color-on-solid);
61
+ }
62
+
63
+ .inner {
64
+ display: flex;
65
+ align-items: center;
66
+ height: 100%;
67
+ padding: 0 var(--ae-navbar-padding-x);
68
+ gap: var(--ae-navbar-gap);
69
+ box-sizing: border-box;
70
+ }
71
+
72
+ [part="brand"] {
73
+ flex: 0 0 auto;
74
+ display: flex;
75
+ align-items: center;
76
+ }
77
+
78
+ /* nav wraps start + end; takes all remaining space */
79
+ [part="nav"] {
80
+ flex: 1 1 auto;
81
+ display: flex;
82
+ align-self: stretch; /* stretch to host height so children can fill it */
83
+ align-items: stretch;
84
+ min-width: 0;
85
+ }
86
+
87
+ [part="start"],
88
+ [part="end"] {
89
+ flex: 0 0 auto;
90
+ display: flex;
91
+ align-self: stretch;
92
+ }
93
+
94
+ [part="start"] {
95
+ align-items: stretch; /* slotted <a> will stretch to full height */
96
+ gap: var(--ae-navbar-start-gap, 0);
97
+ }
98
+
99
+ [part="end"] {
100
+ align-items: center; /* buttons / avatars stay vertically centred */
101
+ gap: var(--ae-navbar-end-gap, 0.5rem);
102
+ margin-left: auto;
103
+ }
104
+
105
+ /* hamburger — hidden on desktop */
106
+ [part="hamburger"] {
107
+ display: none;
108
+ flex-direction: column;
109
+ justify-content: center;
110
+ align-items: center;
111
+ gap: 5px;
112
+ flex-shrink: 0;
113
+ width: var(--ae-navbar-hamburger-size, 2rem);
114
+ height: var(--ae-navbar-hamburger-size, 2rem);
115
+ margin-left: auto;
116
+ padding: 0;
117
+ background: none;
118
+ border: none;
119
+ border-radius: 4px;
120
+ cursor: pointer;
121
+ color: var(--ae-navbar-hamburger-color, inherit);
122
+ }
123
+
124
+ [part="hamburger"]:hover {
125
+ background: color-mix(in srgb, currentColor 10%, transparent);
126
+ }
127
+
128
+ [part="hamburger"] span {
129
+ display: block;
130
+ width: 18px;
131
+ height: 2px;
132
+ background: currentColor;
133
+ border-radius: 1px;
134
+ transition: transform 0.2s ease, opacity 0.2s ease;
135
+ }
136
+
137
+ /* Brand link — sensible defaults, no full-height stretch */
138
+ ::slotted(a[slot="brand"]) {
139
+ display: inline-flex;
140
+ align-items: center;
141
+ color: inherit;
142
+ font-weight: 700;
143
+ font-size: 1.05rem;
144
+ text-decoration: none;
145
+ white-space: nowrap;
146
+ }
147
+
148
+ /* Nav links (start / end slots) — fill full navbar height for block hover effect */
149
+ ::slotted(a[slot="start"]),
150
+ ::slotted(a[slot="end"]) {
151
+ display: inline-flex;
152
+ align-items: center;
153
+ height: var(--ae-navbar-height, 3.25rem); /* full-height hover area */
154
+ /* !important overrides document-level * { padding: 0 } reset */
155
+ padding: 0 var(--ae-navbar-link-padding-x) !important;
156
+ border-radius: var(--ae-navbar-link-radius);
157
+ color: var(--ae-navbar-link-color);
158
+ font-size: var(--ae-navbar-link-font-size);
159
+ text-decoration: none;
160
+ white-space: nowrap;
161
+ transition: color 0.15s ease, background-color 0.15s ease;
162
+ outline-offset: 2px;
163
+ }
164
+
165
+ ::slotted(a[slot="start"]:hover),
166
+ ::slotted(a[slot="end"]:hover) {
167
+ color: var(--ae-navbar-link-hover-color);
168
+ background-color: var(--ae-navbar-link-hover-bg);
169
+ }
170
+
171
+ ::slotted(a[slot="start"][aria-current="page"]),
172
+ ::slotted(a[slot="end"][aria-current="page"]) {
173
+ color: var(--ae-navbar-link-active-color);
174
+ font-weight: var(--ae-navbar-link-active-font-weight);
175
+ }
176
+
177
+ /* ae-dropdown inside navbar — map navbar tokens to dropdown trigger API */
178
+ ::slotted(ae-dropdown) {
179
+ align-self: stretch;
180
+ --dropdown-trigger-height: 100%;
181
+ --dropdown-trigger-padding-x: var(--ae-navbar-link-padding-x);
182
+ --dropdown-trigger-color: var(--ae-navbar-link-color);
183
+ --dropdown-trigger-bg: none;
184
+ --dropdown-trigger-radius: var(--ae-navbar-link-radius);
185
+ --dropdown-trigger-font-size: var(--ae-navbar-link-font-size);
186
+ --dropdown-trigger-hover-color: var(--ae-navbar-link-hover-color);
187
+ --dropdown-trigger-hover-bg: var(--ae-navbar-link-hover-bg);
188
+ }
189
+
190
+ @media (max-width: 768px) {
191
+ /* collapse the nav container */
192
+ [part="nav"] {
193
+ display: none;
194
+ position: absolute;
195
+ top: 100%;
196
+ left: 0;
197
+ right: 0;
198
+ flex-direction: column;
199
+ align-items: stretch;
200
+ gap: 0;
201
+ padding: 0.5rem 0;
202
+ background: var(--ae-navbar-mobile-bg, var(--ae-navbar-bg, var(--surface-base)));
203
+ border-bottom: 1px solid var(--ae-navbar-border-color, var(--border-default));
204
+ box-shadow: var(--ae-navbar-mobile-shadow, 0 4px 12px rgba(0, 0, 0, 0.1));
205
+ z-index: 1;
206
+ }
207
+
208
+ :host([open]) [part="nav"] {
209
+ display: flex;
210
+ }
211
+
212
+ /* stack start/end vertically inside the panel */
213
+ [part="start"],
214
+ [part="end"] {
215
+ flex-direction: column;
216
+ align-items: flex-start;
217
+ align-self: auto;
218
+ gap: 0;
219
+ margin-left: 0;
220
+ width: 100%;
221
+ }
222
+
223
+ /* Mobile: links revert to auto height and add vertical padding */
224
+ ::slotted(a[slot="start"]),
225
+ ::slotted(a[slot="end"]) {
226
+ height: auto;
227
+ width: 100%;
228
+ padding: 0.75rem var(--ae-navbar-link-padding-x);
229
+ border-radius: 0;
230
+ }
231
+
232
+ /* show hamburger */
233
+ [part="hamburger"] {
234
+ display: flex;
235
+ }
236
+
237
+ /* hamburger → × animation */
238
+ :host([open]) [part="hamburger"] span:nth-child(1) {
239
+ transform: translateY(7px) rotate(45deg);
240
+ }
241
+
242
+ :host([open]) [part="hamburger"] span:nth-child(2) {
243
+ opacity: 0;
244
+ transform: scaleX(0);
245
+ }
246
+
247
+ :host([open]) [part="hamburger"] span:nth-child(3) {
248
+ transform: translateY(-7px) rotate(-45deg);
249
+ }
250
+ }