@design.estate/dees-catalog 3.51.1 → 3.51.2

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 (58) hide show
  1. package/dist_bundle/bundle.js +2309 -2195
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-chart/dees-chart-area/component.d.ts +1 -0
  4. package/dist_ts_web/elements/00group-chart/dees-chart-area/component.js +2 -1
  5. package/dist_ts_web/elements/00group-chart/dees-chart-area/styles.js +14 -34
  6. package/dist_ts_web/elements/00group-chart/dees-chart-area/template.js +4 -5
  7. package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.d.ts +1 -0
  8. package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.js +16 -24
  9. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.d.ts +1 -0
  10. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js +14 -28
  11. package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.d.ts +1 -0
  12. package/dist_ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.js +52 -51
  13. package/dist_ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.d.ts +1 -0
  14. package/dist_ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.js +22 -29
  15. package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.d.ts +1 -0
  16. package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.js +6 -6
  17. package/dist_ts_web/elements/00group-dataview/dees-table/styles.js +51 -44
  18. package/dist_ts_web/elements/00group-input/dees-input-code/dees-input-code.d.ts +1 -0
  19. package/dist_ts_web/elements/00group-input/dees-input-code/dees-input-code.js +7 -14
  20. package/dist_ts_web/elements/00group-input/dees-input-richtext/component.d.ts +1 -0
  21. package/dist_ts_web/elements/00group-input/dees-input-richtext/component.js +2 -1
  22. package/dist_ts_web/elements/00group-input/dees-input-richtext/styles.js +12 -20
  23. package/dist_ts_web/elements/00group-input/dees-input-richtext/template.js +5 -5
  24. package/dist_ts_web/elements/00group-layout/dees-tile/dees-tile.d.ts +34 -0
  25. package/dist_ts_web/elements/00group-layout/dees-tile/dees-tile.demo.d.ts +2 -0
  26. package/dist_ts_web/elements/00group-layout/dees-tile/dees-tile.demo.js +67 -0
  27. package/dist_ts_web/elements/00group-layout/dees-tile/dees-tile.js +187 -0
  28. package/dist_ts_web/elements/00group-layout/dees-tile/index.d.ts +1 -0
  29. package/dist_ts_web/elements/00group-layout/dees-tile/index.js +2 -0
  30. package/dist_ts_web/elements/00group-layout/index.d.ts +1 -0
  31. package/dist_ts_web/elements/00group-layout/index.js +2 -1
  32. package/dist_ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.d.ts +1 -0
  33. package/dist_ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.js +82 -74
  34. package/dist_ts_web/elements/00group-workspace/dees-workspace-terminal-preview/dees-workspace-terminal-preview.d.ts +1 -0
  35. package/dist_ts_web/elements/00group-workspace/dees-workspace-terminal-preview/dees-workspace-terminal-preview.js +8 -15
  36. package/dist_watch/bundle.js +2309 -2195
  37. package/dist_watch/bundle.js.map +4 -4
  38. package/package.json +1 -1
  39. package/ts_web/00_commitinfo_data.ts +1 -1
  40. package/ts_web/elements/00group-chart/dees-chart-area/component.ts +1 -0
  41. package/ts_web/elements/00group-chart/dees-chart-area/styles.ts +13 -33
  42. package/ts_web/elements/00group-chart/dees-chart-area/template.ts +3 -4
  43. package/ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.ts +15 -23
  44. package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.ts +13 -27
  45. package/ts_web/elements/00group-dataview/dees-dataview-statusobject/dees-dataview-statusobject.ts +51 -50
  46. package/ts_web/elements/00group-dataview/dees-statsgrid/dees-statsgrid.ts +21 -28
  47. package/ts_web/elements/00group-dataview/dees-table/dees-table.ts +5 -5
  48. package/ts_web/elements/00group-dataview/dees-table/styles.ts +50 -43
  49. package/ts_web/elements/00group-input/dees-input-code/dees-input-code.ts +6 -13
  50. package/ts_web/elements/00group-input/dees-input-richtext/component.ts +1 -0
  51. package/ts_web/elements/00group-input/dees-input-richtext/styles.ts +11 -19
  52. package/ts_web/elements/00group-input/dees-input-richtext/template.ts +5 -5
  53. package/ts_web/elements/00group-layout/dees-tile/dees-tile.demo.ts +67 -0
  54. package/ts_web/elements/00group-layout/dees-tile/dees-tile.ts +139 -0
  55. package/ts_web/elements/00group-layout/dees-tile/index.ts +1 -0
  56. package/ts_web/elements/00group-layout/index.ts +1 -0
  57. package/ts_web/elements/00group-simple/dees-shopping-productcard/dees-shopping-productcard.ts +92 -84
  58. package/ts_web/elements/00group-workspace/dees-workspace-terminal-preview/dees-workspace-terminal-preview.ts +7 -14
@@ -15,6 +15,7 @@ import {
15
15
  } from './data.js';
16
16
  import { compileLucenePredicate } from './lucene.js';
17
17
  import { themeDefaultStyles } from '../../00theme.js';
18
+ import '../../00group-layout/dees-tile/dees-tile.js';
18
19
 
19
20
  export type { Column, ITableAction, ITableActionDataArg, TDisplayFunction } from './types.js';
20
21
 
@@ -221,9 +222,8 @@ export class DeesTable<T> extends DeesElement {
221
222
  );
222
223
  (this as any)._lastViewData = viewData;
223
224
  return html`
224
- <div class="mainbox">
225
- <!-- the heading part -->
226
- <div class="header">
225
+ <dees-tile>
226
+ <div slot="header" class="header">
227
227
  <div class="headingContainer">
228
228
  <div class="heading heading1">${this.label || this.heading1}</div>
229
229
  <div class="heading heading2">${this.heading2}</div>
@@ -496,7 +496,7 @@ export class DeesTable<T> extends DeesElement {
496
496
  </div>
497
497
  `
498
498
  : html` <div class="noDataSet">No data set!</div> `}
499
- <div class="footer">
499
+ <div slot="footer" class="footer">
500
500
  <div class="tableStatistics">
501
501
  ${this.data.length} ${this.dataName || 'data rows'} (total) |
502
502
  ${this.selectedDataRow ? '# ' + `${this.data.indexOf(this.selectedDataRow) + 1}` : `No`}
@@ -528,7 +528,7 @@ export class DeesTable<T> extends DeesElement {
528
528
  })}
529
529
  </div>
530
530
  </div>
531
- </div>
531
+ </dees-tile>
532
532
  `;
533
533
  }
534
534
 
@@ -12,17 +12,11 @@ export const tableStyles: CSSResult[] = [
12
12
  width: 100%;
13
13
  }
14
14
 
15
- .mainbox {
15
+ dees-tile {
16
16
  color: ${cssManager.bdTheme('hsl(0 0% 3.9%)', 'hsl(0 0% 98%)')};
17
17
  font-family: ${cssGeistFontFamily};
18
18
  font-weight: 400;
19
19
  font-size: 14px;
20
- display: block;
21
- width: 100%;
22
- background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 3.9%)')};
23
- border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
24
- border-radius: 8px;
25
- overflow: hidden;
26
20
  cursor: default;
27
21
  }
28
22
 
@@ -30,30 +24,31 @@ export const tableStyles: CSSResult[] = [
30
24
  display: flex;
31
25
  justify-content: space-between;
32
26
  align-items: center;
33
- padding: 16px 24px;
34
- min-height: 64px;
35
- border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
27
+ padding: 0 16px;
28
+ height: 40px;
36
29
  }
37
30
 
38
31
  .headingContainer {
39
32
  flex: 1;
33
+ display: flex;
34
+ align-items: baseline;
40
35
  }
41
36
 
42
37
  .heading {
43
- line-height: 1.5;
38
+ line-height: 1;
44
39
  }
45
40
 
46
41
  .heading1 {
47
- font-size: 18px;
48
- font-weight: 600;
49
- color: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 95%)')};
50
- letter-spacing: -0.025em;
42
+ font-size: 14px;
43
+ font-weight: 500;
44
+ color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 63.9%)')};
45
+ letter-spacing: -0.01em;
51
46
  }
52
-
47
+
53
48
  .heading2 {
54
- font-size: 14px;
49
+ font-size: 12px;
55
50
  color: ${cssManager.bdTheme('hsl(215.4 16.3% 56.9%)', 'hsl(215 20.2% 55.1%)')};
56
- margin-top: 2px;
51
+ margin-left: 8px;
57
52
  }
58
53
 
59
54
  .headingSeparation {
@@ -70,14 +65,14 @@ export const tableStyles: CSSResult[] = [
70
65
  .headerAction {
71
66
  display: flex;
72
67
  align-items: center;
73
- gap: 6px;
74
- padding: 6px 12px;
75
- font-size: 14px;
68
+ gap: 4px;
69
+ padding: 4px 10px;
70
+ font-size: 12px;
76
71
  font-weight: 500;
77
72
  color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')};
78
73
  background: transparent;
79
74
  border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
80
- border-radius: 6px;
75
+ border-radius: 4px;
81
76
  cursor: pointer;
82
77
  transition: all 0.15s ease;
83
78
  }
@@ -199,7 +194,7 @@ export const tableStyles: CSSResult[] = [
199
194
  }
200
195
 
201
196
  tbody tr:hover {
202
- background: ${cssManager.bdTheme('hsl(210 40% 96.1% / 0.5)', 'hsl(0 0% 14.9% / 0.5)')};
197
+ background: ${cssManager.bdTheme('hsl(222.2 47.4% 51.2% / 0.06)', 'hsl(217.2 91.2% 59.8% / 0.08)')};
203
198
  }
204
199
 
205
200
  /* Column hover effect for better traceability */
@@ -214,7 +209,7 @@ export const tableStyles: CSSResult[] = [
214
209
  bottom: 0;
215
210
  left: 0;
216
211
  right: 0;
217
- background: ${cssManager.bdTheme('hsl(210 40% 96.1% / 0.3)', 'hsl(0 0% 14.9% / 0.3)')};
212
+ background: ${cssManager.bdTheme('hsl(222.2 47.4% 51.2% / 0.04)', 'hsl(217.2 91.2% 59.8% / 0.05)')};
218
213
  opacity: 0;
219
214
  pointer-events: none;
220
215
  transition: opacity 0.15s ease;
@@ -238,15 +233,19 @@ export const tableStyles: CSSResult[] = [
238
233
  border-top: none;
239
234
  }
240
235
 
241
- :host([show-grid]) th:first-child,
242
- :host([show-grid]) td:first-child {
243
- border-left: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
244
- }
245
-
246
236
  :host([show-grid]) tbody tr:first-child td {
247
237
  border-top: none;
248
238
  }
249
239
 
240
+ /* Remove edge borders that would double with tile frame */
241
+ :host([show-grid]) th:last-child,
242
+ :host([show-grid]) td:last-child {
243
+ border-right: none;
244
+ }
245
+ :host([show-grid]) tbody tr:last-child td {
246
+ border-bottom: none;
247
+ }
248
+
250
249
  /* Sticky Actions column (right pinned) */
251
250
  thead th.actionsCol,
252
251
  tbody td.actionsCol {
@@ -261,7 +260,7 @@ export const tableStyles: CSSResult[] = [
261
260
  }
262
261
 
263
262
  tbody tr.selected {
264
- background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 14.9%)')};
263
+ background: ${cssManager.bdTheme('hsl(222.2 47.4% 51.2% / 0.1)', 'hsl(217.2 91.2% 59.8% / 0.12)')};
265
264
  }
266
265
 
267
266
  tbody tr.hasAttachment {
@@ -269,10 +268,11 @@ export const tableStyles: CSSResult[] = [
269
268
  }
270
269
 
271
270
  th {
272
- height: 48px;
273
- padding: 12px 24px;
271
+ height: 36px;
272
+ padding: 8px 16px;
274
273
  text-align: left;
275
274
  font-weight: 500;
275
+ font-size: 12px;
276
276
  color: ${cssManager.bdTheme('hsl(215.4 16.3% 46.9%)', 'hsl(215 20.2% 65.1%)')};
277
277
  letter-spacing: -0.01em;
278
278
  }
@@ -282,8 +282,9 @@ export const tableStyles: CSSResult[] = [
282
282
  }
283
283
 
284
284
  td {
285
- padding: 12px 24px;
285
+ padding: 8px 16px;
286
286
  vertical-align: middle;
287
+ font-size: 13px;
287
288
  color: ${cssManager.bdTheme('hsl(0 0% 3.9%)', 'hsl(0 0% 98%)')};
288
289
  }
289
290
 
@@ -293,18 +294,23 @@ export const tableStyles: CSSResult[] = [
293
294
 
294
295
  th:first-child,
295
296
  td:first-child {
296
- padding-left: 24px;
297
+ padding-left: 16px;
297
298
  }
298
299
 
299
300
  th:last-child,
300
301
  td:last-child {
301
- padding-right: 24px;
302
+ padding-right: 16px;
302
303
  }
303
304
 
304
305
  :host([show-vertical-lines]) th:last-child,
305
306
  :host([show-vertical-lines]) td:last-child {
306
307
  border-right: none;
307
308
  }
309
+
310
+ /* Default bottom border on last row removed — tile frame handles it */
311
+ :host(:not([show-horizontal-lines])) tbody tr:last-child {
312
+ border-bottom: none;
313
+ }
308
314
 
309
315
  .innerCellContainer {
310
316
  position: relative;
@@ -389,12 +395,12 @@ export const tableStyles: CSSResult[] = [
389
395
  display: flex;
390
396
  align-items: center;
391
397
  justify-content: space-between;
392
- height: 52px;
393
- padding: 0 24px;
394
- font-size: 14px;
395
- color: ${cssManager.bdTheme('hsl(215.4 16.3% 46.9%)', 'hsl(215 20.2% 65.1%)')};
396
- background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 9%)')};
397
- border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
398
+ height: 32px;
399
+ padding: 0 16px;
400
+ font-size: 11px;
401
+ color: ${cssManager.bdTheme('hsl(0 0% 45%)', 'hsl(0 0% 55%)')};
402
+ width: 100%;
403
+ box-sizing: border-box;
398
404
  }
399
405
 
400
406
  .tableStatistics {
@@ -409,9 +415,10 @@ export const tableStyles: CSSResult[] = [
409
415
  .footerActions .footerAction {
410
416
  display: flex;
411
417
  align-items: center;
412
- gap: 6px;
413
- padding: 6px 12px;
418
+ gap: 4px;
419
+ padding: 2px 8px;
414
420
  font-weight: 500;
421
+ font-size: 11px;
415
422
  color: ${cssManager.bdTheme('hsl(215.4 16.3% 46.9%)', 'hsl(215 20.2% 65.1%)')};
416
423
  border-radius: 6px;
417
424
  cursor: pointer;
@@ -12,6 +12,7 @@ import { themeDefaultStyles } from '../../00theme.js';
12
12
  import { DeesModal } from '../../00group-overlay/dees-modal/dees-modal.js';
13
13
  import '../../00group-utility/dees-icon/dees-icon.js';
14
14
  import '../../00group-layout/dees-label/dees-label.js';
15
+ import '../../00group-layout/dees-tile/dees-tile.js';
15
16
  import '../../00group-workspace/dees-workspace-monaco/dees-workspace-monaco.js';
16
17
  import { DeesWorkspaceMonaco } from '../../00group-workspace/dees-workspace-monaco/dees-workspace-monaco.js';
17
18
 
@@ -105,24 +106,16 @@ export class DeesInputCode extends DeesInputBase<string> {
105
106
  min-height: 0;
106
107
  }
107
108
 
108
- .code-container {
109
- display: flex;
110
- flex-direction: column;
109
+ dees-tile {
111
110
  flex: 1;
112
111
  min-height: 0;
113
- border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
114
- border-radius: 6px;
115
- overflow: hidden;
116
- background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 9%)')};
117
112
  }
118
113
 
119
114
  .toolbar {
120
115
  display: flex;
121
116
  align-items: center;
122
117
  justify-content: space-between;
123
- padding: 8px 12px;
124
- background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 7%)')};
125
- border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
118
+ padding: 4px 12px;
126
119
  gap: 8px;
127
120
  }
128
121
 
@@ -256,8 +249,8 @@ export class DeesInputCode extends DeesInputBase<string> {
256
249
  </style>
257
250
  <div class="input-wrapper">
258
251
  <dees-label .label=${this.label} .description=${this.description} .required=${this.required}></dees-label>
259
- <div class="code-container">
260
- <div class="toolbar">
252
+ <dees-tile>
253
+ <div slot="header" class="toolbar">
261
254
  <div class="toolbar-left">
262
255
  <div class="language-selector">
263
256
  <button
@@ -322,7 +315,7 @@ export class DeesInputCode extends DeesInputBase<string> {
322
315
  @content-change=${this.handleContentChange}
323
316
  ></dees-workspace-monaco>
324
317
  </div>
325
- </div>
318
+ </dees-tile>
326
319
  </div>
327
320
  `;
328
321
  }
@@ -16,6 +16,7 @@ import {
16
16
 
17
17
  import type { Editor } from '@tiptap/core';
18
18
  import { DeesServiceLibLoader, type ITiptapBundle } from '../../../services/index.js';
19
+ import '../../00group-layout/dees-tile/dees-tile.js';
19
20
 
20
21
  declare global {
21
22
  interface HTMLElementTagNameMap {
@@ -23,22 +23,15 @@ export const richtextStyles = [
23
23
  color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 93.9%)')};
24
24
  }
25
25
 
26
- .editor-container {
27
- display: flex;
28
- flex-direction: column;
29
- min-height: ${cssManager.bdTheme('200px', '200px')};
30
- border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
31
- border-radius: 6px;
32
- background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 9%)')};
33
- overflow: hidden;
34
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
26
+ dees-tile {
27
+ min-height: 200px;
35
28
  }
36
29
 
37
- .editor-container:hover {
30
+ dees-tile:hover::part(outer) {
38
31
  border-color: ${cssManager.bdTheme('hsl(0 0% 79.8%)', 'hsl(0 0% 20.9%)')};
39
32
  }
40
33
 
41
- .editor-container.focused {
34
+ dees-tile.focused::part(outer) {
42
35
  border-color: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 98%)')};
43
36
  box-shadow: 0 0 0 2px ${cssManager.bdTheme('hsl(0 0% 9% / 0.05)', 'hsl(0 0% 98% / 0.05)')};
44
37
  }
@@ -47,9 +40,7 @@ export const richtextStyles = [
47
40
  display: flex;
48
41
  flex-wrap: wrap;
49
42
  gap: 4px;
50
- padding: 8px 12px;
51
- background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 14.9%)')};
52
- border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
43
+ padding: 4px 12px;
53
44
  align-items: center;
54
45
  position: relative;
55
46
  }
@@ -199,14 +190,15 @@ export const richtextStyles = [
199
190
  }
200
191
 
201
192
  .editor-footer {
202
- padding: 8px 12px;
203
- background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 14.9%)')};
204
- border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
205
- font-size: 12px;
206
- color: ${cssManager.bdTheme('hsl(215.4 16.3% 46.9%)', 'hsl(215 20.2% 65.1%)')};
193
+ padding: 0 12px;
194
+ height: 28px;
195
+ font-size: 11px;
196
+ color: ${cssManager.bdTheme('hsl(0 0% 45%)', 'hsl(0 0% 55%)')};
207
197
  display: flex;
208
198
  justify-content: space-between;
209
199
  align-items: center;
200
+ width: 100%;
201
+ box-sizing: border-box;
210
202
  }
211
203
 
212
204
  .word-count {
@@ -5,8 +5,8 @@ export const renderRichtext = (component: DeesInputRichtext): TemplateResult =>
5
5
  return html`
6
6
  <div class="input-wrapper">
7
7
  ${component.label ? html`<label class="label">${component.label}</label>` : ''}
8
- <div class="editor-container ${component.editor?.isFocused ? 'focused' : ''}" style="--min-height: ${component.minHeight}px">
9
- <div class="editor-toolbar">
8
+ <dees-tile class="${component.editor?.isFocused ? 'focused' : ''}" style="--min-height: ${component.minHeight}px">
9
+ <div slot="header" class="editor-toolbar">
10
10
  ${component.renderToolbar()}
11
11
  <div class="link-input ${component.showLinkInput ? 'show' : ''}">
12
12
  <input type="url" placeholder="Enter URL..." @keydown=${component.handleLinkInputKeydown} />
@@ -20,14 +20,14 @@ export const renderRichtext = (component: DeesInputRichtext): TemplateResult =>
20
20
  <div class="editor-content"></div>
21
21
  ${component.showWordCount
22
22
  ? html`
23
- <div class="editor-footer">
23
+ <div slot="footer" class="editor-footer">
24
24
  <span class="word-count">${component.wordCount} word${component.wordCount !== 1 ? 's' : ''}</span>
25
25
  </div>
26
26
  `
27
27
  : ''}
28
- </div>
28
+ </dees-tile>
29
29
  ${component.description ? html`<div class="description">${component.description}</div>` : ''}
30
30
  </div>
31
31
  `;
32
-
32
+
33
33
  };
@@ -0,0 +1,67 @@
1
+ import { html, css, cssManager } from '@design.estate/dees-element';
2
+ import './dees-tile.js';
3
+
4
+ export const demoFunc = () => {
5
+ return html`
6
+ <dees-demowrapper>
7
+ <style>
8
+ ${css`
9
+ .demoBox {
10
+ background: ${cssManager.bdTheme('hsl(0 0% 95%)', 'hsl(0 0% 9%)')};
11
+ padding: 40px;
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: 24px;
15
+ }
16
+ .tile-demo-content {
17
+ position: absolute;
18
+ inset: 0;
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ color: ${cssManager.bdTheme('hsl(0 0% 45%)', 'hsl(0 0% 55%)')};
23
+ font-size: 13px;
24
+ }
25
+ .footer-stats {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: 24px;
29
+ font-size: 11px;
30
+ width: 100%;
31
+ }
32
+ .footer-stats .stat {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 6px;
36
+ }
37
+ .footer-stats .stat strong {
38
+ color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')};
39
+ }
40
+ `}
41
+ </style>
42
+ <div class="demoBox">
43
+ <dees-tile heading="Simple Tile" style="height: 200px;">
44
+ <div class="tile-demo-content">Content area with rounded corners</div>
45
+ </dees-tile>
46
+
47
+ <dees-tile heading="Tile with Footer" style="height: 200px;">
48
+ <div class="tile-demo-content">Content goes here</div>
49
+ <div slot="footer" class="footer-stats">
50
+ <span class="stat">latest <strong>42</strong></span>
51
+ <span class="stat">min <strong>12</strong></span>
52
+ <span class="stat">max <strong>87</strong></span>
53
+ <span class="stat">avg <strong>45.3</strong></span>
54
+ </div>
55
+ </dees-tile>
56
+
57
+ <dees-tile style="height: 200px;">
58
+ <div slot="header" style="display:flex;align-items:center;gap:12px;width:100%;">
59
+ <span style="font-weight:500;">Custom Header</span>
60
+ <input type="text" placeholder="Search..." style="flex:1;max-width:200px;padding:2px 8px;border:1px solid;border-radius:4px;font-size:12px;background:transparent;color:inherit;border-color:inherit;">
61
+ </div>
62
+ <div class="tile-demo-content">Custom header slot with search input</div>
63
+ </dees-tile>
64
+ </div>
65
+ </dees-demowrapper>
66
+ `;
67
+ };
@@ -0,0 +1,139 @@
1
+ import {
2
+ customElement,
3
+ DeesElement,
4
+ html,
5
+ css,
6
+ cssManager,
7
+ property,
8
+ state,
9
+ type TemplateResult,
10
+ } from '@design.estate/dees-element';
11
+ import { demoFunc } from './dees-tile.demo.js';
12
+ import { cssGeistFontFamily } from '../../00fonts.js';
13
+ import { themeDefaultStyles } from '../../00theme.js';
14
+
15
+ declare global {
16
+ interface HTMLElementTagNameMap {
17
+ 'dees-tile': DeesTile;
18
+ }
19
+ }
20
+
21
+ /**
22
+ * dees-tile — the unified "rounded on rounded" tile frame.
23
+ *
24
+ * RESPONSIBILITIES (what this component owns):
25
+ * 1. Outer card — border, border-radius, background, overflow clipping
26
+ * 2. Flex column layout — stacking header / content / footer vertically
27
+ * 3. Content inset — the rounded inner area with border-top and border-bottom
28
+ * 4. Default heading — styled 32px heading text when no slot="header" is provided
29
+ * 5. Footer visibility — auto-hides footer area when slot="footer" is empty
30
+ *
31
+ * NOT RESPONSIBILITIES (what consumer components own):
32
+ * - Header/footer height, padding, font-size, colors when using custom slots
33
+ * - Content layout (absolute, flex, grid — consumer decides)
34
+ * - Any semantic meaning of header/footer content
35
+ *
36
+ * The header and footer slots are BARE containers (just flex-shrink: 0).
37
+ * The slotted content fully controls its own appearance.
38
+ * Only the default heading fallback (.tile-heading) carries tile-level styling.
39
+ */
40
+ @customElement('dees-tile')
41
+ export class DeesTile extends DeesElement {
42
+ public static demo = demoFunc;
43
+ public static demoGroups = ['Layout'];
44
+
45
+ @property({ type: String })
46
+ accessor heading: string = '';
47
+
48
+ @state()
49
+ accessor hasFooter: boolean = false;
50
+
51
+ public static styles = [
52
+ themeDefaultStyles,
53
+ cssManager.defaultStyles,
54
+ css`
55
+ :host {
56
+ display: flex;
57
+ flex-direction: column;
58
+ font-family: ${cssGeistFontFamily};
59
+ color: ${cssManager.bdTheme('hsl(0 0% 3.9%)', 'hsl(0 0% 98%)')};
60
+ }
61
+
62
+ /* --- The frame --- */
63
+ .tile-outer {
64
+ position: relative;
65
+ flex: 1;
66
+ min-height: 0;
67
+ background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 3.9%)')};
68
+ border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
69
+ border-radius: 8px;
70
+ overflow: hidden;
71
+ display: flex;
72
+ flex-direction: column;
73
+ }
74
+
75
+ /* --- Header: bare container, only the default heading gets styled --- */
76
+ .tile-header {
77
+ flex-shrink: 0;
78
+ }
79
+
80
+ .tile-heading {
81
+ height: 32px;
82
+ line-height: 32px;
83
+ padding: 0 16px;
84
+ font-size: 14px;
85
+ font-weight: 500;
86
+ letter-spacing: -0.01em;
87
+ color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 63.9%)')};
88
+ }
89
+
90
+ /* --- Content: the rounded inset --- */
91
+ .tile-content {
92
+ flex: 1;
93
+ position: relative;
94
+ border-radius: 8px;
95
+ border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 93%)', 'hsl(0 0% 11%)')};
96
+ border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 93%)', 'hsl(0 0% 11%)')};
97
+ overflow: hidden;
98
+ }
99
+
100
+ .tile-content.no-footer {
101
+ border-bottom: none;
102
+ border-bottom-left-radius: 0;
103
+ border-bottom-right-radius: 0;
104
+ }
105
+
106
+ /* --- Footer: bare container, consumer styles the slotted content --- */
107
+ .tile-footer {
108
+ flex-shrink: 0;
109
+ }
110
+
111
+ .tile-footer.hidden {
112
+ display: none;
113
+ }
114
+ `,
115
+ ];
116
+
117
+ public render(): TemplateResult {
118
+ return html`
119
+ <div class="tile-outer" part="outer">
120
+ <div class="tile-header" part="header">
121
+ <slot name="header">
122
+ <div class="tile-heading">${this.heading}</div>
123
+ </slot>
124
+ </div>
125
+ <div class="tile-content ${!this.hasFooter ? 'no-footer' : ''}" part="content">
126
+ <slot></slot>
127
+ </div>
128
+ <div class="tile-footer ${!this.hasFooter ? 'hidden' : ''}" part="footer">
129
+ <slot name="footer" @slotchange=${this.onFooterSlotChange}></slot>
130
+ </div>
131
+ </div>
132
+ `;
133
+ }
134
+
135
+ private onFooterSlotChange(e: Event) {
136
+ const slot = e.target as HTMLSlotElement;
137
+ this.hasFooter = slot.assignedNodes({ flatten: true }).length > 0;
138
+ }
139
+ }
@@ -0,0 +1 @@
1
+ export * from './dees-tile.js';
@@ -6,3 +6,4 @@ export * from './dees-label/index.js';
6
6
  export * from './dees-pagination/index.js';
7
7
  export * from './dees-panel/index.js';
8
8
  export * from './dees-stepper/index.js';
9
+ export * from './dees-tile/index.js';