@hotosm/ui 0.2.0-b4 → 0.2.0-b6

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 (54) hide show
  1. package/README.md +99 -107
  2. package/components/header/header.styles.ts +103 -0
  3. package/components/header/header.ts +117 -194
  4. package/components/icons.ts +1 -1
  5. package/components/index.ts +68 -62
  6. package/components/logo/logo.styles.ts +8 -0
  7. package/components/logo/logo.ts +37 -0
  8. package/components/react/Header.ts +16 -0
  9. package/components/react/Logo.ts +15 -0
  10. package/components/react/Toolbar.ts +24 -0
  11. package/components/react/Tracking.ts +17 -0
  12. package/components/react/index.ts +63 -0
  13. package/components/toolbar/toolbar.styles.ts +6 -0
  14. package/components/toolbar/toolbar.ts +100 -57
  15. package/components/tracking/tracking.styles.ts +23 -0
  16. package/components/tracking/tracking.ts +89 -85
  17. package/dist/components/header/header.d.ts +28 -0
  18. package/dist/components/header/header.styles.d.ts +6 -0
  19. package/dist/components/index.d.ts +130 -0
  20. package/dist/components/logo/logo.d.ts +10 -0
  21. package/dist/components/logo/logo.styles.d.ts +2 -0
  22. package/dist/components/react/Tracking.d.ts +2 -0
  23. package/dist/components/react/index.d.ts +62 -0
  24. package/dist/components/toolbar/toolbar.d.ts +20 -0
  25. package/dist/components/toolbar/toolbar.styles.d.ts +2 -0
  26. package/{components → dist/components}/tracking/tracking.d.ts +8 -9
  27. package/dist/components/tracking/tracking.styles.d.ts +2 -0
  28. package/dist/{components.js → hotosm-ui.js} +3707 -3671
  29. package/dist/style.css +1 -1
  30. package/package.json +35 -33
  31. package/theme/hot-sl.css +180 -0
  32. package/theme/hot.css +177 -121
  33. package/theme/logo/hot-logo-icon.svg +1 -0
  34. package/theme/logo/hot-logo-png.png +0 -0
  35. package/theme/logo/hot-logo-text.svg +1 -0
  36. package/components/header/header.d.ts +0 -30
  37. package/components/header/header.js +0 -237
  38. package/components/icons.js +0 -78
  39. package/components/index.d.ts +0 -127
  40. package/components/index.js +0 -127
  41. package/components/toolbar/toolbar.d.ts +0 -24
  42. package/components/toolbar/toolbar.js +0 -121
  43. package/components/tracking/tracking.js +0 -164
  44. package/react/Header.js +0 -14
  45. package/react/Toolbar.js +0 -21
  46. package/react/Tracking.js +0 -15
  47. package/react/index.d.ts +0 -3
  48. package/react/index.js +0 -5
  49. package/theme/logo.png +0 -0
  50. package/theme/sl-custom.css +0 -74
  51. /package/{components → dist/components}/icons.d.ts +0 -0
  52. /package/{react → dist/components/react}/Header.d.ts +0 -0
  53. /package/{react/Toolbar.d.ts → dist/components/react/Logo.d.ts} +0 -0
  54. /package/{react/Tracking.d.ts → dist/components/react/Toolbar.d.ts} +0 -0
@@ -1,223 +1,146 @@
1
- import "../../theme/sl-custom.css";
1
+ import "../../theme/hot-sl.css";
2
2
 
3
- import '@shoelace-style/shoelace/dist/components/icon-button/icon-button.js';
4
- import '@shoelace-style/shoelace/dist/components/tab-panel/tab-panel.js';
5
- import '@shoelace-style/shoelace/dist/components/tab-group/tab-group.js';
6
- import '@shoelace-style/shoelace/dist/components/tab/tab.js';
3
+ import "@shoelace-style/shoelace/dist/components/icon-button/icon-button.js";
4
+ import "@shoelace-style/shoelace/dist/components/tab-panel/tab-panel.js";
5
+ import "@shoelace-style/shoelace/dist/components/tab-group/tab-group.js";
6
+ import "@shoelace-style/shoelace/dist/components/tab/tab.js";
7
7
 
8
- import { LitElement, css, html } from "lit";
9
- import { property, state } from "lit/decorators.js";
10
- import { cva } from "class-variance-authority";
8
+ import { LitElement, html } from "lit";
9
+ import { property } from "lit/decorators.js";
10
+ import { headerVariants, type sizes, styles } from './header.styles.js';
11
+ import type { CSSResultGroup } from 'lit';
11
12
 
12
- import registerBundledIcons from '../../components/icons';
13
+ import registerBundledIcons from "../../components/icons";
13
14
 
14
15
  registerBundledIcons();
15
16
 
16
-
17
- const headerVariants = cva(
18
- // Defaults to include in all variants
19
- `
20
- flex flex-row bg-[var(--hot-white)] items-center justify-between
21
- sm:justify-around p-2 border-b-2 border-b-gray-100 border-b-solid
22
- `,
23
- {
24
- variants: {
25
- size: {
26
- small: "h-8",
27
- large: "h-14",
28
- },
29
- },
30
- },
31
- );
32
- type sizes = "small" | "large";
33
-
34
17
  interface MenuItem {
35
- label: string,
18
+ label: string;
36
19
  clickEvent: () => void;
37
20
  }
38
21
 
39
22
  export class Header extends LitElement {
40
- @property() name = "hot-header";
23
+
24
+ static styles: CSSResultGroup = [styles];
25
+
26
+ name = "hot-header";
41
27
 
42
28
  /** Use a text-based title in the header. */
43
- @property({ type: String }) title: string = '';
29
+ @property({ type: String })
30
+ accessor title: string = "";
44
31
 
45
32
  /** Display a logo on the left of the header. */
46
- @property({ type: String }) logo: string | URL = `
47
- data:image/png;base64,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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 9CYXr9XulnOPOnCyoBttrjdsj88bruDLgaxaM8BDrdKwhzo85If3kkzjjvtZrLzh3IhNp4ZE50HYs
66
- PwdubFe6gDVrL2Tlay0htZ1di5NEDmzBdhyr3+tuzUJ0cTcxCeUP2zw+Z6TFXFOEozBOFxf5he0ZK
67
- XoJU0ungqzp8K5PsBQ2FDFVZQP1Fgdvbnk7GrAwHT05rA2BBC8dqz2y+tjp5NlWuluuVU10GqFfEi
68
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 1CSAojwvh/yhIHG31FkQpGFWc4oLLJ1jRQgo7SnQ7nP/i8Do5syEbpfKC6MYetDxblnKyCM9Iipyy
80
- igc8Gul7EsQZj8SRZC2QZ82HXGXtjYs8GBHsYooA6me94C4C/KI47UnspzJf9reYHIHDStmOUVbv0
81
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- FFJ3y3udT2D2y4w3v/T4ckjdrbXqY36NuYHw3wSpu7XOMhndLFffoK//BqTu1pquuktcvedufT+k7
102
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- /jT+vt1lvYn3K2132Y2o4IDP2qnx9nwu2tFeOrAG03QKaVDLvx3o8SvqHwVrFcfFrzEylXJZLlTkI
111
- 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
- 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
113
- `;
33
+ @property({ type: String })
34
+ accessor logo: string | URL = "";
114
35
 
115
36
  /** Add a drawer icon with a click event to e.g. open a sidebar. */
116
- @property({ type: Boolean }) drawer: boolean = true;
37
+ @property({ type: Boolean })
38
+ accessor drawer: boolean = true;
117
39
 
118
40
  /** Array of menu items to include as navigation tabs. */
119
- @property({ type: Array }) tabs: MenuItem[] = [];
41
+ @property({ type: Array })
42
+ accessor tabs: MenuItem[] = [];
120
43
 
121
44
  /** Size of toolbar vertically. */
122
- @property({ type: String }) size: sizes = "large";
123
-
124
- @state() private selectedTab: number = 0;
125
-
126
- static styles = [
127
- css`@unocss-placeholder;`,
128
- css`
129
- #right-section {
130
- display: flex;
131
- align-items: center;
132
- }
133
-
134
- sl-tab-group {
135
- display: flex;
136
- }
137
-
138
- sl-tab::part(base) {
139
- font-size: 1rem;
140
- border-bottom: 2px solid transparent;
141
- }
142
-
143
- sl-tab[selected]::part(base) {
144
- border-bottom: 2px solid white;
145
- }
146
-
147
- #drawer-block {
148
- display: flex;
149
- align-items: center;
150
- padding-right: 30px;
151
- }
152
-
153
- @media(prefers-color-scheme: light) {
154
- header {
155
- color: black;
156
- }
157
- #break {
158
- background-color: black;
159
- }
160
- }
161
- `
162
- ];
45
+ @property({ type: String })
46
+ accessor size: sizes = "small";
47
+
48
+ /** Border bottom. */
49
+ @property({ type: Boolean })
50
+ accessor borderBottom: boolean = true;
51
+
52
+ @property()
53
+ accessor selectedTab: number = 0;
163
54
 
164
55
  protected render() {
165
- const logoSrc = typeof this.logo === 'string' || this.logo instanceof URL ? (typeof this.logo === 'string' ? this.logo : this.logo.href) : '';
56
+ const logoSrc =
57
+ typeof this.logo === "string" || this.logo instanceof URL
58
+ ? typeof this.logo === "string"
59
+ ? this.logo
60
+ : this.logo.href
61
+ : "";
166
62
 
167
63
  return html`
168
- <header class=${headerVariants({size: this.size})}>
169
- <a href="/" class="flex flex-row">
170
- ${(logoSrc.length > 0) ? html`
171
- <img
172
- id="logo"
173
- src="${this.logo}"
174
- alt="Logo"
175
- class="h-10 px-10 hover:opacity-90"
176
- >
177
- ` : null}
178
-
179
- ${(this.title.length > 0) ? html`
180
- <h1 class="text-2xl color-primary font-sans font-bold pl-3 m-0">${this.title}</h1>
181
- ` : null}
182
- </a>
183
-
184
- ${ /* Navigation bar for desktop, hide on mobile */'' }
185
- <nav className="hidden sm:flex justify-between items-center gap-4 font-semibold">
186
- <sl-tab-group>
187
- ${this.tabs.map(
188
- (item, index) => html`
189
- <sl-tab
190
- slot="nav"
191
- panel="general"
192
- @click=${(e: MouseEvent) => { this._selectTab(e, item.clickEvent, index); }}
193
- ?selected=${this.selectedTab === index}
194
- >${item.label}</sl-tab>
195
- `
196
- )}
197
- </sl-tab-group>
198
- </nav>
199
-
200
- ${ /* Stacked navigation drawer for mobile */'' }
201
- ${ /* NOTE this should probably be in a drawer instead */'' }
202
- <nav className="sm:hidden flex flex-col items-end gap-1 font-semibold">
203
- </nav>
204
-
205
- <div id="right-section" style="display: flex; align-items: center;">
206
- <sl-icon-button
207
- library="bundled"
208
- name="person-circle"
209
- style="font-size: 1.8rem;"
210
- label="login"
211
- @click=${(e: MouseEvent) => { this._handleLogin(e)}}
212
- ></sl-icon-button>
213
-
214
- <div id="drawer-block" style="font-size: 2rem;">
215
- ${this.drawer ? html`
216
- <sl-icon-button library="bundled" name="list" label="drawer-open"></sl-icon-button>
217
- ` : null}
64
+ <header class=${headerVariants({
65
+ size: this.size,
66
+ borderBottom: this.borderBottom
67
+ })}>
68
+ <a href="/" class="header--link">
69
+ ${logoSrc.length > 0
70
+ ? html`
71
+ <img
72
+ id="logo"
73
+ src="${this.logo}"
74
+ alt="Logo"
75
+ class="header--logo-img"
76
+ />
77
+ `
78
+ : html`
79
+ <hot-logo
80
+ ?iconOnly="${this.title.length > 0}"
81
+ >
82
+ </hot-logo>
83
+ `}
84
+ ${this.title.length > 0
85
+ ? html`
86
+ <h1 class="header--title">
87
+ ${this.title}
88
+ </h1>
89
+ `
90
+ : null}
91
+ </a>
92
+
93
+ ${/* Navigation bar for desktop, hide on mobile */ ""}
94
+ <nav
95
+ class="header--nav"
96
+ >
97
+ <sl-tab-group class="header--tab-group">
98
+ ${this.tabs.map(
99
+ (item, index) => html`
100
+ <sl-tab
101
+ class="header--tab"
102
+ slot="nav"
103
+ panel="general"
104
+ @click=${(e: MouseEvent) => {
105
+ this._selectTab(e, item.clickEvent, index);
106
+ }}
107
+ ?selected=${this.selectedTab === index}
108
+ >${item.label}</sl-tab
109
+ >
110
+ `
111
+ )}
112
+ </sl-tab-group>
113
+ </nav>
114
+
115
+ ${/* Stacked navigation drawer for mobile */ ""}
116
+ ${/* NOTE this should probably be in a drawer instead */ ""}
117
+ <nav
118
+ class="header--nav-mobile"
119
+ ></nav>
120
+
121
+ <div id="right-section" class="header--right-section">
122
+ <sl-icon-button
123
+ library="bundled"
124
+ name="person-circle"
125
+ class="header--person-circle"
126
+ label="login"
127
+ @click=${(e: MouseEvent) => {
128
+ this._handleLogin(e);
129
+ }}
130
+ ></sl-icon-button>
131
+ ${this.drawer
132
+ ? html`
133
+ <sl-icon-button
134
+ library="bundled"
135
+ class="header--drawer"
136
+ name="list"
137
+ label="drawer-open"
138
+ ></sl-icon-button>
139
+ `
140
+ : null}
141
+ </div>
218
142
  </div>
219
- </div>
220
- </header>
143
+ </header>
221
144
  `;
222
145
  }
223
146
 
@@ -64,7 +64,7 @@ const icons = {
64
64
  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person-circle" viewBox="0 0 16 16">
65
65
  <path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
66
66
  <path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
67
- </svg>
67
+ </svg>
68
68
  `
69
69
  };
70
70
 
@@ -1,5 +1,6 @@
1
1
  // Index to import all components together
2
- // import '@hotosm/ui/components';
2
+
3
+ import { setBasePath } from '@shoelace-style/shoelace/dist/utilities/base-path.js';
3
4
 
4
5
  // Default Shoelace exports
5
6
  import SlAlert from '@shoelace-style/shoelace/dist/components/alert/alert.component.js';
@@ -63,6 +64,7 @@ import SlVisuallyHidden from '@shoelace-style/shoelace/dist/components/visually-
63
64
 
64
65
  // Custom composite components
65
66
  import HotHeader from './header/header';
67
+ import HotLogo from './logo/logo';
66
68
  import HotToolbar from './toolbar/toolbar';
67
69
  import HotTracking from './tracking/tracking';
68
70
 
@@ -194,66 +196,70 @@ declare global {
194
196
  }
195
197
 
196
198
  export {
197
- SlAlert,
198
- SlAnimatedImage,
199
- SlAnimation,
200
- SlAvatar,
201
- SlBadge,
202
- SlBreadcrumb,
203
- SlBreadcrumbItem,
204
- SlButton,
205
- SlButtonGroup,
206
- SlCard,
207
- SlCarousel,
208
- SlCarouselItem,
209
- SlCheckbox,
210
- SlColorPicker,
211
- SlCopyButton,
212
- SlDetails,
213
- SlDialog,
214
- SlDivider,
215
- SlDrawer,
216
- SlDropdown,
217
- SlFormatBytes,
218
- SlFormatDate,
219
- SlFormatNumber,
220
- SlIcon,
221
- SlIconButton,
222
- SlImageComparer,
223
- SlInclude,
224
- SlInput,
225
- SlMenu,
226
- SlMenuItem,
227
- SlMenuLabel,
228
- SlMutationObserver,
229
- SlOption,
230
- SlPopup,
231
- SlProgressBar,
232
- SlProgressRing,
233
- SlQRCode,
234
- SlRadio,
235
- SlRadioButton,
236
- SlRadioGroup,
237
- SlRange,
238
- SlRating,
239
- SlRelativeTime,
240
- SlResizeObserver,
241
- SlSelect,
242
- SlSkeleton,
243
- SlSpinner,
244
- SlSplitPanel,
245
- SlSwitch,
246
- SlTab,
247
- SlTabGroup,
248
- SlTabPanel,
249
- SlTag,
250
- SlTextarea,
251
- SlTooltip,
252
- SlTree,
253
- SlTreeItem,
254
- SlVisuallyHidden,
199
+ // setBasePath helper to use the UI behind proxies etc
200
+ setBasePath,
201
+ // Standard shoelace components
202
+ SlAlert as Alert,
203
+ SlAnimatedImage as AnimatedImage,
204
+ SlAnimation as Animation,
205
+ SlAvatar as Avatar,
206
+ SlBadge as Badge,
207
+ SlBreadcrumb as Breadcrumb,
208
+ SlBreadcrumbItem as BreadcrumbItem,
209
+ SlButton as Button,
210
+ SlButtonGroup as ButtonGroup,
211
+ SlCard as Card,
212
+ SlCarousel as Carousel,
213
+ SlCarouselItem as CarouselItem,
214
+ SlCheckbox as Checkbox,
215
+ SlColorPicker as ColorPicker,
216
+ SlCopyButton as CopyButton,
217
+ SlDetails as Details,
218
+ SlDialog as Dialog,
219
+ SlDivider as Divider,
220
+ SlDrawer as Drawer,
221
+ SlDropdown as Dropdown,
222
+ SlFormatBytes as FormatBytes,
223
+ SlFormatDate as FormatDate,
224
+ SlFormatNumber as FormatNumber,
225
+ SlIcon as Icon,
226
+ SlIconButton as IconButton,
227
+ SlImageComparer as ImageComparer,
228
+ SlInclude as Include,
229
+ SlInput as Input,
230
+ SlMenu as Menu,
231
+ SlMenuItem as MenuItem,
232
+ SlMenuLabel as MenuLabel,
233
+ SlMutationObserver as MutationObserver,
234
+ SlOption as Option,
235
+ SlPopup as Popup,
236
+ SlProgressBar as ProgressBar,
237
+ SlProgressRing as ProgressRing,
238
+ SlQRCode as QRCode,
239
+ SlRadio as Radio,
240
+ SlRadioButton as RadioButton,
241
+ SlRadioGroup as RadioGroup,
242
+ SlRange as Range,
243
+ SlRating as Rating,
244
+ SlRelativeTime as RelativeTime,
245
+ SlResizeObserver as ResizeObserver,
246
+ SlSelect as Select,
247
+ SlSkeleton as Skeleton,
248
+ SlSpinner as Spinner,
249
+ SlSplitPanel as SplitPanel,
250
+ SlSwitch as Switch,
251
+ SlTab as Tab,
252
+ SlTabGroup as TabGroup,
253
+ SlTabPanel as TabPanel,
254
+ SlTag as Tag,
255
+ SlTextarea as Textarea,
256
+ SlTooltip as Tooltip,
257
+ SlTree as Tree,
258
+ SlTreeItem as TreeItem,
259
+ SlVisuallyHidden as VisuallyHidden,
255
260
  // Custom composite components
256
- HotHeader,
257
- HotToolbar,
258
- HotTracking,
261
+ HotHeader as Header,
262
+ HotLogo as Logo,
263
+ HotToolbar as Toolbar,
264
+ HotTracking as Tracking,
259
265
  }
@@ -0,0 +1,8 @@
1
+ import { css } from 'lit';
2
+
3
+ export default css`
4
+ .logo {
5
+ line-height: 0;
6
+ height: var(--sl-spacing-3x-large)
7
+ }
8
+ `
@@ -0,0 +1,37 @@
1
+
2
+ import HotLogoIconSVG from '../../theme/logo/hot-logo-icon.svg';
3
+ import HotLogoTextSVG from '../../theme/logo/hot-logo-text.svg';
4
+
5
+ import { LitElement, html } from "lit";
6
+ import { property } from "lit/decorators.js";
7
+ import styles from './logo.styles.js';
8
+ import type { CSSResultGroup } from 'lit';
9
+
10
+ export class Logo extends LitElement {
11
+
12
+ static styles: CSSResultGroup = [styles];
13
+
14
+ name = 'hot-logo';
15
+
16
+ @property({ type: Boolean })
17
+ accessor iconOnly = false;
18
+
19
+ @property({ type: Boolean })
20
+ accessor textOnly = false;
21
+
22
+ protected render() {
23
+
24
+ return html`
25
+ <div class="logo">
26
+ ${ !this.textOnly ? html`<img src=${HotLogoIconSVG} />` : null }
27
+ ${ !this.iconOnly ? html`<img src=${HotLogoTextSVG} />` : null }
28
+ </div>
29
+ `;
30
+ }
31
+
32
+ }
33
+
34
+ export default Logo;
35
+
36
+ // Define web component
37
+ customElements.define("hot-logo", Logo);
@@ -0,0 +1,16 @@
1
+ // @ts-ignore
2
+ import * as React from 'react';
3
+ import { createComponent } from '@lit/react';
4
+ import Header from '../header/header';
5
+
6
+ const reactWrapper = createComponent({
7
+ tagName: 'hot-header',
8
+ elementClass: Header,
9
+ react: React,
10
+ events: {
11
+ onLogin: 'login',
12
+ },
13
+ displayName: 'HotHeader'
14
+ });
15
+
16
+ export default reactWrapper;
@@ -0,0 +1,15 @@
1
+
2
+ // @ts-ignore
3
+ import * as React from 'react';
4
+ import { createComponent } from '@lit/react';
5
+ import Logo from '../logo/logo';
6
+
7
+ const reactWrapper = createComponent({
8
+ tagName: 'hot-logo',
9
+ elementClass: Logo,
10
+ react: React,
11
+ events: {},
12
+ displayName: 'HotLogo'
13
+ });
14
+
15
+ export default reactWrapper;
@@ -0,0 +1,24 @@
1
+
2
+ // @ts-ignore
3
+ import * as React from 'react';
4
+ import { createComponent } from '@lit/react';
5
+ import Toolbar from '../toolbar/toolbar';
6
+
7
+ const reactWrapper = createComponent({
8
+ tagName: 'hot-toolbar',
9
+ elementClass: Toolbar,
10
+ react: React,
11
+ events: {
12
+ onUndoClick: 'undo',
13
+ onRedoClick: 'redo',
14
+ onBoldClick: 'bold',
15
+ onItalicClick: 'italic',
16
+ onUnderlineClick: 'underline',
17
+ onLeftalignClick: 'leftalign',
18
+ onCenteralignClick: 'centeralign',
19
+ onRightalignClick: 'rightalign',
20
+ },
21
+ displayName: 'HotToolbar'
22
+ });
23
+
24
+ export default reactWrapper;
@@ -0,0 +1,17 @@
1
+ // @ts-ignore
2
+ import * as React from 'react';
3
+ import { createComponent } from '@lit/react';
4
+ import Tracking from '../tracking/tracking';
5
+
6
+ const reactWrapper = createComponent({
7
+ tagName: 'hot-tracking',
8
+ elementClass: Tracking,
9
+ react: React,
10
+ events: {
11
+ onAgree: 'agree',
12
+ onDisagree: 'disagree',
13
+ },
14
+ displayName: 'HotTracking'
15
+ });
16
+
17
+ export default reactWrapper;