@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,19 @@
1
+ import { ThemeableElement } from '../../base';
2
+ import type { HeaderBackground } from './header.types';
3
+ /**
4
+ * A layout component that organises content into a sticky app bar.
5
+ * Renders a native `<header>` element for semantics and the ARIA `banner` landmark.
6
+ *
7
+ * @element lt-header
8
+ *
9
+ * @slot before - Far-left area, typically a hamburger menu or back button
10
+ * @slot logo - Logo or brand mark, placed to the right of `before`
11
+ * @slot content - Main content area (nav links, search…); stretches to fill available space
12
+ * @slot after - Far-right area, typically user actions or icons
13
+ */
14
+ export declare class Header extends ThemeableElement {
15
+ static styles: import("lit").CSSResult;
16
+ /** Background surface that controls the header's background and text colours. */
17
+ background: HeaderBackground;
18
+ render(): import("lit").TemplateResult<1>;
19
+ }
@@ -0,0 +1 @@
1
+ export declare const headerStyles: import("lit").CSSResult;
@@ -0,0 +1 @@
1
+ export type HeaderBackground = 'primary' | 'surface';
@@ -0,0 +1,2 @@
1
+ export { Header } from './header';
2
+ export type { HeaderBackground } from './header.types';
@@ -0,0 +1,104 @@
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/header/header.ts
13
+ import { html } 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/header/header.ts
38
+ import { customElement, property as property2 } from "lit/decorators.js";
39
+
40
+ // src/components/header/header.styles.ts
41
+ import { css } from "lit";
42
+ var headerStyles = css`
43
+ :host {
44
+ display: block;
45
+ position: sticky;
46
+ top: 0;
47
+ z-index: 100;
48
+ box-shadow: var(--lt-elevation-1);
49
+ }
50
+
51
+ :host([background='primary']) {
52
+ background: var(--lt-bg-primary);
53
+ color: var(--lt-text-inverse);
54
+ }
55
+
56
+ :host([background='surface']) {
57
+ background: var(--lt-bg-default);
58
+ color: var(--lt-text-default);
59
+ }
60
+
61
+ header {
62
+ display: flex;
63
+ align-items: center;
64
+ gap: var(--lt-spacing-2);
65
+ padding: 0 var(--lt-spacing-4);
66
+ min-height: var(--lt-spacing-px-16);
67
+ box-sizing: border-box;
68
+ color: inherit;
69
+ }
70
+
71
+ .content {
72
+ flex: 1;
73
+ display: flex;
74
+ align-items: center;
75
+ }
76
+ `;
77
+
78
+ // src/components/header/header.ts
79
+ var Header = class extends ThemeableElement {
80
+ constructor() {
81
+ super(...arguments);
82
+ this.background = "primary";
83
+ }
84
+ render() {
85
+ return html`
86
+ <header part="inner">
87
+ <slot name="before"></slot>
88
+ <slot name="logo"></slot>
89
+ <div class="content"><slot name="content"></slot></div>
90
+ <slot name="after"></slot>
91
+ </header>
92
+ `;
93
+ }
94
+ };
95
+ Header.styles = headerStyles;
96
+ __decorateClass([
97
+ property2({ reflect: true })
98
+ ], Header.prototype, "background", 2);
99
+ Header = __decorateClass([
100
+ customElement("lt-header")
101
+ ], Header);
102
+ export {
103
+ Header
104
+ };
@@ -0,0 +1,52 @@
1
+ import { ThemeableElement } from '../../base';
2
+ import type { IconButtonVariant, IconButtonAppearance, IconButtonSize } from './icon-button.types';
3
+ import '@latty-ds/icons';
4
+ /**
5
+ * Icon-only button. Requires `label` for screen readers since there is no visible text.
6
+ *
7
+ * @element lt-icon-button
8
+ *
9
+ * @example
10
+ * ```html
11
+ * <lt-icon-button icon="xmark" label="Close dialog"></lt-icon-button>
12
+ * ```
13
+ *
14
+ * @example
15
+ * ```html
16
+ * <lt-icon-button icon="plus" label="Add item" variant="primary" appearance="filled"></lt-icon-button>
17
+ * ```
18
+ */
19
+ export declare class IconButton extends ThemeableElement {
20
+ static styles: import("lit").CSSResult;
21
+ /** Icon name from the icon library. */
22
+ icon: string;
23
+ /** Accessible label for screen readers. Required when there is no visible text. */
24
+ label: string;
25
+ /**
26
+ * Visual variant that determines the icon/background color.
27
+ * @default 'neutral'
28
+ */
29
+ variant: IconButtonVariant;
30
+ /**
31
+ * Visual treatment.
32
+ * @default 'ghost'
33
+ */
34
+ appearance: IconButtonAppearance;
35
+ /**
36
+ * Size of the button.
37
+ * @default 'md'
38
+ */
39
+ size: IconButtonSize;
40
+ /** Whether the button is disabled. */
41
+ disabled: boolean;
42
+ /** When set, renders an `<a>` tag instead of `<button>`. */
43
+ href: string;
44
+ /** Forwarded to the anchor's `target` attribute when `href` is set. */
45
+ target: string;
46
+ /** Forwarded to the anchor's `rel` attribute when `href` is set. */
47
+ rel: string;
48
+ /** Renders as a circle instead of rounded-rectangle. */
49
+ round: boolean;
50
+ private _inner;
51
+ render(): import("lit").TemplateResult<1>;
52
+ }
@@ -0,0 +1 @@
1
+ export declare const iconButtonStyles: import("lit").CSSResult;
@@ -0,0 +1,8 @@
1
+ export type IconButtonVariant = 'primary' | 'secondary' | 'neutral' | 'success' | 'warning' | 'error' | 'info';
2
+ /**
3
+ * - `filled`: Solid background with the variant color
4
+ * - `outlined`: Transparent background with colored border
5
+ * - `ghost`: No border, subtle hover background — for close/dismiss buttons
6
+ */
7
+ export type IconButtonAppearance = 'filled' | 'outlined' | 'ghost';
8
+ export type IconButtonSize = 'sm' | 'md' | 'lg';
@@ -0,0 +1 @@
1
+ export { IconButton } from './icon-button';
@@ -0,0 +1,342 @@
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/icon-button/icon-button.ts
13
+ import { html, nothing } from "lit";
14
+ import { customElement, property as property2 } from "lit/decorators.js";
15
+ import { ifDefined } from "lit/directives/if-defined.js";
16
+
17
+ // src/base/themeable-element.ts
18
+ import { LitElement } from "lit";
19
+ import { property } from "lit/decorators.js";
20
+ var ThemeableElement = class extends LitElement {
21
+ willUpdate(changed) {
22
+ super.willUpdate(changed);
23
+ if (changed.has("theme")) {
24
+ this._syncThemeAttribute();
25
+ }
26
+ }
27
+ _syncThemeAttribute() {
28
+ if (this.theme === "dark" || this.theme === "light") {
29
+ this.setAttribute("data-theme", this.theme);
30
+ } else {
31
+ this.removeAttribute("data-theme");
32
+ }
33
+ }
34
+ };
35
+ __decorateClass([
36
+ property({ reflect: true })
37
+ ], ThemeableElement.prototype, "theme", 2);
38
+
39
+ // src/components/icon-button/icon-button.styles.ts
40
+ import { css } from "lit";
41
+ var iconButtonStyles = css`
42
+ :host {
43
+ display: inline-flex;
44
+
45
+ /* Internal state props — set per variant/appearance below */
46
+ --_color: var(--lt-text-subtle);
47
+ --_bg: transparent;
48
+ --_border-color: transparent;
49
+ --_hover-bg: var(--lt-bg-subtle);
50
+ --_hover-color: var(--lt-text-default);
51
+ --_active-bg: var(--lt-bg-subtle);
52
+ }
53
+
54
+ [part='base'] {
55
+ align-items: center;
56
+ background: var(--lt-icon-button-bg, var(--_bg));
57
+ border-radius: var(--lt-border-radius);
58
+ border: 1px solid var(--lt-icon-button-border-color, var(--_border-color));
59
+ box-sizing: border-box;
60
+ color: var(--lt-icon-button-color, var(--_color));
61
+ cursor: pointer;
62
+ display: inline-flex;
63
+ justify-content: center;
64
+ padding: 0;
65
+ transition:
66
+ background-color 120ms ease,
67
+ border-color 120ms ease,
68
+ transform 50ms ease;
69
+ user-select: none;
70
+ }
71
+
72
+ [part='base']:hover:not([disabled]) {
73
+ background: var(--lt-icon-button-hover-bg, var(--_hover-bg));
74
+ color: var(--lt-icon-button-hover-color, var(--lt-icon-button-color, var(--_hover-color)));
75
+ }
76
+
77
+ [part='base']:active {
78
+ transform: translateY(1px);
79
+ }
80
+
81
+ [part='base']:active:not([disabled]) {
82
+ background: var(--lt-icon-button-hover-bg, var(--_active-bg));
83
+ }
84
+
85
+ [part='base']:focus-visible {
86
+ outline: 3px solid var(--lt-border-focus);
87
+ outline-offset: 2px;
88
+ }
89
+
90
+ [part='base'][disabled] {
91
+ cursor: not-allowed;
92
+ opacity: 0.5;
93
+ pointer-events: none;
94
+ transform: none;
95
+ }
96
+
97
+ a[part='base'] {
98
+ text-decoration: none;
99
+ color: inherit;
100
+ }
101
+
102
+ /* sizes */
103
+ :host([size='sm']) [part='base'] {
104
+ height: 28px;
105
+ width: 28px;
106
+ }
107
+
108
+ :host([size='md']) [part='base'] {
109
+ height: 36px;
110
+ width: 36px;
111
+ }
112
+
113
+ :host([size='lg']) [part='base'] {
114
+ height: 44px;
115
+ width: 44px;
116
+ }
117
+
118
+ /* ── ghost ────────────────────────────────────────────────── */
119
+ :host([appearance='ghost'][variant='primary']) {
120
+ --_color: var(--lt-text-primary);
121
+ --_hover-bg: var(--lt-bg-primary-subtle);
122
+ --_hover-color: var(--lt-text-primary);
123
+ --_active-bg: var(--lt-bg-primary-subtle);
124
+ }
125
+ :host([appearance='ghost'][variant='secondary']) {
126
+ --_color: var(--lt-text-secondary);
127
+ --_hover-bg: var(--lt-bg-secondary-subtle);
128
+ --_hover-color: var(--lt-text-secondary);
129
+ --_active-bg: var(--lt-bg-secondary-subtle);
130
+ }
131
+ :host([appearance='ghost'][variant='success']) {
132
+ --_color: var(--lt-text-success);
133
+ --_hover-bg: var(--lt-bg-success-subtle);
134
+ --_hover-color: var(--lt-text-success);
135
+ --_active-bg: var(--lt-bg-success-subtle);
136
+ }
137
+ :host([appearance='ghost'][variant='warning']) {
138
+ --_color: var(--lt-text-warning);
139
+ --_hover-bg: var(--lt-bg-warning-subtle);
140
+ --_hover-color: var(--lt-text-warning);
141
+ --_active-bg: var(--lt-bg-warning-subtle);
142
+ }
143
+ :host([appearance='ghost'][variant='error']) {
144
+ --_color: var(--lt-text-error);
145
+ --_hover-bg: var(--lt-bg-error-subtle);
146
+ --_hover-color: var(--lt-text-error);
147
+ --_active-bg: var(--lt-bg-error-subtle);
148
+ }
149
+ :host([appearance='ghost'][variant='info']) {
150
+ --_color: var(--lt-text-info);
151
+ --_hover-bg: var(--lt-bg-info-subtle);
152
+ --_hover-color: var(--lt-text-info);
153
+ --_active-bg: var(--lt-bg-info-subtle);
154
+ }
155
+
156
+ /* ── filled ───────────────────────────────────────────────── */
157
+ :host([appearance='filled'][variant='primary']) {
158
+ --_bg: var(--lt-interactive-primary-bg);
159
+ --_color: var(--lt-text-on-primary);
160
+ --_hover-bg: var(--lt-interactive-primary-bg-hover);
161
+ --_hover-color: var(--lt-text-on-primary);
162
+ --_active-bg: var(--lt-interactive-primary-bg-active);
163
+ }
164
+ :host([appearance='filled'][variant='secondary']) {
165
+ --_bg: var(--lt-interactive-secondary-bg);
166
+ --_color: var(--lt-text-on-secondary);
167
+ --_hover-bg: var(--lt-interactive-secondary-bg-hover);
168
+ --_hover-color: var(--lt-text-on-secondary);
169
+ --_active-bg: var(--lt-interactive-secondary-bg-active);
170
+ }
171
+ :host([appearance='filled'][variant='neutral']) {
172
+ --_bg: var(--lt-color-neutral-500);
173
+ --_color: var(--lt-color-neutral-50);
174
+ --_hover-bg: var(--lt-color-neutral-700);
175
+ --_hover-color: var(--lt-color-neutral-50);
176
+ --_active-bg: var(--lt-color-neutral-800);
177
+ }
178
+ :host([appearance='filled'][variant='success']) {
179
+ --_bg: var(--lt-interactive-success-bg);
180
+ --_color: var(--lt-text-on-success);
181
+ --_hover-bg: var(--lt-interactive-success-bg-hover);
182
+ --_hover-color: var(--lt-text-on-success);
183
+ --_active-bg: var(--lt-interactive-success-bg-active);
184
+ }
185
+ :host([appearance='filled'][variant='warning']) {
186
+ --_bg: var(--lt-interactive-warning-bg);
187
+ --_color: var(--lt-text-on-warning);
188
+ --_hover-bg: var(--lt-interactive-warning-bg-hover);
189
+ --_hover-color: var(--lt-text-on-warning);
190
+ --_active-bg: var(--lt-interactive-warning-bg-active);
191
+ }
192
+ :host([appearance='filled'][variant='error']) {
193
+ --_bg: var(--lt-interactive-error-bg);
194
+ --_color: var(--lt-text-on-error);
195
+ --_hover-bg: var(--lt-interactive-error-bg-hover);
196
+ --_hover-color: var(--lt-text-on-error);
197
+ --_active-bg: var(--lt-interactive-error-bg-active);
198
+ }
199
+ :host([appearance='filled'][variant='info']) {
200
+ --_bg: var(--lt-interactive-info-bg);
201
+ --_color: var(--lt-text-on-info);
202
+ --_hover-bg: var(--lt-interactive-info-bg-hover);
203
+ --_hover-color: var(--lt-text-on-info);
204
+ --_active-bg: var(--lt-interactive-info-bg-active);
205
+ }
206
+
207
+ /* ── outlined ─────────────────────────────────────────────── */
208
+ :host([appearance='outlined'][variant='primary']) {
209
+ --_color: var(--lt-text-primary);
210
+ --_border-color: var(--lt-border-primary-strong);
211
+ --_hover-bg: var(--lt-bg-primary-subtle);
212
+ --_hover-color: var(--lt-text-primary);
213
+ --_active-bg: var(--lt-bg-primary-subtle);
214
+ }
215
+ :host([appearance='outlined'][variant='secondary']) {
216
+ --_color: var(--lt-text-secondary);
217
+ --_border-color: var(--lt-border-secondary-strong);
218
+ --_hover-bg: var(--lt-bg-secondary-subtle);
219
+ --_hover-color: var(--lt-text-secondary);
220
+ --_active-bg: var(--lt-bg-secondary-subtle);
221
+ }
222
+ :host([appearance='outlined'][variant='neutral']) {
223
+ --_color: var(--lt-text-neutral);
224
+ --_border-color: var(--lt-border-strong);
225
+ --_hover-bg: var(--lt-bg-subtle);
226
+ --_hover-color: var(--lt-text-default);
227
+ --_active-bg: var(--lt-bg-subtle);
228
+ }
229
+ :host([appearance='outlined'][variant='success']) {
230
+ --_color: var(--lt-text-success);
231
+ --_border-color: var(--lt-border-success-strong);
232
+ --_hover-bg: var(--lt-bg-success-subtle);
233
+ --_hover-color: var(--lt-text-success);
234
+ --_active-bg: var(--lt-bg-success-subtle);
235
+ }
236
+ :host([appearance='outlined'][variant='warning']) {
237
+ --_color: var(--lt-text-warning);
238
+ --_border-color: var(--lt-border-warning-strong);
239
+ --_hover-bg: var(--lt-bg-warning-subtle);
240
+ --_hover-color: var(--lt-text-warning);
241
+ --_active-bg: var(--lt-bg-warning-subtle);
242
+ }
243
+ :host([appearance='outlined'][variant='error']) {
244
+ --_color: var(--lt-text-error);
245
+ --_border-color: var(--lt-border-error-strong);
246
+ --_hover-bg: var(--lt-bg-error-subtle);
247
+ --_hover-color: var(--lt-text-error);
248
+ --_active-bg: var(--lt-bg-error-subtle);
249
+ }
250
+ :host([appearance='outlined'][variant='info']) {
251
+ --_color: var(--lt-text-info);
252
+ --_border-color: var(--lt-border-info-strong);
253
+ --_hover-bg: var(--lt-bg-info-subtle);
254
+ --_hover-color: var(--lt-text-info);
255
+ --_active-bg: var(--lt-bg-info-subtle);
256
+ }
257
+
258
+ /* round shape */
259
+ :host([round]) [part='base'] {
260
+ border-radius: 50%;
261
+ }
262
+ `;
263
+
264
+ // src/components/icon-button/icon-button.ts
265
+ import "@latty-ds/icons";
266
+ var IconButton = class extends ThemeableElement {
267
+ constructor() {
268
+ super(...arguments);
269
+ this.icon = "";
270
+ this.label = "";
271
+ this.variant = "neutral";
272
+ this.appearance = "ghost";
273
+ this.size = "md";
274
+ this.disabled = false;
275
+ this.href = "";
276
+ this.target = "";
277
+ this.rel = "";
278
+ this.round = false;
279
+ }
280
+ _inner() {
281
+ return this.icon ? html`<lt-icon name=${this.icon}></lt-icon>` : html`<slot></slot>`;
282
+ }
283
+ render() {
284
+ const label = this.label || void 0;
285
+ if (this.href) {
286
+ const rel = this.rel || (this.target === "_blank" ? "noopener noreferrer" : void 0);
287
+ return html`
288
+ <a
289
+ part="base"
290
+ href=${this.href}
291
+ target=${ifDefined(this.target || void 0)}
292
+ rel=${ifDefined(rel)}
293
+ aria-label=${ifDefined(label)}
294
+ aria-disabled=${this.disabled ? "true" : nothing}
295
+ tabindex=${this.disabled ? "-1" : nothing}
296
+ >
297
+ ${this._inner()}
298
+ </a>
299
+ `;
300
+ }
301
+ return html`
302
+ <button part="base" ?disabled=${this.disabled} aria-label=${ifDefined(label)}>${this._inner()}</button>
303
+ `;
304
+ }
305
+ };
306
+ IconButton.styles = iconButtonStyles;
307
+ __decorateClass([
308
+ property2({ reflect: true })
309
+ ], IconButton.prototype, "icon", 2);
310
+ __decorateClass([
311
+ property2({ reflect: true })
312
+ ], IconButton.prototype, "label", 2);
313
+ __decorateClass([
314
+ property2({ reflect: true })
315
+ ], IconButton.prototype, "variant", 2);
316
+ __decorateClass([
317
+ property2({ reflect: true })
318
+ ], IconButton.prototype, "appearance", 2);
319
+ __decorateClass([
320
+ property2({ reflect: true })
321
+ ], IconButton.prototype, "size", 2);
322
+ __decorateClass([
323
+ property2({ type: Boolean, reflect: true })
324
+ ], IconButton.prototype, "disabled", 2);
325
+ __decorateClass([
326
+ property2()
327
+ ], IconButton.prototype, "href", 2);
328
+ __decorateClass([
329
+ property2()
330
+ ], IconButton.prototype, "target", 2);
331
+ __decorateClass([
332
+ property2()
333
+ ], IconButton.prototype, "rel", 2);
334
+ __decorateClass([
335
+ property2({ type: Boolean, reflect: true })
336
+ ], IconButton.prototype, "round", 2);
337
+ IconButton = __decorateClass([
338
+ customElement("lt-icon-button")
339
+ ], IconButton);
340
+ export {
341
+ IconButton
342
+ };
@@ -0,0 +1,26 @@
1
+ import { ThemeableElement } from '../../base';
2
+ /**
3
+ * A thin wrapper around `<img>` with rounded corners and responsive fill support.
4
+ *
5
+ * @element lt-image
6
+ * @part image - The underlying `<img>` element
7
+ */
8
+ export declare class Image extends ThemeableElement {
9
+ static styles: import("lit").CSSResult;
10
+ /** Image source URL. */
11
+ src: string;
12
+ /** Alt text for the image. */
13
+ alt: string;
14
+ /**
15
+ * Border radius. Present with no value uses the design system default (`--lt-border-radius`).
16
+ * Accepts any valid CSS `border-radius` shorthand (e.g. `"8px"`, `"50%"`, `"4px 8px"`).
17
+ */
18
+ rounded: string | null;
19
+ /**
20
+ * Makes the image fill its container using `object-fit: cover`.
21
+ * Size the `lt-image` element externally to define the crop box.
22
+ */
23
+ responsive: boolean;
24
+ private get _borderRadius();
25
+ render(): import("lit").TemplateResult<1>;
26
+ }
@@ -0,0 +1 @@
1
+ export declare const imageStyles: import("lit").CSSResult;
File without changes
@@ -0,0 +1 @@
1
+ export { Image } from './image';
@@ -0,0 +1,105 @@
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/image/image.ts
13
+ import { html } 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/image/image.ts
38
+ import { customElement, property as property2 } from "lit/decorators.js";
39
+
40
+ // src/components/image/image.styles.ts
41
+ import { css } from "lit";
42
+ var imageStyles = css`
43
+ :host {
44
+ display: inline-block;
45
+ }
46
+
47
+ img {
48
+ display: block;
49
+ max-width: 100%;
50
+ height: auto;
51
+ }
52
+
53
+ /* ── Responsive ─────────────────────────────────────────────────────────── */
54
+
55
+ :host([responsive]) {
56
+ display: block;
57
+ width: 100%;
58
+ }
59
+
60
+ :host([responsive]) img {
61
+ width: 100%;
62
+ height: 100%;
63
+ object-fit: cover;
64
+ }
65
+ `;
66
+
67
+ // src/components/image/image.ts
68
+ var Image = class extends ThemeableElement {
69
+ constructor() {
70
+ super(...arguments);
71
+ this.src = "";
72
+ this.alt = "";
73
+ this.rounded = null;
74
+ this.responsive = false;
75
+ }
76
+ get _borderRadius() {
77
+ if (this.rounded === null) return void 0;
78
+ return this.rounded || "var(--lt-border-radius)";
79
+ }
80
+ render() {
81
+ const radius = this._borderRadius;
82
+ return html`
83
+ <img part="image" src=${this.src} alt=${this.alt} style=${radius ? `border-radius: ${radius}` : ""} />
84
+ `;
85
+ }
86
+ };
87
+ Image.styles = imageStyles;
88
+ __decorateClass([
89
+ property2()
90
+ ], Image.prototype, "src", 2);
91
+ __decorateClass([
92
+ property2()
93
+ ], Image.prototype, "alt", 2);
94
+ __decorateClass([
95
+ property2({ reflect: true })
96
+ ], Image.prototype, "rounded", 2);
97
+ __decorateClass([
98
+ property2({ type: Boolean, reflect: true })
99
+ ], Image.prototype, "responsive", 2);
100
+ Image = __decorateClass([
101
+ customElement("lt-image")
102
+ ], Image);
103
+ export {
104
+ Image
105
+ };
@@ -0,0 +1 @@
1
+ export { Link } from './link';