luxen-ui 0.1.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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/css/elements/avatar.css +20 -0
  4. package/dist/css/elements/badge.css +159 -0
  5. package/dist/css/elements/button.css +171 -0
  6. package/dist/css/elements/close-button/circle.css +66 -0
  7. package/dist/css/elements/close-button/ring.css +71 -0
  8. package/dist/css/elements/close-button/square.css +70 -0
  9. package/dist/css/elements/disclosure.css +137 -0
  10. package/dist/css/elements/divider.css +75 -0
  11. package/dist/css/elements/input-otp.css +164 -0
  12. package/dist/css/elements/input-stepper/default.css +245 -0
  13. package/dist/css/elements/input-stepper/rounded.css +238 -0
  14. package/dist/css/elements/kbd.css +21 -0
  15. package/dist/css/elements/progress.css +114 -0
  16. package/dist/css/elements/select.css +71 -0
  17. package/dist/css/elements/skeleton.css +89 -0
  18. package/dist/css/elements/tabs/enclosed.css +148 -0
  19. package/dist/css/elements/tabs/line.css +138 -0
  20. package/dist/css/elements/toast.css +260 -0
  21. package/dist/css/index.css +885 -0
  22. package/dist/custom-elements.json +14424 -0
  23. package/dist/define.d.ts +9 -0
  24. package/dist/define.d.ts.map +1 -0
  25. package/dist/define.js +16 -0
  26. package/dist/elements/avatar/avatar.css +128 -0
  27. package/dist/elements/avatar/avatar.d.ts +21 -0
  28. package/dist/elements/avatar/avatar.d.ts.map +1 -0
  29. package/dist/elements/avatar/avatar.js +106 -0
  30. package/dist/elements/avatar/index.d.ts +8 -0
  31. package/dist/elements/avatar/index.d.ts.map +1 -0
  32. package/dist/elements/avatar/index.js +4 -0
  33. package/dist/elements/badge/badge.d.ts +17 -0
  34. package/dist/elements/badge/badge.d.ts.map +1 -0
  35. package/dist/elements/badge/badge.js +34 -0
  36. package/dist/elements/badge/index.d.ts +8 -0
  37. package/dist/elements/badge/index.d.ts.map +1 -0
  38. package/dist/elements/badge/index.js +4 -0
  39. package/dist/elements/carousel/carousel.css +205 -0
  40. package/dist/elements/carousel/carousel.d.ts +148 -0
  41. package/dist/elements/carousel/carousel.d.ts.map +1 -0
  42. package/dist/elements/carousel/carousel.js +473 -0
  43. package/dist/elements/carousel/index.d.ts +8 -0
  44. package/dist/elements/carousel/index.d.ts.map +1 -0
  45. package/dist/elements/carousel/index.js +4 -0
  46. package/dist/elements/carousel-item/carousel-item.css +11 -0
  47. package/dist/elements/carousel-item/carousel-item.d.ts +13 -0
  48. package/dist/elements/carousel-item/carousel-item.d.ts.map +1 -0
  49. package/dist/elements/carousel-item/carousel-item.js +20 -0
  50. package/dist/elements/carousel-item/index.d.ts +8 -0
  51. package/dist/elements/carousel-item/index.d.ts.map +1 -0
  52. package/dist/elements/carousel-item/index.js +4 -0
  53. package/dist/elements/dialog/dialog.css +92 -0
  54. package/dist/elements/dialog/dialog.d.ts +56 -0
  55. package/dist/elements/dialog/dialog.d.ts.map +1 -0
  56. package/dist/elements/dialog/dialog.js +204 -0
  57. package/dist/elements/dialog/dialog.styles.d.ts +8 -0
  58. package/dist/elements/dialog/dialog.styles.d.ts.map +1 -0
  59. package/dist/elements/dialog/dialog.styles.js +8 -0
  60. package/dist/elements/dialog/index.d.ts +8 -0
  61. package/dist/elements/dialog/index.d.ts.map +1 -0
  62. package/dist/elements/dialog/index.js +4 -0
  63. package/dist/elements/divider/divider.d.ts +23 -0
  64. package/dist/elements/divider/divider.d.ts.map +1 -0
  65. package/dist/elements/divider/divider.js +49 -0
  66. package/dist/elements/divider/index.d.ts +8 -0
  67. package/dist/elements/divider/index.d.ts.map +1 -0
  68. package/dist/elements/divider/index.js +4 -0
  69. package/dist/elements/drawer/drawer.css +66 -0
  70. package/dist/elements/drawer/drawer.d.ts +34 -0
  71. package/dist/elements/drawer/drawer.d.ts.map +1 -0
  72. package/dist/elements/drawer/drawer.js +46 -0
  73. package/dist/elements/drawer/index.d.ts +8 -0
  74. package/dist/elements/drawer/index.d.ts.map +1 -0
  75. package/dist/elements/drawer/index.js +4 -0
  76. package/dist/elements/dropdown/dropdown.css +31 -0
  77. package/dist/elements/dropdown/dropdown.d.ts +64 -0
  78. package/dist/elements/dropdown/dropdown.d.ts.map +1 -0
  79. package/dist/elements/dropdown/dropdown.js +322 -0
  80. package/dist/elements/dropdown/index.d.ts +8 -0
  81. package/dist/elements/dropdown/index.d.ts.map +1 -0
  82. package/dist/elements/dropdown/index.js +4 -0
  83. package/dist/elements/dropdown-item/dropdown-item.css +51 -0
  84. package/dist/elements/dropdown-item/dropdown-item.d.ts +25 -0
  85. package/dist/elements/dropdown-item/dropdown-item.d.ts.map +1 -0
  86. package/dist/elements/dropdown-item/dropdown-item.js +110 -0
  87. package/dist/elements/dropdown-item/index.d.ts +8 -0
  88. package/dist/elements/dropdown-item/index.d.ts.map +1 -0
  89. package/dist/elements/dropdown-item/index.js +4 -0
  90. package/dist/elements/icon/icon.css +10 -0
  91. package/dist/elements/icon/icon.d.ts +19 -0
  92. package/dist/elements/icon/icon.d.ts.map +1 -0
  93. package/dist/elements/icon/icon.js +53 -0
  94. package/dist/elements/icon/index.d.ts +8 -0
  95. package/dist/elements/icon/index.d.ts.map +1 -0
  96. package/dist/elements/icon/index.js +4 -0
  97. package/dist/elements/input-otp/index.d.ts +8 -0
  98. package/dist/elements/input-otp/index.d.ts.map +1 -0
  99. package/dist/elements/input-otp/index.js +4 -0
  100. package/dist/elements/input-otp/input-otp.d.ts +31 -0
  101. package/dist/elements/input-otp/input-otp.d.ts.map +1 -0
  102. package/dist/elements/input-otp/input-otp.js +139 -0
  103. package/dist/elements/input-stepper/index.d.ts +8 -0
  104. package/dist/elements/input-stepper/index.d.ts.map +1 -0
  105. package/dist/elements/input-stepper/index.js +4 -0
  106. package/dist/elements/input-stepper/input-stepper.d.ts +63 -0
  107. package/dist/elements/input-stepper/input-stepper.d.ts.map +1 -0
  108. package/dist/elements/input-stepper/input-stepper.js +249 -0
  109. package/dist/elements/popover/index.d.ts +8 -0
  110. package/dist/elements/popover/index.d.ts.map +1 -0
  111. package/dist/elements/popover/index.js +4 -0
  112. package/dist/elements/popover/popover.css +61 -0
  113. package/dist/elements/popover/popover.d.ts +62 -0
  114. package/dist/elements/popover/popover.d.ts.map +1 -0
  115. package/dist/elements/popover/popover.js +244 -0
  116. package/dist/elements/rating/index.d.ts +8 -0
  117. package/dist/elements/rating/index.d.ts.map +1 -0
  118. package/dist/elements/rating/index.js +4 -0
  119. package/dist/elements/rating/rating.css +102 -0
  120. package/dist/elements/rating/rating.d.ts +38 -0
  121. package/dist/elements/rating/rating.d.ts.map +1 -0
  122. package/dist/elements/rating/rating.js +193 -0
  123. package/dist/elements/skeleton/index.d.ts +8 -0
  124. package/dist/elements/skeleton/index.d.ts.map +1 -0
  125. package/dist/elements/skeleton/index.js +4 -0
  126. package/dist/elements/skeleton/skeleton.d.ts +12 -0
  127. package/dist/elements/skeleton/skeleton.d.ts.map +1 -0
  128. package/dist/elements/skeleton/skeleton.js +13 -0
  129. package/dist/elements/spinner/index.d.ts +8 -0
  130. package/dist/elements/spinner/index.d.ts.map +1 -0
  131. package/dist/elements/spinner/index.js +4 -0
  132. package/dist/elements/spinner/spinner.css +28 -0
  133. package/dist/elements/spinner/spinner.d.ts +16 -0
  134. package/dist/elements/spinner/spinner.d.ts.map +1 -0
  135. package/dist/elements/spinner/spinner.js +37 -0
  136. package/dist/elements/tabs/index.d.ts +8 -0
  137. package/dist/elements/tabs/index.d.ts.map +1 -0
  138. package/dist/elements/tabs/index.js +4 -0
  139. package/dist/elements/tabs/tabs.d.ts +48 -0
  140. package/dist/elements/tabs/tabs.d.ts.map +1 -0
  141. package/dist/elements/tabs/tabs.js +210 -0
  142. package/dist/elements/toast/index.d.ts +9 -0
  143. package/dist/elements/toast/index.d.ts.map +1 -0
  144. package/dist/elements/toast/index.js +5 -0
  145. package/dist/elements/toast/toast.d.ts +72 -0
  146. package/dist/elements/toast/toast.d.ts.map +1 -0
  147. package/dist/elements/toast/toast.js +375 -0
  148. package/dist/elements/tooltip/index.d.ts +8 -0
  149. package/dist/elements/tooltip/index.d.ts.map +1 -0
  150. package/dist/elements/tooltip/index.js +4 -0
  151. package/dist/elements/tooltip/tooltip.css +37 -0
  152. package/dist/elements/tooltip/tooltip.d.ts +59 -0
  153. package/dist/elements/tooltip/tooltip.d.ts.map +1 -0
  154. package/dist/elements/tooltip/tooltip.js +231 -0
  155. package/dist/elements/tree/index.d.ts +8 -0
  156. package/dist/elements/tree/index.d.ts.map +1 -0
  157. package/dist/elements/tree/index.js +4 -0
  158. package/dist/elements/tree/tree.css +26 -0
  159. package/dist/elements/tree/tree.d.ts +76 -0
  160. package/dist/elements/tree/tree.d.ts.map +1 -0
  161. package/dist/elements/tree/tree.js +432 -0
  162. package/dist/elements/tree-item/index.d.ts +8 -0
  163. package/dist/elements/tree-item/index.d.ts.map +1 -0
  164. package/dist/elements/tree-item/index.js +4 -0
  165. package/dist/elements/tree-item/tree-item.css +172 -0
  166. package/dist/elements/tree-item/tree-item.d.ts +74 -0
  167. package/dist/elements/tree-item/tree-item.d.ts.map +1 -0
  168. package/dist/elements/tree-item/tree-item.js +301 -0
  169. package/dist/index.d.ts +6 -0
  170. package/dist/index.d.ts.map +1 -0
  171. package/dist/index.js +4 -0
  172. package/dist/registry.d.ts +22 -0
  173. package/dist/registry.d.ts.map +1 -0
  174. package/dist/registry.js +33 -0
  175. package/dist/shared/controllers/popover.d.ts +44 -0
  176. package/dist/shared/controllers/popover.d.ts.map +1 -0
  177. package/dist/shared/controllers/popover.js +359 -0
  178. package/dist/shared/luxen-element.d.ts +20 -0
  179. package/dist/shared/luxen-element.d.ts.map +1 -0
  180. package/dist/shared/luxen-element.js +23 -0
  181. package/dist/shared/luxen-form-associated-element.d.ts +49 -0
  182. package/dist/shared/luxen-form-associated-element.d.ts.map +1 -0
  183. package/dist/shared/luxen-form-associated-element.js +123 -0
  184. package/dist/shared/styles/host.css +13 -0
  185. package/dist/shared/styles/host.styles.d.ts +9 -0
  186. package/dist/shared/styles/host.styles.d.ts.map +1 -0
  187. package/dist/shared/styles/host.styles.js +9 -0
  188. package/dist/skills/luxen-ui/SKILL.md +82 -0
  189. package/dist/skills/luxen-ui/references/avatar.md +259 -0
  190. package/dist/skills/luxen-ui/references/badge.md +289 -0
  191. package/dist/skills/luxen-ui/references/button.md +309 -0
  192. package/dist/skills/luxen-ui/references/close-button.md +104 -0
  193. package/dist/skills/luxen-ui/references/dialog.md +435 -0
  194. package/dist/skills/luxen-ui/references/drawer.md +400 -0
  195. package/dist/skills/luxen-ui/references/progress.md +133 -0
  196. package/dist/skills/luxen-ui/references/select.md +100 -0
  197. package/dist/skills/luxen-ui/references/toast.md +396 -0
  198. package/dist/skills/luxen-ui/references/tree.md +359 -0
  199. package/package.json +116 -0
  200. package/postcss-plugin-prefix.js +63 -0
  201. package/vite-plugin.ts +29 -0
@@ -0,0 +1,9 @@
1
+ import { type ElementBaseName } from './registry';
2
+ /**
3
+ * Register a Luxen element with the custom elements registry.
4
+ *
5
+ * @param baseName - The element's base name (e.g. `'badge'`, `'toast-item'`).
6
+ * @param elementClass - The custom element class to define.
7
+ */
8
+ export declare function define(baseName: ElementBaseName, elementClass: CustomElementConstructor): void;
9
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/html/define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAO9F"}
package/dist/define.js ADDED
@@ -0,0 +1,16 @@
1
+ import { markRegistered, isRegistered, tagName } from './registry';
2
+ /**
3
+ * Register a Luxen element with the custom elements registry.
4
+ *
5
+ * @param baseName - The element's base name (e.g. `'badge'`, `'toast-item'`).
6
+ * @param elementClass - The custom element class to define.
7
+ */
8
+ export function define(baseName, elementClass) {
9
+ if (isRegistered(baseName))
10
+ return;
11
+ markRegistered(baseName);
12
+ const tag = tagName(baseName);
13
+ if (!customElements.get(tag)) {
14
+ customElements.define(tag, elementClass);
15
+ }
16
+ }
@@ -0,0 +1,128 @@
1
+ :host {
2
+ --_size: 40px;
3
+ --_font-size: 1rem;
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ position: relative;
8
+ width: var(--_size);
9
+ height: var(--_size);
10
+ border-radius: calc(var(--_size) * 0.2);
11
+ isolation: isolate;
12
+ vertical-align: middle;
13
+ flex-shrink: 0;
14
+ color: var(--l-color-text-secondary);
15
+ }
16
+
17
+ :host([size='xs']) {
18
+ --_size: 24px;
19
+ --_font-size: 0.75rem;
20
+ }
21
+ :host([size='sm']) {
22
+ --_size: 32px;
23
+ --_font-size: 0.875rem;
24
+ }
25
+ :host([size='lg']) {
26
+ --_size: 48px;
27
+ --_font-size: 1.25rem;
28
+ }
29
+ :host([size='xl']) {
30
+ --_size: 56px;
31
+ --_font-size: 1.25rem;
32
+ }
33
+
34
+ img {
35
+ width: 100%;
36
+ height: 100%;
37
+ object-fit: cover;
38
+ border-radius: inherit;
39
+ }
40
+
41
+ .initials {
42
+ margin: auto;
43
+ }
44
+
45
+ .icon {
46
+ width: 60%;
47
+ height: 60%;
48
+ color: currentColor;
49
+ }
50
+
51
+ .badge {
52
+ position: absolute;
53
+ bottom: 0;
54
+ right: 0;
55
+ z-index: 1;
56
+ height: 12px;
57
+ min-width: 12px;
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ padding-inline: 2px;
62
+ border-radius: 3px;
63
+ box-shadow: 0 0 0 2px var(--l-color-surface);
64
+ background-color: var(--l-color-surface);
65
+ font-size: 0.625rem;
66
+ font-weight: 500;
67
+ font-variant-numeric: tabular-nums;
68
+ line-height: 1;
69
+ color: var(--l-color-text-primary);
70
+ overflow: hidden;
71
+ }
72
+
73
+ /*
74
+ * Inset ring via ::after so it renders on top of the <img>.
75
+ * A box-shadow on :host would be covered by the image since
76
+ * it fills the entire element with object-fit: cover.
77
+ */
78
+ .base::after {
79
+ content: '';
80
+ position: absolute;
81
+ inset: 0;
82
+ border-radius: inherit;
83
+ box-shadow: inset 0 0 0 1px light-dark(oklch(0 0 0 / 7%), oklch(100% 0 0 / 10%));
84
+ pointer-events: none;
85
+ }
86
+
87
+ .base {
88
+ display: inline-flex;
89
+ align-items: center;
90
+ justify-content: center;
91
+ width: 100%;
92
+ height: 100%;
93
+ border: none;
94
+ border-radius: calc(var(--_size) * 0.2);
95
+ background-color: var(--color, var(--l-color-bg-fill-neutral-soft));
96
+ color: oklch(from var(--color) 0.45 calc(c * 2) h);
97
+ font-size: var(--_font-size);
98
+ font-weight: 500;
99
+ line-height: 1;
100
+ text-transform: uppercase;
101
+ padding: 0;
102
+ cursor: inherit;
103
+ }
104
+
105
+ button.base {
106
+ cursor: pointer;
107
+ }
108
+
109
+ button.base:focus-visible {
110
+ outline: 2px solid var(--l-focus-ring);
111
+ outline-offset: 2px;
112
+ }
113
+
114
+ button.base:hover {
115
+ box-shadow: inset 0 0 0 1.5px var(--l-color-border-interactive);
116
+ }
117
+
118
+ @media (prefers-color-scheme: dark) {
119
+ .base {
120
+ color: oklch(from var(--color) 0.85 calc(c * 1.5) h);
121
+ }
122
+ }
123
+
124
+ @container style(--appearance: circle) {
125
+ .base {
126
+ border-radius: 50%;
127
+ }
128
+ }
@@ -0,0 +1,21 @@
1
+ import { LuxenElement } from '../../shared/luxen-element';
2
+ /**
3
+ * @summary An avatar component for displaying user images, initials, or a default icon.
4
+ * @customElement l-avatar
5
+ */
6
+ export declare class LuxenAvatar extends LuxenElement {
7
+ static styles: import("lit").CSSResult[];
8
+ src: string;
9
+ name: string;
10
+ size: string;
11
+ badge: number;
12
+ interactive: boolean;
13
+ private _hasError;
14
+ willUpdate(changed: Map<string, unknown>): void;
15
+ connectedCallback(): void;
16
+ updated(): void;
17
+ private get _tag();
18
+ render(): import("lit").TemplateResult;
19
+ private _onError;
20
+ }
21
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/html/elements/avatar/avatar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAqB1D;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,MAAM,CAAC,MAAM,4BAAwB;IAGrC,GAAG,SAAM;IAGT,IAAI,SAAM;IAGV,IAAI,SAAQ;IAGZ,KAAK,SAAK;IAGV,WAAW,UAAS;IAEX,OAAO,CAAC,SAAS,CAAS;IAEnC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAMxC,iBAAiB;IAOjB,OAAO;IASP,OAAO,KAAK,IAAI,GAEf;IAED,MAAM;IA6BN,OAAO,CAAC,QAAQ;CAGjB"}
@@ -0,0 +1,106 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, nothing, svg, unsafeCSS } from 'lit';
8
+ import { LuxenElement } from '../../shared/luxen-element';
9
+ import { html as staticHtml, literal } from 'lit/static-html.js';
10
+ import { property, state } from 'lit/decorators.js';
11
+ import hostStyles from '../../shared/styles/host.styles';
12
+ import rawStyles from './avatar.css?inline';
13
+ const styles = unsafeCSS(rawStyles);
14
+ function getInitials(name) {
15
+ return name
16
+ .match(/(\b\S)?/g)
17
+ .join('')
18
+ .match(/(^\S|\S$)?/g)
19
+ .join('')
20
+ .toUpperCase();
21
+ }
22
+ const defaultIcon = svg `<svg class="icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
23
+ <path d="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z" />
24
+ </svg>`;
25
+ /**
26
+ * @summary An avatar component for displaying user images, initials, or a default icon.
27
+ * @customElement l-avatar
28
+ */
29
+ export class LuxenAvatar extends LuxenElement {
30
+ constructor() {
31
+ super(...arguments);
32
+ this.src = '';
33
+ this.name = '';
34
+ this.size = 'md';
35
+ this.badge = 0;
36
+ this.interactive = false;
37
+ this._hasError = false;
38
+ }
39
+ willUpdate(changed) {
40
+ if (changed.has('src')) {
41
+ this._hasError = false;
42
+ }
43
+ }
44
+ connectedCallback() {
45
+ super.connectedCallback();
46
+ if (!this.hasAttribute('role')) {
47
+ this.setAttribute('role', 'img');
48
+ }
49
+ }
50
+ updated() {
51
+ if (this.name) {
52
+ this.setAttribute('aria-label', this.name);
53
+ }
54
+ const isCircle = getComputedStyle(this).getPropertyValue('--appearance').trim() === 'circle';
55
+ this.style.borderRadius = isCircle ? '50%' : '';
56
+ }
57
+ get _tag() {
58
+ return this.interactive ? literal `button` : literal `div`;
59
+ }
60
+ render() {
61
+ const content = this.src && !this._hasError
62
+ ? html `<img
63
+ src=${this.src}
64
+ alt=${this.name || ''}
65
+ @error=${this._onError}
66
+ />`
67
+ : this.name
68
+ ? html `<span class="initials">${getInitials(this.name)}</span>`
69
+ : html `<slot>${defaultIcon}</slot>`;
70
+ return staticHtml `
71
+ <${this._tag} class="base" type=${this.interactive ? 'button' : nothing}>
72
+ ${content}
73
+ </${this._tag}>
74
+ ${this.badge
75
+ ? html `<div
76
+ class="badge"
77
+ aria-hidden="true"
78
+ >
79
+ ${this.badge}
80
+ </div>`
81
+ : nothing}
82
+ `;
83
+ }
84
+ _onError() {
85
+ this._hasError = true;
86
+ }
87
+ }
88
+ LuxenAvatar.styles = [hostStyles, styles];
89
+ __decorate([
90
+ property()
91
+ ], LuxenAvatar.prototype, "src", void 0);
92
+ __decorate([
93
+ property()
94
+ ], LuxenAvatar.prototype, "name", void 0);
95
+ __decorate([
96
+ property({ reflect: true })
97
+ ], LuxenAvatar.prototype, "size", void 0);
98
+ __decorate([
99
+ property({ type: Number })
100
+ ], LuxenAvatar.prototype, "badge", void 0);
101
+ __decorate([
102
+ property({ type: Boolean, reflect: true })
103
+ ], LuxenAvatar.prototype, "interactive", void 0);
104
+ __decorate([
105
+ state()
106
+ ], LuxenAvatar.prototype, "_hasError", void 0);
@@ -0,0 +1,8 @@
1
+ import { LuxenAvatar } from './avatar';
2
+ export * from './avatar';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'l-avatar': LuxenAvatar;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/avatar/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,cAAc,UAAU,CAAC;AAGzB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,WAAW,CAAC;KACzB;CACF"}
@@ -0,0 +1,4 @@
1
+ import { define } from '../../define';
2
+ import { LuxenAvatar } from './avatar';
3
+ export * from './avatar';
4
+ define('avatar', LuxenAvatar);
@@ -0,0 +1,17 @@
1
+ import { LuxenElement } from '../../shared/luxen-element';
2
+ /**
3
+ * @summary A badge component for displaying small status indicators.
4
+ * @customElement l-badge
5
+ */
6
+ export declare class LuxenBadge extends LuxenElement {
7
+ createRenderRoot(): this;
8
+ /** Style variant: `info`, `success`, `warning`, `danger`, or `neutral` (default) */
9
+ variant?: string;
10
+ /** Display as pill shape */
11
+ pill: boolean;
12
+ /** Badge size: `sm`, `lg`. Default is md. */
13
+ size?: string;
14
+ /** Visual appearance: `filled`, `filled-outlined`, `accent`. Default is outlined. */
15
+ appearance?: string;
16
+ }
17
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/html/elements/badge/badge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D;;;GAGG;AACH,qBAAa,UAAW,SAAQ,YAAY;IACjC,gBAAgB;IAIzB,oFAAoF;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IAE9C,4BAA4B;IACgB,IAAI,UAAS;IAEzD,6CAA6C;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IAE3C,qFAAqF;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CAClD"}
@@ -0,0 +1,34 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { property } from 'lit/decorators.js';
8
+ import { LuxenElement } from '../../shared/luxen-element';
9
+ /**
10
+ * @summary A badge component for displaying small status indicators.
11
+ * @customElement l-badge
12
+ */
13
+ export class LuxenBadge extends LuxenElement {
14
+ constructor() {
15
+ super(...arguments);
16
+ /** Display as pill shape */
17
+ this.pill = false;
18
+ }
19
+ createRenderRoot() {
20
+ return this;
21
+ }
22
+ }
23
+ __decorate([
24
+ property({ reflect: true })
25
+ ], LuxenBadge.prototype, "variant", void 0);
26
+ __decorate([
27
+ property({ type: Boolean, reflect: true })
28
+ ], LuxenBadge.prototype, "pill", void 0);
29
+ __decorate([
30
+ property({ reflect: true })
31
+ ], LuxenBadge.prototype, "size", void 0);
32
+ __decorate([
33
+ property({ reflect: true })
34
+ ], LuxenBadge.prototype, "appearance", void 0);
@@ -0,0 +1,8 @@
1
+ import { LuxenBadge } from './badge';
2
+ export * from './badge';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'l-badge': LuxenBadge;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/badge/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,cAAc,SAAS,CAAC;AAGxB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,UAAU,CAAC;KACvB;CACF"}
@@ -0,0 +1,4 @@
1
+ import { define } from '../../define';
2
+ import { LuxenBadge } from './badge';
3
+ export * from './badge';
4
+ define('badge', LuxenBadge);
@@ -0,0 +1,205 @@
1
+ :host {
2
+ --slide-height: 19rem;
3
+ --slide-size: 100%;
4
+ --slide-gap: 0;
5
+
6
+ --button-size: 48px;
7
+ --button-arrow-size: 20px;
8
+ --button-arrow-color: #4b5563;
9
+ --button-offset: 8px;
10
+ --button-border-color: #e5e7eb;
11
+ --button-border-radius: 8px;
12
+ --button-bg: rgba(255, 255, 255, 0.8);
13
+ --button-color: inherit;
14
+ --button-box-shadow-hover: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
15
+
16
+ --dot-color: #9ca3af;
17
+ --dot-color-active: #111827;
18
+ --dot-margin: 0.5rem 0;
19
+
20
+ --scrollbar-color: #d1d5db transparent;
21
+
22
+ display: block;
23
+ /* Note: moving this elsewhere (e.g wrapper) may bug the container translate position */
24
+ position: relative;
25
+ container-type: inline-size;
26
+ }
27
+
28
+ :host([single]) {
29
+ --slide-size: 100%;
30
+ --slide-gap: 0;
31
+ }
32
+
33
+ :host([axis='y']) .container {
34
+ flex-direction: column;
35
+ max-height: var(--slide-height);
36
+ }
37
+
38
+ :host([axis='y']) .viewport {
39
+ max-height: var(--slide-height);
40
+ }
41
+
42
+ .viewport {
43
+ overflow: hidden;
44
+ }
45
+
46
+ :host([with-scrollbar]) .viewport {
47
+ overflow-x: scroll;
48
+ scrollbar-color: var(--scrollbar-color); /* progress / track */
49
+ scrollbar-gutter: stable both-edges;
50
+ scrollbar-width: thin;
51
+ }
52
+
53
+ .container {
54
+ backface-visibility: hidden;
55
+ display: flex;
56
+ gap: var(--slide-gap);
57
+ touch-action: pan-y pinch-zoom;
58
+ }
59
+
60
+ ::slotted(l-carousel-item) {
61
+ flex: 0 0 var(--slide-size);
62
+ min-width: 0;
63
+ }
64
+
65
+ /*
66
+ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
67
+ SCROLL BUTTONS
68
+ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
69
+ */
70
+ .scroll-buttons--inside {
71
+ position: absolute;
72
+ inset: 0;
73
+ pointer-events: none;
74
+ }
75
+
76
+ .scroll-buttons--outside {
77
+ display: flex;
78
+ gap: 8px;
79
+ justify-content: end;
80
+ padding-block: 8px;
81
+ }
82
+
83
+ .scroll-buttons--disabled,
84
+ .inactive .scroll-buttons {
85
+ display: none;
86
+ }
87
+
88
+ .button-next,
89
+ .button-previous,
90
+ .button-fullscreen {
91
+ display: flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+ appearance: none;
95
+ touch-action: manipulation;
96
+ border: 1px solid var(--button-border-color);
97
+ border-radius: var(--button-border-radius);
98
+ width: var(--button-size);
99
+ height: var(--button-size);
100
+ background-color: var(--button-bg);
101
+ color: var(--button-color);
102
+ cursor: pointer;
103
+ pointer-events: auto;
104
+ -webkit-tap-highlight-color: rgba(49, 49, 49, 0.5);
105
+ }
106
+
107
+ .scroll-buttons--inside .button-previous,
108
+ .scroll-buttons--inside .button-next,
109
+ .button-fullscreen {
110
+ position: absolute;
111
+ top: calc(50% - (var(--button-size) / 2));
112
+ z-index: 1;
113
+ }
114
+
115
+ .scroll-buttons--inside .button-previous {
116
+ left: var(--button-offset);
117
+ }
118
+
119
+ .scroll-buttons--inside .button-next {
120
+ right: var(--button-offset);
121
+ }
122
+
123
+ .scroll-buttons--inside .button:disabled {
124
+ visibility: hidden;
125
+ }
126
+
127
+ .button:disabled {
128
+ cursor: not-allowed;
129
+ pointer-events: none;
130
+ opacity: 0.4;
131
+ }
132
+
133
+ .button-fullscreen {
134
+ border-radius: 4px;
135
+ right: var(--button-offset);
136
+ top: var(--button-offset);
137
+ width: calc(var(--button-size) * 0.75);
138
+ height: calc(var(--button-size) * 0.75);
139
+ }
140
+
141
+ @container (min-width: 640px) {
142
+ .button-fullscreen {
143
+ width: var(--button-size);
144
+ height: var(--button-size);
145
+ }
146
+ }
147
+
148
+ @media (hover: hover) {
149
+ .button:hover:not(:disabled) {
150
+ box-shadow: var(--button-box-shadow-hover);
151
+ }
152
+ }
153
+
154
+ .button svg {
155
+ width: var(--button-arrow-size);
156
+ height: var(--button-arrow-size);
157
+ color: var(--button-arrow-color);
158
+ }
159
+
160
+ /*
161
+ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
162
+ DOTS
163
+ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
164
+ */
165
+
166
+ .dots {
167
+ display: flex;
168
+ justify-content: center;
169
+ margin: var(--dot-margin);
170
+ }
171
+
172
+ .dot {
173
+ appearance: none;
174
+ display: inline-flex;
175
+ align-items: center;
176
+ justify-items: center;
177
+ touch-action: manipulation;
178
+ background: none;
179
+ padding-inline: 0.25rem;
180
+ padding-block: 0.5rem;
181
+ border: 0;
182
+ cursor: pointer;
183
+ }
184
+
185
+ .dot--bar i {
186
+ background: var(--dot-color);
187
+ height: 0.125rem;
188
+ width: 1rem;
189
+ }
190
+
191
+ .dot--selected i {
192
+ background: var(--dot-color-active);
193
+ }
194
+
195
+ .dot--circle i {
196
+ display: inline-block;
197
+ width: 10px;
198
+ height: 10px;
199
+ border-radius: 8px;
200
+ border: 2px solid var(--dot-color-active);
201
+ }
202
+
203
+ .dot--circle.dot--selected i {
204
+ width: 30px;
205
+ }