@latty-ds/web 0.2.0

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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/custom-elements.json +8785 -0
  4. package/dist/base/index.d.ts +1 -0
  5. package/dist/base/index.js +35 -0
  6. package/dist/base/themeable-element.d.ts +20 -0
  7. package/dist/components/accordion/accordion.d.ts +82 -0
  8. package/dist/components/accordion/accordion.styles.d.ts +1 -0
  9. package/dist/components/accordion/accordion.types.d.ts +10 -0
  10. package/dist/components/accordion/index.d.ts +8 -0
  11. package/dist/components/accordion/index.js +468 -0
  12. package/dist/components/alert/alert.d.ts +51 -0
  13. package/dist/components/alert/alert.styles.d.ts +1 -0
  14. package/dist/components/alert/alert.types.d.ts +2 -0
  15. package/dist/components/alert/index.d.ts +2 -0
  16. package/dist/components/alert/index.js +746 -0
  17. package/dist/components/avatar/avatar.d.ts +27 -0
  18. package/dist/components/avatar/avatar.styles.d.ts +1 -0
  19. package/dist/components/avatar/avatar.types.d.ts +3 -0
  20. package/dist/components/avatar/index.d.ts +2 -0
  21. package/dist/components/avatar/index.js +222 -0
  22. package/dist/components/badge/badge.d.ts +29 -0
  23. package/dist/components/badge/badge.styles.d.ts +1 -0
  24. package/dist/components/badge/badge.types.d.ts +3 -0
  25. package/dist/components/badge/index.d.ts +2 -0
  26. package/dist/components/badge/index.js +277 -0
  27. package/dist/components/breadcrumb/breadcrumb.d.ts +53 -0
  28. package/dist/components/breadcrumb/breadcrumb.styles.d.ts +2 -0
  29. package/dist/components/breadcrumb/breadcrumb.types.d.ts +1 -0
  30. package/dist/components/breadcrumb/index.d.ts +2 -0
  31. package/dist/components/breadcrumb/index.js +166 -0
  32. package/dist/components/button/button.d.ts +111 -0
  33. package/dist/components/button/button.styles.d.ts +1 -0
  34. package/dist/components/button/button.types.d.ts +38 -0
  35. package/dist/components/button/index.d.ts +8 -0
  36. package/dist/components/button/index.js +466 -0
  37. package/dist/components/calendar/calendar.d.ts +84 -0
  38. package/dist/components/calendar/calendar.styles.d.ts +1 -0
  39. package/dist/components/calendar/calendar.types.d.ts +15 -0
  40. package/dist/components/calendar/index.d.ts +1 -0
  41. package/dist/components/calendar/index.js +958 -0
  42. package/dist/components/checkbox/checkbox.d.ts +113 -0
  43. package/dist/components/checkbox/checkbox.styles.d.ts +1 -0
  44. package/dist/components/checkbox/checkbox.types.d.ts +21 -0
  45. package/dist/components/checkbox/index.d.ts +8 -0
  46. package/dist/components/checkbox/index.js +320 -0
  47. package/dist/components/chip/chip.d.ts +35 -0
  48. package/dist/components/chip/chip.styles.d.ts +1 -0
  49. package/dist/components/chip/chip.types.d.ts +3 -0
  50. package/dist/components/chip/index.d.ts +2 -0
  51. package/dist/components/chip/index.js +282 -0
  52. package/dist/components/color-input/color-input.d.ts +55 -0
  53. package/dist/components/color-input/color-input.styles.d.ts +1 -0
  54. package/dist/components/color-input/color-input.types.d.ts +2 -0
  55. package/dist/components/color-input/index.d.ts +1 -0
  56. package/dist/components/color-input/index.js +489 -0
  57. package/dist/components/combobox/combobox.d.ts +59 -0
  58. package/dist/components/combobox/combobox.styles.d.ts +1 -0
  59. package/dist/components/combobox/combobox.types.d.ts +7 -0
  60. package/dist/components/combobox/index.d.ts +2 -0
  61. package/dist/components/combobox/index.js +1988 -0
  62. package/dist/components/date-input/date-input.d.ts +66 -0
  63. package/dist/components/date-input/date-input.styles.d.ts +1 -0
  64. package/dist/components/date-input/date-input.types.d.ts +3 -0
  65. package/dist/components/date-input/index.d.ts +2 -0
  66. package/dist/components/date-input/index.js +2863 -0
  67. package/dist/components/datepicker/datepicker.d.ts +52 -0
  68. package/dist/components/datepicker/datepicker.styles.d.ts +1 -0
  69. package/dist/components/datepicker/datepicker.types.d.ts +3 -0
  70. package/dist/components/datepicker/index.d.ts +2 -0
  71. package/dist/components/datepicker/index.js +416 -0
  72. package/dist/components/dialog/dialog.d.ts +114 -0
  73. package/dist/components/dialog/dialog.styles.d.ts +1 -0
  74. package/dist/components/dialog/dialog.types.d.ts +11 -0
  75. package/dist/components/dialog/index.d.ts +2 -0
  76. package/dist/components/dialog/index.js +920 -0
  77. package/dist/components/divider/divider.d.ts +35 -0
  78. package/dist/components/divider/divider.styles.d.ts +1 -0
  79. package/dist/components/divider/divider.types.d.ts +2 -0
  80. package/dist/components/divider/index.d.ts +2 -0
  81. package/dist/components/divider/index.js +149 -0
  82. package/dist/components/dropdown/dropdown-item.d.ts +24 -0
  83. package/dist/components/dropdown/dropdown-item.styles.d.ts +1 -0
  84. package/dist/components/dropdown/dropdown.d.ts +30 -0
  85. package/dist/components/dropdown/dropdown.styles.d.ts +1 -0
  86. package/dist/components/dropdown/dropdown.types.d.ts +1 -0
  87. package/dist/components/dropdown/index.d.ts +3 -0
  88. package/dist/components/dropdown/index.js +1791 -0
  89. package/dist/components/header/header.d.ts +19 -0
  90. package/dist/components/header/header.styles.d.ts +1 -0
  91. package/dist/components/header/header.types.d.ts +1 -0
  92. package/dist/components/header/index.d.ts +2 -0
  93. package/dist/components/header/index.js +104 -0
  94. package/dist/components/icon-button/icon-button.d.ts +52 -0
  95. package/dist/components/icon-button/icon-button.styles.d.ts +1 -0
  96. package/dist/components/icon-button/icon-button.types.d.ts +8 -0
  97. package/dist/components/icon-button/index.d.ts +1 -0
  98. package/dist/components/icon-button/index.js +342 -0
  99. package/dist/components/image/image.d.ts +26 -0
  100. package/dist/components/image/image.styles.d.ts +1 -0
  101. package/dist/components/image/image.types.d.ts +0 -0
  102. package/dist/components/image/index.d.ts +1 -0
  103. package/dist/components/image/index.js +105 -0
  104. package/dist/components/link/index.d.ts +1 -0
  105. package/dist/components/link/index.js +108 -0
  106. package/dist/components/link/link.d.ts +22 -0
  107. package/dist/components/link/link.styles.d.ts +1 -0
  108. package/dist/components/link/link.types.d.ts +1 -0
  109. package/dist/components/list/index.d.ts +9 -0
  110. package/dist/components/list/index.js +254 -0
  111. package/dist/components/list/list-item.d.ts +41 -0
  112. package/dist/components/list/list-item.styles.d.ts +1 -0
  113. package/dist/components/list/list.d.ts +85 -0
  114. package/dist/components/list/list.styles.d.ts +1 -0
  115. package/dist/components/list/list.types.d.ts +16 -0
  116. package/dist/components/nav/index.d.ts +3 -0
  117. package/dist/components/nav/index.js +345 -0
  118. package/dist/components/nav/nav-item.d.ts +73 -0
  119. package/dist/components/nav/nav.d.ts +49 -0
  120. package/dist/components/nav/nav.styles.d.ts +2 -0
  121. package/dist/components/nav/nav.types.d.ts +1 -0
  122. package/dist/components/pagination/index.d.ts +2 -0
  123. package/dist/components/pagination/index.js +210 -0
  124. package/dist/components/pagination/pagination.d.ts +34 -0
  125. package/dist/components/pagination/pagination.styles.d.ts +1 -0
  126. package/dist/components/pagination/pagination.types.d.ts +1 -0
  127. package/dist/components/progress/index.d.ts +2 -0
  128. package/dist/components/progress/index.js +167 -0
  129. package/dist/components/progress/progress.d.ts +44 -0
  130. package/dist/components/progress/progress.styles.d.ts +1 -0
  131. package/dist/components/progress/progress.types.d.ts +2 -0
  132. package/dist/components/radio/index.d.ts +8 -0
  133. package/dist/components/radio/index.js +294 -0
  134. package/dist/components/radio/radio.d.ts +96 -0
  135. package/dist/components/radio/radio.styles.d.ts +1 -0
  136. package/dist/components/radio/radio.types.d.ts +21 -0
  137. package/dist/components/radio-group/index.d.ts +8 -0
  138. package/dist/components/radio-group/index.js +384 -0
  139. package/dist/components/radio-group/radio-group.d.ts +100 -0
  140. package/dist/components/radio-group/radio-group.styles.d.ts +1 -0
  141. package/dist/components/radio-group/radio-group.types.d.ts +8 -0
  142. package/dist/components/select/index.d.ts +8 -0
  143. package/dist/components/select/index.js +2123 -0
  144. package/dist/components/select/select.d.ts +129 -0
  145. package/dist/components/select/select.styles.d.ts +1 -0
  146. package/dist/components/select/select.types.d.ts +37 -0
  147. package/dist/components/shared/backdrop.styles.d.ts +1 -0
  148. package/dist/components/shared/floating.d.ts +10 -0
  149. package/dist/components/sidepanel/index.d.ts +1 -0
  150. package/dist/components/sidepanel/index.js +768 -0
  151. package/dist/components/sidepanel/sidepanel.d.ts +48 -0
  152. package/dist/components/sidepanel/sidepanel.styles.d.ts +1 -0
  153. package/dist/components/sidepanel/sidepanel.types.d.ts +1 -0
  154. package/dist/components/skeleton/index.d.ts +2 -0
  155. package/dist/components/skeleton/index.js +129 -0
  156. package/dist/components/skeleton/skeleton.d.ts +39 -0
  157. package/dist/components/skeleton/skeleton.styles.d.ts +1 -0
  158. package/dist/components/skeleton/skeleton.types.d.ts +1 -0
  159. package/dist/components/slider/index.d.ts +2 -0
  160. package/dist/components/slider/index.js +635 -0
  161. package/dist/components/slider/slider.d.ts +33 -0
  162. package/dist/components/slider/slider.styles.d.ts +1 -0
  163. package/dist/components/slider/slider.types.d.ts +1 -0
  164. package/dist/components/snackbar/index.d.ts +2 -0
  165. package/dist/components/snackbar/index.js +358 -0
  166. package/dist/components/snackbar/snackbar.d.ts +63 -0
  167. package/dist/components/snackbar/snackbar.styles.d.ts +1 -0
  168. package/dist/components/snackbar/snackbar.types.d.ts +1 -0
  169. package/dist/components/spinner/index.d.ts +8 -0
  170. package/dist/components/spinner/index.js +131 -0
  171. package/dist/components/spinner/spineer.styles.d.ts +1 -0
  172. package/dist/components/spinner/spinner.d.ts +52 -0
  173. package/dist/components/spinner/spinner.types.d.ts +18 -0
  174. package/dist/components/surface/index.d.ts +8 -0
  175. package/dist/components/surface/index.js +128 -0
  176. package/dist/components/surface/surface.d.ts +48 -0
  177. package/dist/components/surface/surface.styles.d.ts +1 -0
  178. package/dist/components/surface/surface.types.d.ts +20 -0
  179. package/dist/components/switch/index.d.ts +8 -0
  180. package/dist/components/switch/index.js +293 -0
  181. package/dist/components/switch/switch.d.ts +90 -0
  182. package/dist/components/switch/switch.styles.d.ts +1 -0
  183. package/dist/components/switch/switch.types.d.ts +21 -0
  184. package/dist/components/tab/index.d.ts +9 -0
  185. package/dist/components/tab/index.js +252 -0
  186. package/dist/components/tab/tab-panel.d.ts +28 -0
  187. package/dist/components/tab/tab-panel.styles.d.ts +1 -0
  188. package/dist/components/tab/tab.d.ts +59 -0
  189. package/dist/components/tab/tab.styles.d.ts +1 -0
  190. package/dist/components/tab/tab.types.d.ts +7 -0
  191. package/dist/components/tab-group/index.d.ts +8 -0
  192. package/dist/components/tab-group/index.js +441 -0
  193. package/dist/components/tab-group/tab-group.d.ts +99 -0
  194. package/dist/components/tab-group/tab-group.styles.d.ts +1 -0
  195. package/dist/components/tab-group/tab-group.types.d.ts +11 -0
  196. package/dist/components/table/index.d.ts +2 -0
  197. package/dist/components/table/index.js +582 -0
  198. package/dist/components/table/table.d.ts +160 -0
  199. package/dist/components/table/table.styles.d.ts +1 -0
  200. package/dist/components/table/table.types.d.ts +106 -0
  201. package/dist/components/text/index.d.ts +1 -0
  202. package/dist/components/text/index.js +207 -0
  203. package/dist/components/text/text.d.ts +32 -0
  204. package/dist/components/text/text.styles.d.ts +1 -0
  205. package/dist/components/text/text.types.d.ts +2 -0
  206. package/dist/components/textfield/index.d.ts +8 -0
  207. package/dist/components/textfield/index.js +718 -0
  208. package/dist/components/textfield/textfield.d.ts +168 -0
  209. package/dist/components/textfield/textfield.styles.d.ts +1 -0
  210. package/dist/components/textfield/textfield.types.d.ts +40 -0
  211. package/dist/components/tooltip/index.d.ts +2 -0
  212. package/dist/components/tooltip/index.js +379 -0
  213. package/dist/components/tooltip/tooltip.d.ts +42 -0
  214. package/dist/components/tooltip/tooltip.styles.d.ts +1 -0
  215. package/dist/components/tooltip/tooltip.types.d.ts +1 -0
  216. package/dist/css/font-face.css +22 -0
  217. package/dist/css/latty.css +57 -0
  218. package/dist/fonts/HankenGrotesk-Variable.woff2 +0 -0
  219. package/dist/fonts/HankenGrotesk-VariableItalic.woff2 +0 -0
  220. package/dist/index.cjs +12739 -0
  221. package/dist/index.d.ts +101 -0
  222. package/dist/index.js +11406 -0
  223. package/dist/manifest.json +2396 -0
  224. package/dist/utils/click-outside.d.ts +22 -0
  225. package/dist/utils/color.d.ts +14 -0
  226. package/dist/utils/dispatch.d.ts +18 -0
  227. package/dist/utils/index.d.ts +3 -0
  228. package/package.json +231 -0
@@ -0,0 +1,768 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+
12
+ // src/components/sidepanel/sidepanel.ts
13
+ import { html as html3 } from "lit";
14
+
15
+ // src/base/themeable-element.ts
16
+ import { LitElement } from "lit";
17
+ import { property } from "lit/decorators.js";
18
+ var ThemeableElement = class extends LitElement {
19
+ willUpdate(changed) {
20
+ super.willUpdate(changed);
21
+ if (changed.has("theme")) {
22
+ this._syncThemeAttribute();
23
+ }
24
+ }
25
+ _syncThemeAttribute() {
26
+ if (this.theme === "dark" || this.theme === "light") {
27
+ this.setAttribute("data-theme", this.theme);
28
+ } else {
29
+ this.removeAttribute("data-theme");
30
+ }
31
+ }
32
+ };
33
+ __decorateClass([
34
+ property({ reflect: true })
35
+ ], ThemeableElement.prototype, "theme", 2);
36
+
37
+ // src/components/sidepanel/sidepanel.ts
38
+ import { customElement as customElement3, property as property4 } from "lit/decorators.js";
39
+
40
+ // src/components/sidepanel/sidepanel.styles.ts
41
+ import { css } from "lit";
42
+ var sidepanelStyles = css`
43
+ :host {
44
+ display: contents;
45
+ }
46
+
47
+ /* ── Overlay ────────────────────────────────────────────────────────────── */
48
+
49
+ [part='overlay'] {
50
+ position: fixed;
51
+ inset: 0;
52
+ background: rgba(0, 0, 0, var(--lt-sidepanel-overlay-opacity, 0.45));
53
+ z-index: 400;
54
+ opacity: 0;
55
+ pointer-events: none;
56
+ transition: opacity 200ms ease;
57
+ }
58
+
59
+ /* ── Panel ──────────────────────────────────────────────────────────────── */
60
+
61
+ [part='panel'] {
62
+ position: fixed;
63
+ background: var(--lt-bg-default);
64
+ display: flex;
65
+ flex-direction: column;
66
+ z-index: 401;
67
+ pointer-events: none;
68
+ transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1);
69
+ }
70
+
71
+ /* ── Anchors — initial off-screen positions ─────────────────────────────── */
72
+
73
+ :host([anchor='left']) [part='panel'],
74
+ :host(:not([anchor])) [part='panel'] {
75
+ inset-block: 0;
76
+ left: 0;
77
+ transform: translateX(-100%);
78
+ box-shadow: 4px 0 24px rgba(0, 0, 0, 0.12);
79
+ }
80
+
81
+ :host([anchor='right']) [part='panel'] {
82
+ inset-block: 0;
83
+ right: 0;
84
+ transform: translateX(100%);
85
+ box-shadow: -4px 0 24px rgba(0, 0, 0, 0.12);
86
+ }
87
+
88
+ :host([anchor='top']) [part='panel'] {
89
+ inset-inline: 0;
90
+ top: 0;
91
+ transform: translateY(-100%);
92
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12);
93
+ }
94
+
95
+ :host([anchor='bottom']) [part='panel'] {
96
+ inset-inline: 0;
97
+ bottom: 0;
98
+ transform: translateY(100%);
99
+ box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.12);
100
+ }
101
+
102
+ /* ── Open state — must come after anchors to win the cascade ────────────── */
103
+
104
+ :host([open]) [part='overlay'] {
105
+ opacity: 1;
106
+ pointer-events: auto;
107
+ }
108
+
109
+ :host([open]) [part='panel'] {
110
+ transform: translate(0, 0);
111
+ pointer-events: auto;
112
+ }
113
+
114
+ /* ── Header ─────────────────────────────────────────────────────────────── */
115
+
116
+ .header {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: var(--lt-spacing-4);
120
+ padding: var(--lt-spacing-4) var(--lt-spacing-5);
121
+ border-bottom: 1px solid var(--lt-border-default);
122
+ flex-shrink: 0;
123
+ }
124
+
125
+ .panel-label {
126
+ flex: 1;
127
+ color: var(--lt-text-default);
128
+ }
129
+
130
+ .close-button {
131
+ flex-shrink: 0;
132
+ margin-left: auto;
133
+ }
134
+
135
+ /* ── Body ───────────────────────────────────────────────────────────────── */
136
+
137
+ .body {
138
+ flex: 1;
139
+ overflow-y: auto;
140
+ }
141
+
142
+ /* ── Reduced motion ─────────────────────────────────────────────────────── */
143
+
144
+ @media (prefers-reduced-motion: reduce) {
145
+ [part='overlay'],
146
+ [part='panel'] {
147
+ transition: none;
148
+ }
149
+ }
150
+ `;
151
+
152
+ // src/components/shared/backdrop.styles.ts
153
+ import { css as css2 } from "lit";
154
+ var backdropFeatureStyles = css2`
155
+ :host([backdrop-blur]) .backdrop,
156
+ :host([backdrop-blur]) [part='overlay'] {
157
+ backdrop-filter: blur(6px);
158
+ -webkit-backdrop-filter: blur(6px);
159
+ }
160
+ `;
161
+
162
+ // src/utils/dispatch.ts
163
+ var dispatch = (host, name, detail, init) => host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true, ...init }));
164
+
165
+ // src/components/icon-button/icon-button.ts
166
+ import { html, nothing } from "lit";
167
+ import { customElement, property as property2 } from "lit/decorators.js";
168
+ import { ifDefined } from "lit/directives/if-defined.js";
169
+
170
+ // src/components/icon-button/icon-button.styles.ts
171
+ import { css as css3 } from "lit";
172
+ var iconButtonStyles = css3`
173
+ :host {
174
+ display: inline-flex;
175
+
176
+ /* Internal state props — set per variant/appearance below */
177
+ --_color: var(--lt-text-subtle);
178
+ --_bg: transparent;
179
+ --_border-color: transparent;
180
+ --_hover-bg: var(--lt-bg-subtle);
181
+ --_hover-color: var(--lt-text-default);
182
+ --_active-bg: var(--lt-bg-subtle);
183
+ }
184
+
185
+ [part='base'] {
186
+ align-items: center;
187
+ background: var(--lt-icon-button-bg, var(--_bg));
188
+ border-radius: var(--lt-border-radius);
189
+ border: 1px solid var(--lt-icon-button-border-color, var(--_border-color));
190
+ box-sizing: border-box;
191
+ color: var(--lt-icon-button-color, var(--_color));
192
+ cursor: pointer;
193
+ display: inline-flex;
194
+ justify-content: center;
195
+ padding: 0;
196
+ transition:
197
+ background-color 120ms ease,
198
+ border-color 120ms ease,
199
+ transform 50ms ease;
200
+ user-select: none;
201
+ }
202
+
203
+ [part='base']:hover:not([disabled]) {
204
+ background: var(--lt-icon-button-hover-bg, var(--_hover-bg));
205
+ color: var(--lt-icon-button-hover-color, var(--lt-icon-button-color, var(--_hover-color)));
206
+ }
207
+
208
+ [part='base']:active {
209
+ transform: translateY(1px);
210
+ }
211
+
212
+ [part='base']:active:not([disabled]) {
213
+ background: var(--lt-icon-button-hover-bg, var(--_active-bg));
214
+ }
215
+
216
+ [part='base']:focus-visible {
217
+ outline: 3px solid var(--lt-border-focus);
218
+ outline-offset: 2px;
219
+ }
220
+
221
+ [part='base'][disabled] {
222
+ cursor: not-allowed;
223
+ opacity: 0.5;
224
+ pointer-events: none;
225
+ transform: none;
226
+ }
227
+
228
+ a[part='base'] {
229
+ text-decoration: none;
230
+ color: inherit;
231
+ }
232
+
233
+ /* sizes */
234
+ :host([size='sm']) [part='base'] {
235
+ height: 28px;
236
+ width: 28px;
237
+ }
238
+
239
+ :host([size='md']) [part='base'] {
240
+ height: 36px;
241
+ width: 36px;
242
+ }
243
+
244
+ :host([size='lg']) [part='base'] {
245
+ height: 44px;
246
+ width: 44px;
247
+ }
248
+
249
+ /* ── ghost ────────────────────────────────────────────────── */
250
+ :host([appearance='ghost'][variant='primary']) {
251
+ --_color: var(--lt-text-primary);
252
+ --_hover-bg: var(--lt-bg-primary-subtle);
253
+ --_hover-color: var(--lt-text-primary);
254
+ --_active-bg: var(--lt-bg-primary-subtle);
255
+ }
256
+ :host([appearance='ghost'][variant='secondary']) {
257
+ --_color: var(--lt-text-secondary);
258
+ --_hover-bg: var(--lt-bg-secondary-subtle);
259
+ --_hover-color: var(--lt-text-secondary);
260
+ --_active-bg: var(--lt-bg-secondary-subtle);
261
+ }
262
+ :host([appearance='ghost'][variant='success']) {
263
+ --_color: var(--lt-text-success);
264
+ --_hover-bg: var(--lt-bg-success-subtle);
265
+ --_hover-color: var(--lt-text-success);
266
+ --_active-bg: var(--lt-bg-success-subtle);
267
+ }
268
+ :host([appearance='ghost'][variant='warning']) {
269
+ --_color: var(--lt-text-warning);
270
+ --_hover-bg: var(--lt-bg-warning-subtle);
271
+ --_hover-color: var(--lt-text-warning);
272
+ --_active-bg: var(--lt-bg-warning-subtle);
273
+ }
274
+ :host([appearance='ghost'][variant='error']) {
275
+ --_color: var(--lt-text-error);
276
+ --_hover-bg: var(--lt-bg-error-subtle);
277
+ --_hover-color: var(--lt-text-error);
278
+ --_active-bg: var(--lt-bg-error-subtle);
279
+ }
280
+ :host([appearance='ghost'][variant='info']) {
281
+ --_color: var(--lt-text-info);
282
+ --_hover-bg: var(--lt-bg-info-subtle);
283
+ --_hover-color: var(--lt-text-info);
284
+ --_active-bg: var(--lt-bg-info-subtle);
285
+ }
286
+
287
+ /* ── filled ───────────────────────────────────────────────── */
288
+ :host([appearance='filled'][variant='primary']) {
289
+ --_bg: var(--lt-interactive-primary-bg);
290
+ --_color: var(--lt-text-on-primary);
291
+ --_hover-bg: var(--lt-interactive-primary-bg-hover);
292
+ --_hover-color: var(--lt-text-on-primary);
293
+ --_active-bg: var(--lt-interactive-primary-bg-active);
294
+ }
295
+ :host([appearance='filled'][variant='secondary']) {
296
+ --_bg: var(--lt-interactive-secondary-bg);
297
+ --_color: var(--lt-text-on-secondary);
298
+ --_hover-bg: var(--lt-interactive-secondary-bg-hover);
299
+ --_hover-color: var(--lt-text-on-secondary);
300
+ --_active-bg: var(--lt-interactive-secondary-bg-active);
301
+ }
302
+ :host([appearance='filled'][variant='neutral']) {
303
+ --_bg: var(--lt-color-neutral-500);
304
+ --_color: var(--lt-color-neutral-50);
305
+ --_hover-bg: var(--lt-color-neutral-700);
306
+ --_hover-color: var(--lt-color-neutral-50);
307
+ --_active-bg: var(--lt-color-neutral-800);
308
+ }
309
+ :host([appearance='filled'][variant='success']) {
310
+ --_bg: var(--lt-interactive-success-bg);
311
+ --_color: var(--lt-text-on-success);
312
+ --_hover-bg: var(--lt-interactive-success-bg-hover);
313
+ --_hover-color: var(--lt-text-on-success);
314
+ --_active-bg: var(--lt-interactive-success-bg-active);
315
+ }
316
+ :host([appearance='filled'][variant='warning']) {
317
+ --_bg: var(--lt-interactive-warning-bg);
318
+ --_color: var(--lt-text-on-warning);
319
+ --_hover-bg: var(--lt-interactive-warning-bg-hover);
320
+ --_hover-color: var(--lt-text-on-warning);
321
+ --_active-bg: var(--lt-interactive-warning-bg-active);
322
+ }
323
+ :host([appearance='filled'][variant='error']) {
324
+ --_bg: var(--lt-interactive-error-bg);
325
+ --_color: var(--lt-text-on-error);
326
+ --_hover-bg: var(--lt-interactive-error-bg-hover);
327
+ --_hover-color: var(--lt-text-on-error);
328
+ --_active-bg: var(--lt-interactive-error-bg-active);
329
+ }
330
+ :host([appearance='filled'][variant='info']) {
331
+ --_bg: var(--lt-interactive-info-bg);
332
+ --_color: var(--lt-text-on-info);
333
+ --_hover-bg: var(--lt-interactive-info-bg-hover);
334
+ --_hover-color: var(--lt-text-on-info);
335
+ --_active-bg: var(--lt-interactive-info-bg-active);
336
+ }
337
+
338
+ /* ── outlined ─────────────────────────────────────────────── */
339
+ :host([appearance='outlined'][variant='primary']) {
340
+ --_color: var(--lt-text-primary);
341
+ --_border-color: var(--lt-border-primary-strong);
342
+ --_hover-bg: var(--lt-bg-primary-subtle);
343
+ --_hover-color: var(--lt-text-primary);
344
+ --_active-bg: var(--lt-bg-primary-subtle);
345
+ }
346
+ :host([appearance='outlined'][variant='secondary']) {
347
+ --_color: var(--lt-text-secondary);
348
+ --_border-color: var(--lt-border-secondary-strong);
349
+ --_hover-bg: var(--lt-bg-secondary-subtle);
350
+ --_hover-color: var(--lt-text-secondary);
351
+ --_active-bg: var(--lt-bg-secondary-subtle);
352
+ }
353
+ :host([appearance='outlined'][variant='neutral']) {
354
+ --_color: var(--lt-text-neutral);
355
+ --_border-color: var(--lt-border-strong);
356
+ --_hover-bg: var(--lt-bg-subtle);
357
+ --_hover-color: var(--lt-text-default);
358
+ --_active-bg: var(--lt-bg-subtle);
359
+ }
360
+ :host([appearance='outlined'][variant='success']) {
361
+ --_color: var(--lt-text-success);
362
+ --_border-color: var(--lt-border-success-strong);
363
+ --_hover-bg: var(--lt-bg-success-subtle);
364
+ --_hover-color: var(--lt-text-success);
365
+ --_active-bg: var(--lt-bg-success-subtle);
366
+ }
367
+ :host([appearance='outlined'][variant='warning']) {
368
+ --_color: var(--lt-text-warning);
369
+ --_border-color: var(--lt-border-warning-strong);
370
+ --_hover-bg: var(--lt-bg-warning-subtle);
371
+ --_hover-color: var(--lt-text-warning);
372
+ --_active-bg: var(--lt-bg-warning-subtle);
373
+ }
374
+ :host([appearance='outlined'][variant='error']) {
375
+ --_color: var(--lt-text-error);
376
+ --_border-color: var(--lt-border-error-strong);
377
+ --_hover-bg: var(--lt-bg-error-subtle);
378
+ --_hover-color: var(--lt-text-error);
379
+ --_active-bg: var(--lt-bg-error-subtle);
380
+ }
381
+ :host([appearance='outlined'][variant='info']) {
382
+ --_color: var(--lt-text-info);
383
+ --_border-color: var(--lt-border-info-strong);
384
+ --_hover-bg: var(--lt-bg-info-subtle);
385
+ --_hover-color: var(--lt-text-info);
386
+ --_active-bg: var(--lt-bg-info-subtle);
387
+ }
388
+
389
+ /* round shape */
390
+ :host([round]) [part='base'] {
391
+ border-radius: 50%;
392
+ }
393
+ `;
394
+
395
+ // src/components/icon-button/icon-button.ts
396
+ import "@latty-ds/icons";
397
+ var IconButton = class extends ThemeableElement {
398
+ constructor() {
399
+ super(...arguments);
400
+ this.icon = "";
401
+ this.label = "";
402
+ this.variant = "neutral";
403
+ this.appearance = "ghost";
404
+ this.size = "md";
405
+ this.disabled = false;
406
+ this.href = "";
407
+ this.target = "";
408
+ this.rel = "";
409
+ this.round = false;
410
+ }
411
+ _inner() {
412
+ return this.icon ? html`<lt-icon name=${this.icon}></lt-icon>` : html`<slot></slot>`;
413
+ }
414
+ render() {
415
+ const label = this.label || void 0;
416
+ if (this.href) {
417
+ const rel = this.rel || (this.target === "_blank" ? "noopener noreferrer" : void 0);
418
+ return html`
419
+ <a
420
+ part="base"
421
+ href=${this.href}
422
+ target=${ifDefined(this.target || void 0)}
423
+ rel=${ifDefined(rel)}
424
+ aria-label=${ifDefined(label)}
425
+ aria-disabled=${this.disabled ? "true" : nothing}
426
+ tabindex=${this.disabled ? "-1" : nothing}
427
+ >
428
+ ${this._inner()}
429
+ </a>
430
+ `;
431
+ }
432
+ return html`
433
+ <button part="base" ?disabled=${this.disabled} aria-label=${ifDefined(label)}>${this._inner()}</button>
434
+ `;
435
+ }
436
+ };
437
+ IconButton.styles = iconButtonStyles;
438
+ __decorateClass([
439
+ property2({ reflect: true })
440
+ ], IconButton.prototype, "icon", 2);
441
+ __decorateClass([
442
+ property2({ reflect: true })
443
+ ], IconButton.prototype, "label", 2);
444
+ __decorateClass([
445
+ property2({ reflect: true })
446
+ ], IconButton.prototype, "variant", 2);
447
+ __decorateClass([
448
+ property2({ reflect: true })
449
+ ], IconButton.prototype, "appearance", 2);
450
+ __decorateClass([
451
+ property2({ reflect: true })
452
+ ], IconButton.prototype, "size", 2);
453
+ __decorateClass([
454
+ property2({ type: Boolean, reflect: true })
455
+ ], IconButton.prototype, "disabled", 2);
456
+ __decorateClass([
457
+ property2()
458
+ ], IconButton.prototype, "href", 2);
459
+ __decorateClass([
460
+ property2()
461
+ ], IconButton.prototype, "target", 2);
462
+ __decorateClass([
463
+ property2()
464
+ ], IconButton.prototype, "rel", 2);
465
+ __decorateClass([
466
+ property2({ type: Boolean, reflect: true })
467
+ ], IconButton.prototype, "round", 2);
468
+ IconButton = __decorateClass([
469
+ customElement("lt-icon-button")
470
+ ], IconButton);
471
+
472
+ // src/components/text/text.ts
473
+ import { customElement as customElement2, property as property3 } from "lit/decorators.js";
474
+ import { html as html2, unsafeStatic } from "lit/static-html.js";
475
+
476
+ // src/components/text/text.styles.ts
477
+ import { css as css4 } from "lit";
478
+ var textStyles = css4`
479
+ :host {
480
+ display: block;
481
+ color: inherit;
482
+ }
483
+
484
+ /* Inline variants sit in text flow */
485
+ :host([variant='caption']),
486
+ :host([variant='overline']),
487
+ :host([variant='label']) {
488
+ display: inline;
489
+ }
490
+
491
+ [part='base'] {
492
+ margin: 0;
493
+ color: inherit;
494
+ font-family: var(--lt-typography-fontfamily);
495
+ }
496
+
497
+ /* ── Display ─────────────────────────────────────────────────────────── */
498
+
499
+ :host([variant='display-2xl']) [part='base'] {
500
+ font-size: clamp(2.5rem, 6vw, 4.5rem);
501
+ font-weight: var(--lt-text-weight, 200);
502
+ line-height: 1.1;
503
+ letter-spacing: -0.02em;
504
+ }
505
+
506
+ :host([variant='display-xl']) [part='base'] {
507
+ font-size: clamp(2rem, 5vw, 3.75rem);
508
+ font-weight: var(--lt-text-weight, 200);
509
+ line-height: 1.1;
510
+ letter-spacing: -0.02em;
511
+ }
512
+
513
+ :host([variant='display-lg']) [part='base'] {
514
+ font-size: clamp(2rem, 4vw, 3rem);
515
+ font-weight: var(--lt-text-weight, 200);
516
+ line-height: 1.15;
517
+ letter-spacing: -0.01em;
518
+ }
519
+
520
+ /* ── Headings ─────────────────────────────────────────────────────────── */
521
+
522
+ :host([variant='h1']) [part='base'] {
523
+ font-size: clamp(1.75rem, 2.5vw + 0.75rem, 2.5rem);
524
+ font-weight: var(--lt-text-weight, 600);
525
+ line-height: 1.2;
526
+ letter-spacing: -0.02em;
527
+ }
528
+
529
+ :host([variant='h2']) [part='base'] {
530
+ font-size: clamp(1.5rem, 2vw + 0.5rem, 2rem);
531
+ font-weight: var(--lt-text-weight, 600);
532
+ line-height: 1.25;
533
+ letter-spacing: -0.01em;
534
+ }
535
+
536
+ :host([variant='h3']) [part='base'] {
537
+ font-size: clamp(1.25rem, 1.5vw + 0.5rem, 1.5rem);
538
+ font-weight: var(--lt-text-weight, 600);
539
+ line-height: 1.3;
540
+ }
541
+
542
+ :host([variant='h4']) [part='base'] {
543
+ font-size: 1.25rem;
544
+ font-weight: var(--lt-text-weight, 600);
545
+ line-height: 1.35;
546
+ }
547
+
548
+ :host([variant='h5']) [part='base'] {
549
+ font-size: 1.125rem;
550
+ font-weight: var(--lt-text-weight, 600);
551
+ line-height: 1.4;
552
+ }
553
+
554
+ :host([variant='h6']) [part='base'] {
555
+ font-size: 1rem;
556
+ font-weight: var(--lt-text-weight, 600);
557
+ line-height: 1.4;
558
+ }
559
+
560
+ /* ── Body ─────────────────────────────────────────────────────────────── */
561
+
562
+ :host([variant='lead']) [part='base'] {
563
+ font-size: 1.25rem;
564
+ font-weight: var(--lt-text-weight, 400);
565
+ line-height: 1.6;
566
+ }
567
+
568
+ :host([variant='body']) [part='base'],
569
+ :host(:not([variant])) [part='base'] {
570
+ font-size: 1rem;
571
+ font-weight: var(--lt-text-weight, 400);
572
+ line-height: 1.6;
573
+ }
574
+
575
+ :host([variant='body-sm']) [part='base'] {
576
+ font-size: 0.875rem;
577
+ font-weight: var(--lt-text-weight, 400);
578
+ line-height: 1.6;
579
+ }
580
+
581
+ /* ── Inline ───────────────────────────────────────────────────────────── */
582
+
583
+ :host([variant='caption']) [part='base'] {
584
+ font-size: 0.75rem;
585
+ font-weight: var(--lt-text-weight, 400);
586
+ line-height: 1.5;
587
+ }
588
+
589
+ :host([variant='overline']) [part='base'] {
590
+ font-size: 0.6875rem;
591
+ font-weight: var(--lt-text-weight, 600);
592
+ line-height: 1.2;
593
+ letter-spacing: 0.08em;
594
+ text-transform: uppercase;
595
+ }
596
+
597
+ :host([variant='label']) [part='base'] {
598
+ font-size: 0.875rem;
599
+ font-weight: var(--lt-text-weight, 600);
600
+ line-height: 1.4;
601
+ }
602
+ `;
603
+
604
+ // src/components/text/text.ts
605
+ var VARIANT_TAG = {
606
+ "display-2xl": "p",
607
+ "display-xl": "p",
608
+ "display-lg": "p",
609
+ h1: "h1",
610
+ h2: "h2",
611
+ h3: "h3",
612
+ h4: "h4",
613
+ h5: "h5",
614
+ h6: "h6",
615
+ lead: "p",
616
+ body: "p",
617
+ "body-sm": "p",
618
+ caption: "span",
619
+ overline: "span",
620
+ label: "span"
621
+ };
622
+ var Text = class extends ThemeableElement {
623
+ constructor() {
624
+ super(...arguments);
625
+ this.variant = "body";
626
+ this.as = "";
627
+ }
628
+ render() {
629
+ const tag = unsafeStatic(this.as || VARIANT_TAG[this.variant] || "p");
630
+ return html2`<${tag} part="base"><slot></slot></${tag}>`;
631
+ }
632
+ };
633
+ Text.styles = textStyles;
634
+ __decorateClass([
635
+ property3({ reflect: true })
636
+ ], Text.prototype, "variant", 2);
637
+ __decorateClass([
638
+ property3({ reflect: true })
639
+ ], Text.prototype, "as", 2);
640
+ Text = __decorateClass([
641
+ customElement2("lt-text")
642
+ ], Text);
643
+
644
+ // src/components/sidepanel/sidepanel.ts
645
+ var SidePanel = class extends ThemeableElement {
646
+ constructor() {
647
+ super(...arguments);
648
+ this.open = false;
649
+ this.anchor = "left";
650
+ this.size = "320px";
651
+ this.label = "";
652
+ this.noCloseButton = false;
653
+ this.backdropBlur = false;
654
+ this.overlayOpacity = 0.45;
655
+ this._handleKeyDown = (e) => {
656
+ if (e.key === "Escape" && this.open) this.hide();
657
+ };
658
+ }
659
+ /** Open the panel. */
660
+ show() {
661
+ this.open = true;
662
+ }
663
+ /** Close the panel. */
664
+ hide() {
665
+ this.open = false;
666
+ dispatch(this, "close");
667
+ }
668
+ /** Toggle the panel open/closed. */
669
+ toggle() {
670
+ if (this.open) this.hide();
671
+ else this.show();
672
+ }
673
+ connectedCallback() {
674
+ super.connectedCallback();
675
+ window.addEventListener("keydown", this._handleKeyDown);
676
+ }
677
+ disconnectedCallback() {
678
+ super.disconnectedCallback();
679
+ window.removeEventListener("keydown", this._handleKeyDown);
680
+ }
681
+ updated(changed) {
682
+ if (!changed.has("anchor")) return;
683
+ const panel = this.shadowRoot?.querySelector('[part="panel"]');
684
+ if (!panel) return;
685
+ panel.style.transition = "none";
686
+ if (this.open) {
687
+ panel.style.transform = this._offScreenTransform;
688
+ }
689
+ void panel.getBoundingClientRect();
690
+ requestAnimationFrame(() => {
691
+ panel.style.transition = "";
692
+ panel.style.transform = "";
693
+ });
694
+ }
695
+ get _offScreenTransform() {
696
+ switch (this.anchor) {
697
+ case "right":
698
+ return "translateX(100%)";
699
+ case "top":
700
+ return "translateY(-100%)";
701
+ case "bottom":
702
+ return "translateY(100%)";
703
+ default:
704
+ return "translateX(-100%)";
705
+ }
706
+ }
707
+ get _panelStyle() {
708
+ return this.anchor === "left" || this.anchor === "right" ? `width: ${this.size}` : `height: ${this.size}`;
709
+ }
710
+ _renderHeader() {
711
+ const hasLabel = this.label.trim().length > 0;
712
+ if (!hasLabel && this.noCloseButton) return "";
713
+ return html3`
714
+ <div part="header" class="header">
715
+ ${hasLabel ? html3`<lt-text variant="h6" class="panel-label">${this.label}</lt-text>` : ""}
716
+ ${!this.noCloseButton ? html3`
717
+ <lt-icon-button
718
+ part="close-button"
719
+ class="close-button"
720
+ icon="xmark"
721
+ label="Close panel"
722
+ size="sm"
723
+ @click=${this.hide}
724
+ ></lt-icon-button>
725
+ ` : ""}
726
+ </div>
727
+ `;
728
+ }
729
+ render() {
730
+ return html3`
731
+ <div part="overlay" style="--_overlay-opacity: ${this.overlayOpacity}" @click=${this.hide}></div>
732
+ <div part="panel" style=${this._panelStyle} role="dialog" aria-modal="true">
733
+ ${this._renderHeader()}
734
+ <div part="body" class="body">
735
+ <slot></slot>
736
+ </div>
737
+ </div>
738
+ `;
739
+ }
740
+ };
741
+ SidePanel.styles = [sidepanelStyles, backdropFeatureStyles];
742
+ __decorateClass([
743
+ property4({ type: Boolean, reflect: true })
744
+ ], SidePanel.prototype, "open", 2);
745
+ __decorateClass([
746
+ property4({ reflect: true })
747
+ ], SidePanel.prototype, "anchor", 2);
748
+ __decorateClass([
749
+ property4()
750
+ ], SidePanel.prototype, "size", 2);
751
+ __decorateClass([
752
+ property4()
753
+ ], SidePanel.prototype, "label", 2);
754
+ __decorateClass([
755
+ property4({ type: Boolean, attribute: "no-close-button" })
756
+ ], SidePanel.prototype, "noCloseButton", 2);
757
+ __decorateClass([
758
+ property4({ type: Boolean, reflect: true, attribute: "backdrop-blur" })
759
+ ], SidePanel.prototype, "backdropBlur", 2);
760
+ __decorateClass([
761
+ property4({ type: Number, attribute: "overlay-opacity" })
762
+ ], SidePanel.prototype, "overlayOpacity", 2);
763
+ SidePanel = __decorateClass([
764
+ customElement3("lt-sidepanel")
765
+ ], SidePanel);
766
+ export {
767
+ SidePanel
768
+ };