@design.estate/dees-catalog 3.76.0 → 3.77.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 (39) hide show
  1. package/dist_bundle/bundle.js +477 -451
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-dataview/dees-table/dees-table.js +28 -3
  4. package/dist_ts_web/elements/00group-dataview/dees-table/styles.js +28 -1
  5. package/dist_ts_web/elements/00group-dataview/dees-table/types.d.ts +15 -0
  6. package/dist_ts_web/elements/00group-input/dees-input-checkbox/dees-input-checkbox.demo.js +96 -94
  7. package/dist_ts_web/elements/00group-input/dees-input-dropdown/dees-input-dropdown.demo.js +27 -31
  8. package/dist_ts_web/elements/00group-input/dees-input-fileupload/demo.js +36 -36
  9. package/dist_ts_web/elements/00group-input/dees-input-iban/dees-input-iban.demo.js +20 -24
  10. package/dist_ts_web/elements/00group-input/dees-input-list/dees-input-list.demo.js +22 -20
  11. package/dist_ts_web/elements/00group-input/dees-input-multitoggle/dees-input-multitoggle.demo.js +67 -65
  12. package/dist_ts_web/elements/00group-input/dees-input-phone/dees-input-phone.demo.js +20 -24
  13. package/dist_ts_web/elements/00group-input/dees-input-quantityselector/dees-input-quantityselector.demo.js +5 -11
  14. package/dist_ts_web/elements/00group-input/dees-input-radiogroup/dees-input-radiogroup.demo.js +54 -54
  15. package/dist_ts_web/elements/00group-input/dees-input-tags/dees-input-tags.demo.js +21 -19
  16. package/dist_ts_web/elements/00group-input/dees-input-text/dees-input-text.demo.js +37 -41
  17. package/dist_ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.demo.js +35 -33
  18. package/dist_ts_web/elements/00group-input/dees-input-typelist/dees-input-typelist.demo.js +19 -25
  19. package/dist_watch/bundle.js +442 -449
  20. package/dist_watch/bundle.js.map +2 -2
  21. package/package.json +1 -1
  22. package/readme.md +19 -12
  23. package/ts_web/00_commitinfo_data.ts +1 -1
  24. package/ts_web/elements/00group-dataview/dees-table/dees-table.ts +28 -2
  25. package/ts_web/elements/00group-dataview/dees-table/styles.ts +33 -0
  26. package/ts_web/elements/00group-dataview/dees-table/types.ts +19 -0
  27. package/ts_web/elements/00group-input/dees-input-checkbox/dees-input-checkbox.demo.ts +95 -93
  28. package/ts_web/elements/00group-input/dees-input-dropdown/dees-input-dropdown.demo.ts +40 -44
  29. package/ts_web/elements/00group-input/dees-input-fileupload/demo.ts +35 -35
  30. package/ts_web/elements/00group-input/dees-input-iban/dees-input-iban.demo.ts +19 -23
  31. package/ts_web/elements/00group-input/dees-input-list/dees-input-list.demo.ts +21 -19
  32. package/ts_web/elements/00group-input/dees-input-multitoggle/dees-input-multitoggle.demo.ts +66 -64
  33. package/ts_web/elements/00group-input/dees-input-phone/dees-input-phone.demo.ts +19 -23
  34. package/ts_web/elements/00group-input/dees-input-quantityselector/dees-input-quantityselector.demo.ts +4 -10
  35. package/ts_web/elements/00group-input/dees-input-radiogroup/dees-input-radiogroup.demo.ts +53 -53
  36. package/ts_web/elements/00group-input/dees-input-tags/dees-input-tags.demo.ts +20 -18
  37. package/ts_web/elements/00group-input/dees-input-text/dees-input-text.demo.ts +36 -40
  38. package/ts_web/elements/00group-input/dees-input-toggle/dees-input-toggle.demo.ts +34 -32
  39. package/ts_web/elements/00group-input/dees-input-typelist/dees-input-typelist.demo.ts +18 -24
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@design.estate/dees-catalog",
3
- "version": "3.76.0",
3
+ "version": "3.77.0",
4
4
  "private": false,
5
5
  "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
6
6
  "main": "dist_ts_web/index.js",
package/readme.md CHANGED
@@ -59,8 +59,8 @@ For developers working on this library, please refer to the [UI Components Playb
59
59
  | **Forms** | [`DeesForm`](#deesform), [`DeesInputText`](#deesinputtext), [`DeesInputCheckbox`](#deesinputcheckbox), [`DeesInputDropdown`](#deesinputdropdown), [`DeesInputRadiogroup`](#deesinputradiogroup), [`DeesInputFileupload`](#deesinputfileupload), [`DeesInputIban`](#deesinputiban), [`DeesInputPhone`](#deesinputphone), [`DeesInputQuantitySelector`](#deesinputquantityselector), [`DeesInputMultitoggle`](#deesinputmultitoggle), [`DeesInputToggle`](#deesinputtoggle), [`DeesInputTags`](#deesinputtags), [`DeesInputTypelist`](#deesinputtypelist), [`DeesInputList`](#deesinputlist), [`DeesInputProfilepicture`](#deesinputprofilepicture), [`DeesInputRichtext`](#deesinputrichtext), [`DeesInputWysiwyg`](#deesinputwysiwyg), [`DeesInputDatepicker`](#deesinputdatepicker), [`DeesInputSearchselect`](#deesinputsearchselect), [`DeesInputCode`](#deesinputcode), [`DeesFormSubmit`](#deesformsubmit) |
60
60
  | **App Shell (Layout)** | [`DeesAppui`](#deesappui-️), [`DeesAppuiMainmenu`](#deesappuimainmenu), [`DeesAppuiSecondarymenu`](#deesappuisecondarymenu), [`DeesAppuiMaincontent`](#deesappuimaincontent), [`DeesAppuiAppbar`](#deesappuiappbar), [`DeesAppuiActivitylog`](#deesappuiactivitylog), [`DeesAppuiBottombar`](#deesappuibottombar), [`DeesAppuiProfiledropdown`](#deesappuiprofiledropdown), [`DeesAppuiTabs`](#deesappuitabs), [`DeesMobileNavigation`](#deesmobilenavigation), [`DeesDashboardGrid`](#deesdashboardgrid) |
61
61
  | **Data Display** | [`DeesTable`](#deestable), [`DeesDataviewCodebox`](#deesdataviewcodebox), [`DeesDataviewStatusobject`](#deesdataviewstatusobject), [`DeesPdf`](#deespdf), [`DeesStatsGrid`](#deesstatsgrid), [`DeesPagination`](#deespagination), [`DeesStorageBrowser`](#deesstorgebrowser) |
62
- | **Media & Tiles** | [`DeesTilePdf`](#deestilepdf), [`DeesTileImage`](#deestileimage), [`DeesTileAudio`](#deestileaudio), [`DeesTileVideo`](#deestilevideo), [`DeesTileNote`](#deestilenote), [`DeesTileFolder`](#deestilefolder), [`DeesPreview`](#deespreview), [`DeesPdfViewer`](#deespdfviewer), [`DeesPdfPreview`](#deespdfpreview), [`DeesImageViewer`](#deesimageviewer), [`DeesAudioViewer`](#deesaudioviewer), [`DeesVideoViewer`](#deesvideoviewer) |
63
- | **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartLog`](#deeschartlog) |
62
+ | **Media & Thumbnails** | [`DeesThumbnailPdf`](#deesthumbnailpdf), [`DeesThumbnailImage`](#deesthumbnailimage), [`DeesThumbnailAudio`](#deesthumbnailaudio), [`DeesThumbnailVideo`](#deesthumbnalvideo), [`DeesThumbnailNote`](#deesthumbnailnote), [`DeesThumbnailFolder`](#deesthumbnailfolder), [`DeesPreview`](#deespreview), [`DeesPdfViewer`](#deespdfviewer), [`DeesImageViewer`](#deesimageviewer), [`DeesAudioViewer`](#deesaudioviewer), [`DeesVideoViewer`](#deesvideoviewer) |
63
+ | **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartBar`](#deeschartbar), [`DeesChartDonut`](#deeschartdonut), [`DeesChartGauge`](#deeschartgauge), [`DeesChartRadar`](#deeschartradar), [`DeesChartLog`](#deeschartlog) |
64
64
  | **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) |
65
65
  | **Navigation** | [`DeesStepper`](#deesstepper), [`DeesProgressbar`](#deesprogressbar) |
66
66
  | **Workspace / IDE** | [`DeesWorkspace`](#deesworkspace), [`DeesWorkspaceMonaco`](#deesworkspacemonaco), [`DeesWorkspaceDiffEditor`](#deesworkspacediffeditor), [`DeesWorkspaceFiletree`](#deesworkspacefiletree), [`DeesWorkspaceTerminal`](#deesworkspaceterminal), [`DeesWorkspaceTerminalPreview`](#deesworkspaceterminalpreview), [`DeesWorkspaceMarkdown`](#deesworkspacemarkdown), [`DeesWorkspaceMarkdownoutlet`](#deesworkspacemarkdownoutlet), [`DeesWorkspaceBottombar`](#deesworkspacebottombar) |
@@ -143,14 +143,13 @@ Display icons from FontAwesome and Lucide icon libraries with library prefixes.
143
143
  ```
144
144
 
145
145
  #### `DeesLabel`
146
- Text label component with optional icon and status indicators.
146
+ Text label component with optional required indicator and info tooltip. Used internally by all input components.
147
147
 
148
148
  ```typescript
149
149
  <dees-label
150
- text="Status" // Label text
151
- icon="info-circle" // Optional: icon name
152
- type="info" // Options: default, info, success, warning, error
153
- size="medium" // Options: small, medium, large
150
+ .label=${'Email Address'} // Label text
151
+ .required=${true} // Optional: shows red asterisk
152
+ .infoText=${'We will never share your email'} // Optional: shows hover info icon with tooltip
154
153
  ></dees-label>
155
154
  ```
156
155
 
@@ -321,7 +320,7 @@ Container component for form elements with built-in validation and data handling
321
320
  ```
322
321
 
323
322
  #### `DeesInputText`
324
- Text input field with validation and formatting options.
323
+ Text input field with validation, info tooltips, description text, and context menu (Cut/Copy/Paste/Select All).
325
324
 
326
325
  ```typescript
327
326
  <dees-input-text
@@ -330,10 +329,20 @@ Text input field with validation and formatting options.
330
329
  value="initial@value.com" // Initial value
331
330
  required // Makes the field required
332
331
  disabled // Disables the input
333
- placeholder="Enter your email"
332
+ .infoText=${'Hover icon tooltip text'} // Shows ⓘ icon on label with hover tooltip
333
+ .description=${'Permanent help text below the input'} // Small text below the input
334
+ .validationFunction=${(value) => { // Auto-validates on every keystroke
335
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
336
+ if (emailRegex.test(value)) {
337
+ return { valid: true, message: 'Email is valid' };
338
+ }
339
+ return { valid: false, message: 'Please enter a valid email' };
340
+ }}
334
341
  ></dees-input-text>
335
342
  ```
336
343
 
344
+ > 💡 **All input components** share these common properties from `DeesInputBase`: `key`, `label`, `required`, `disabled`, `infoText`, `description`, `layoutMode`, `labelPosition`.
345
+
337
346
  #### `DeesInputCheckbox`
338
347
  Checkbox input component for boolean values.
339
348
 
@@ -1780,7 +1789,7 @@ interface ITileFolderItem {
1780
1789
 
1781
1790
  ## License and Legal Information
1782
1791
 
1783
- This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./license) file.
1792
+ This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file.
1784
1793
 
1785
1794
  **Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
1786
1795
 
@@ -1798,5 +1807,3 @@ Registered at District Court Bremen HRB 35230 HB, Germany
1798
1807
  For any legal inquiries or further information, please contact us via email at hello@task.vc.
1799
1808
 
1800
1809
  By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
1801
-
1802
- By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '3.76.0',
6
+ version: '3.77.0',
7
7
  description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
8
8
  }
@@ -695,6 +695,7 @@ export class DeesTable<T> extends DeesElement {
695
695
  this.__editingCell?.rowId === rowId &&
696
696
  this.__editingCell?.colKey === editKey;
697
697
  const isFlashing = !!flashSet?.has(editKey);
698
+ const useFlashBorder = isFlashing && !!col.flashBorder;
698
699
  const cellClasses = [
699
700
  isEditable ? 'editable' : '',
700
701
  isFocused && !isEditing ? 'focused' : '',
@@ -702,8 +703,13 @@ export class DeesTable<T> extends DeesElement {
702
703
  ]
703
704
  .filter(Boolean)
704
705
  .join(' ');
706
+ const flashClass = isFlashing
707
+ ? useFlashBorder
708
+ ? 'innerCellContainer flashing-border'
709
+ : 'innerCellContainer flashing'
710
+ : 'innerCellContainer';
705
711
  const innerHtml = html`<div
706
- class=${isFlashing ? 'innerCellContainer flashing' : 'innerCellContainer'}
712
+ class=${flashClass}
707
713
  >
708
714
  ${isEditing ? this.renderCellEditor(itemArg, col) : content}
709
715
  </div>`;
@@ -1362,6 +1368,7 @@ export class DeesTable<T> extends DeesElement {
1362
1368
 
1363
1369
  const effectiveColumns = this.__getEffectiveColumns();
1364
1370
  const visibleCols = effectiveColumns.filter((c) => !c.hidden);
1371
+ const colByKey = new Map<string, Column<T>>(visibleCols.map((c) => [String(c.key), c]));
1365
1372
  const nextSnapshot = new Map<string, Map<string, unknown>>();
1366
1373
  const newlyFlashing = new Map<string, Set<string>>();
1367
1374
 
@@ -1376,7 +1383,26 @@ export class DeesTable<T> extends DeesElement {
1376
1383
  const prevCells = this.__prevSnapshot?.get(rowId);
1377
1384
  if (!prevCells) continue; // new row — not an "update"
1378
1385
  for (const [colKey, nextVal] of cellMap) {
1379
- if (prevCells.get(colKey) !== nextVal) {
1386
+ const prevVal = prevCells.get(colKey);
1387
+
1388
+ // Look up the column definition for flash options.
1389
+ const colDef = colByKey.get(colKey);
1390
+
1391
+ // Determine whether the cell changed.
1392
+ let changed: boolean;
1393
+ if (colDef?.flashCompare) {
1394
+ // Explicit custom comparator — caller decides.
1395
+ changed = colDef.flashCompare(prevVal, nextVal);
1396
+ } else if (nextVal !== null && nextVal !== undefined && typeof nextVal === 'object') {
1397
+ // Non-primitive (TemplateResult, object, array, etc.) — skip by
1398
+ // default. Custom renderings don't benefit from the text-color
1399
+ // flash and reference inequality causes false positives.
1400
+ changed = false;
1401
+ } else {
1402
+ changed = prevVal !== nextVal;
1403
+ }
1404
+
1405
+ if (changed) {
1380
1406
  // Don't flash the cell the user is actively editing.
1381
1407
  if (
1382
1408
  this.__editingCell &&
@@ -404,11 +404,44 @@ export const tableStyles: CSSResult[] = [
404
404
  100% { color: var(--dees-color-text-primary); }
405
405
  }
406
406
 
407
+ /* Border/background flash variant for cells with styled content
408
+ (badges, icons, custom components) where a text-color animation
409
+ would be invisible. Activated via flashBorder on Column. */
410
+ .innerCellContainer.flashing-border {
411
+ animation: dees-table-cell-flash-border
412
+ var(--dees-table-flash-duration, 900ms)
413
+ var(--dees-table-flash-easing);
414
+ border-radius: 3px;
415
+ }
416
+
417
+ @keyframes dees-table-cell-flash-border {
418
+ 0%,
419
+ 35% {
420
+ box-shadow: inset 0 0 0 1.5px var(--dees-table-flash-color);
421
+ background: ${cssManager.bdTheme(
422
+ 'hsl(45 93% 62% / 0.10)',
423
+ 'hsl(45 93% 62% / 0.08)'
424
+ )};
425
+ }
426
+ 100% {
427
+ box-shadow: inset 0 0 0 1.5px transparent;
428
+ background: transparent;
429
+ }
430
+ }
431
+
407
432
  @media (prefers-reduced-motion: reduce) {
408
433
  .innerCellContainer.flashing {
409
434
  animation: none;
410
435
  color: var(--dees-table-flash-color);
411
436
  }
437
+ .innerCellContainer.flashing-border {
438
+ animation: none;
439
+ box-shadow: inset 0 0 0 1.5px var(--dees-table-flash-color);
440
+ background: ${cssManager.bdTheme(
441
+ 'hsl(45 93% 62% / 0.10)',
442
+ 'hsl(45 93% 62% / 0.08)'
443
+ )};
444
+ }
412
445
  }
413
446
 
414
447
  /* Dev-time warning banner shown when highlight-updates="flash" but
@@ -65,6 +65,25 @@ export interface Column<T = any> {
65
65
  parse?: (editorValue: any, row: T) => any;
66
66
  /** Validate the parsed value before commit. Return string for error, true/void for ok. */
67
67
  validate?: (value: any, row: T) => true | string | void;
68
+
69
+ // ─── Flash highlight options ───
70
+
71
+ /**
72
+ * Custom comparison for flash-on-update diffing.
73
+ * Return `true` if the cell should flash (i.e. the values differ).
74
+ * When absent, non-primitive cell values are skipped entirely
75
+ * (only strings, numbers, booleans, null, and undefined are diffed).
76
+ */
77
+ flashCompare?: (prevVal: any, nextVal: any) => boolean;
78
+
79
+ /**
80
+ * When `true`, flash this cell with a border/background pulse instead of
81
+ * the default text-color animation. Useful for cells containing styled
82
+ * badges, icons, or custom web-component renderings where a text-color
83
+ * change would be invisible.
84
+ * @default false
85
+ */
86
+ flashBorder?: boolean;
68
87
  }
69
88
 
70
89
  /**
@@ -111,90 +111,92 @@ export const demoFunc = () => html`
111
111
 
112
112
  <div class="demo-container">
113
113
  <dees-panel .title=${'Basic Checkboxes'} .subtitle=${'Simple checkbox examples with various labels'}>
114
- <div class="checkbox-group">
115
- <dees-input-checkbox
116
- .label=${'I agree to the Terms and Conditions'}
114
+ <dees-form>
115
+ <dees-input-checkbox
116
+ .label=${'I agree to the Terms and Conditions'}
117
117
  .value=${true}
118
118
  .key=${'terms'}
119
119
  ></dees-input-checkbox>
120
-
121
- <dees-input-checkbox
122
- .label=${'Subscribe to newsletter'}
120
+
121
+ <dees-input-checkbox
122
+ .label=${'Subscribe to newsletter'}
123
123
  .value=${false}
124
124
  .key=${'newsletter'}
125
125
  ></dees-input-checkbox>
126
-
127
- <dees-input-checkbox
128
- .label=${'Enable notifications'}
126
+
127
+ <dees-input-checkbox
128
+ .label=${'Enable notifications'}
129
129
  .value=${false}
130
130
  .description=${'Receive email updates about your account'}
131
131
  .key=${'notifications'}
132
132
  ></dees-input-checkbox>
133
- </div>
133
+ </dees-form>
134
134
  </dees-panel>
135
135
 
136
136
  <dees-panel .title=${'Checkbox States'} .subtitle=${'Different checkbox states and configurations'}>
137
- <div class="checkbox-group">
138
- <dees-input-checkbox
139
- .label=${'Default state'}
137
+ <dees-form>
138
+ <dees-input-checkbox
139
+ .label=${'Default state'}
140
140
  .value=${false}
141
141
  ></dees-input-checkbox>
142
-
143
- <dees-input-checkbox
144
- .label=${'Checked state'}
142
+
143
+ <dees-input-checkbox
144
+ .label=${'Checked state'}
145
145
  .value=${true}
146
146
  ></dees-input-checkbox>
147
-
148
- <dees-input-checkbox
149
- .label=${'Disabled unchecked'}
147
+
148
+ <dees-input-checkbox
149
+ .label=${'Disabled unchecked'}
150
150
  .value=${false}
151
151
  .disabled=${true}
152
152
  ></dees-input-checkbox>
153
-
154
- <dees-input-checkbox
155
- .label=${'Disabled checked'}
153
+
154
+ <dees-input-checkbox
155
+ .label=${'Disabled checked'}
156
156
  .value=${true}
157
157
  .disabled=${true}
158
158
  ></dees-input-checkbox>
159
-
160
- <dees-input-checkbox
161
- .label=${'Required checkbox'}
159
+
160
+ <dees-input-checkbox
161
+ .label=${'Required checkbox'}
162
162
  .required=${true}
163
163
  .key=${'required'}
164
164
  ></dees-input-checkbox>
165
- </div>
165
+ </dees-form>
166
166
  </dees-panel>
167
167
 
168
168
  <dees-panel .title=${'Horizontal Layout'} .subtitle=${'Checkboxes arranged horizontally for compact forms'}>
169
- <div class="horizontal-checkboxes">
170
- <dees-input-checkbox
171
- .label=${'Option A'}
172
- .value=${false}
173
- .layoutMode=${'horizontal'}
174
- .key=${'optionA'}
175
- ></dees-input-checkbox>
176
-
177
- <dees-input-checkbox
178
- .label=${'Option B'}
179
- .value=${true}
180
- .layoutMode=${'horizontal'}
181
- .key=${'optionB'}
182
- ></dees-input-checkbox>
183
-
184
- <dees-input-checkbox
185
- .label=${'Option C'}
186
- .value=${false}
187
- .layoutMode=${'horizontal'}
188
- .key=${'optionC'}
189
- ></dees-input-checkbox>
190
-
191
- <dees-input-checkbox
192
- .label=${'Option D'}
193
- .value=${true}
194
- .layoutMode=${'horizontal'}
195
- .key=${'optionD'}
196
- ></dees-input-checkbox>
197
- </div>
169
+ <dees-form>
170
+ <div class="horizontal-checkboxes">
171
+ <dees-input-checkbox
172
+ .label=${'Option A'}
173
+ .value=${false}
174
+ .layoutMode=${'horizontal'}
175
+ .key=${'optionA'}
176
+ ></dees-input-checkbox>
177
+
178
+ <dees-input-checkbox
179
+ .label=${'Option B'}
180
+ .value=${true}
181
+ .layoutMode=${'horizontal'}
182
+ .key=${'optionB'}
183
+ ></dees-input-checkbox>
184
+
185
+ <dees-input-checkbox
186
+ .label=${'Option C'}
187
+ .value=${false}
188
+ .layoutMode=${'horizontal'}
189
+ .key=${'optionC'}
190
+ ></dees-input-checkbox>
191
+
192
+ <dees-input-checkbox
193
+ .label=${'Option D'}
194
+ .value=${true}
195
+ .layoutMode=${'horizontal'}
196
+ .key=${'optionD'}
197
+ ></dees-input-checkbox>
198
+ </div>
199
+ </dees-form>
198
200
  </dees-panel>
199
201
 
200
202
  <dees-panel .title=${'Feature Selection Example'} .subtitle=${'Common use case for feature toggles with batch operations'}>
@@ -204,76 +206,76 @@ export const demoFunc = () => html`
204
206
  </div>
205
207
 
206
208
  <div class="feature-list">
207
- <div class="checkbox-group">
208
- <dees-input-checkbox
209
- .label=${'Dark Mode Support'}
209
+ <dees-form>
210
+ <dees-input-checkbox
211
+ .label=${'Dark Mode Support'}
210
212
  .value=${true}
211
213
  .key=${'feature1'}
212
214
  ></dees-input-checkbox>
213
-
214
- <dees-input-checkbox
215
- .label=${'Email Notifications'}
215
+
216
+ <dees-input-checkbox
217
+ .label=${'Email Notifications'}
216
218
  .value=${true}
217
219
  .key=${'feature2'}
218
220
  ></dees-input-checkbox>
219
-
220
- <dees-input-checkbox
221
- .label=${'Two-Factor Authentication'}
221
+
222
+ <dees-input-checkbox
223
+ .label=${'Two-Factor Authentication'}
222
224
  .value=${false}
223
225
  .key=${'feature3'}
224
226
  ></dees-input-checkbox>
225
-
226
- <dees-input-checkbox
227
- .label=${'API Access'}
227
+
228
+ <dees-input-checkbox
229
+ .label=${'API Access'}
228
230
  .value=${true}
229
231
  .key=${'feature4'}
230
232
  ></dees-input-checkbox>
231
-
232
- <dees-input-checkbox
233
- .label=${'Advanced Analytics'}
233
+
234
+ <dees-input-checkbox
235
+ .label=${'Advanced Analytics'}
234
236
  .value=${false}
235
237
  .key=${'feature5'}
236
238
  ></dees-input-checkbox>
237
- </div>
239
+ </dees-form>
238
240
  </div>
239
241
  </dees-panel>
240
242
 
241
243
  <dees-panel .title=${'Privacy Settings Example'} .subtitle=${'Checkboxes in a typical form context'}>
242
244
  <div class="form-section">
243
245
  <h4 class="section-title">Privacy Preferences</h4>
244
-
245
- <div class="checkbox-group">
246
- <dees-input-checkbox
247
- .label=${'Share analytics data'}
246
+
247
+ <dees-form>
248
+ <dees-input-checkbox
249
+ .label=${'Share analytics data'}
248
250
  .value=${true}
249
251
  .description=${'Help us improve by sharing anonymous usage data'}
250
252
  ></dees-input-checkbox>
251
-
252
- <dees-input-checkbox
253
- .label=${'Personalized recommendations'}
253
+
254
+ <dees-input-checkbox
255
+ .label=${'Personalized recommendations'}
254
256
  .value=${true}
255
257
  .description=${'Get suggestions based on your activity'}
256
258
  ></dees-input-checkbox>
257
-
258
- <dees-input-checkbox
259
- .label=${'Marketing communications'}
259
+
260
+ <dees-input-checkbox
261
+ .label=${'Marketing communications'}
260
262
  .value=${false}
261
263
  .description=${'Receive promotional emails and special offers'}
262
264
  ></dees-input-checkbox>
263
-
264
- <dees-input-checkbox
265
- .label=${'Third-party integrations'}
265
+
266
+ <dees-input-checkbox
267
+ .label=${'Third-party integrations'}
266
268
  .value=${false}
267
269
  .description=${'Allow approved partners to access your data'}
268
270
  ></dees-input-checkbox>
269
- </div>
271
+ </dees-form>
270
272
  </div>
271
273
  </dees-panel>
272
274
 
273
275
  <dees-panel .title=${'Interactive Example'} .subtitle=${'Click checkboxes to see value changes'}>
274
- <div class="checkbox-group">
275
- <dees-input-checkbox
276
- .label=${'Feature toggle'}
276
+ <dees-form>
277
+ <dees-input-checkbox
278
+ .label=${'Feature toggle'}
277
279
  .value=${false}
278
280
  @changeSubject=${(event: CustomEvent) => {
279
281
  const output = document.querySelector('#checkbox-output');
@@ -283,9 +285,9 @@ export const demoFunc = () => html`
283
285
  }
284
286
  }}
285
287
  ></dees-input-checkbox>
286
-
287
- <dees-input-checkbox
288
- .label=${'Debug mode'}
288
+
289
+ <dees-input-checkbox
290
+ .label=${'Debug mode'}
289
291
  .value=${false}
290
292
  @changeSubject=${(event: CustomEvent) => {
291
293
  const output = document.querySelector('#debug-output');
@@ -295,8 +297,8 @@ export const demoFunc = () => html`
295
297
  }
296
298
  }}
297
299
  ></dees-input-checkbox>
298
- </div>
299
-
300
+ </dees-form>
301
+
300
302
  <div class="interactive-section">
301
303
  <div id="checkbox-output" class="output-text">Feature is disabled</div>
302
304
  <div id="debug-output" class="output-text" style="margin-top: 8px;">Debug mode: OFF</div>
@@ -31,12 +31,6 @@ export const demoFunc = () => html`
31
31
  flex-wrap: wrap;
32
32
  }
33
33
 
34
- .input-group {
35
- display: flex;
36
- flex-direction: column;
37
- gap: 16px;
38
- }
39
-
40
34
  .spacer {
41
35
  height: 200px;
42
36
  display: flex;
@@ -69,7 +63,7 @@ export const demoFunc = () => html`
69
63
  }
70
64
  }}>
71
65
  <dees-panel .title=${'1. Basic Dropdowns'} .subtitle=${'Standard dropdown with search functionality and various options'}>
72
- <div class="input-group">
66
+ <dees-form>
73
67
  <dees-input-dropdown
74
68
  .label=${'Select Country'}
75
69
  .description=${'Choose the country where your business is registered'}
@@ -95,7 +89,7 @@ export const demoFunc = () => html`
95
89
  { option: 'Guest', key: 'guest' }
96
90
  ]}
97
91
  ></dees-input-dropdown>
98
- </div>
92
+ </dees-form>
99
93
  </dees-panel>
100
94
  </dees-demowrapper>
101
95
 
@@ -136,40 +130,42 @@ export const demoFunc = () => html`
136
130
  });
137
131
  }}>
138
132
  <dees-panel .title=${'3. Horizontal Layout'} .subtitle=${'Multiple dropdowns in a horizontal layout for compact forms'}>
139
- <div class="horizontal-group">
140
- <dees-input-dropdown
141
- .label=${'Department'}
142
- .layoutMode=${'horizontal'}
143
- .options=${[
144
- { option: 'Engineering', key: 'eng' },
145
- { option: 'Design', key: 'design' },
146
- { option: 'Marketing', key: 'marketing' },
147
- { option: 'Sales', key: 'sales' }
148
- ]}
149
- ></dees-input-dropdown>
150
-
151
- <dees-input-dropdown
152
- .label=${'Team Size'}
153
- .layoutMode=${'horizontal'}
154
- .enableSearch=${false}
155
- .options=${[
156
- { option: '1-5', key: 'small' },
157
- { option: '6-20', key: 'medium' },
158
- { option: '21-50', key: 'large' },
159
- { option: '50+', key: 'xlarge' }
160
- ]}
161
- ></dees-input-dropdown>
162
-
163
- <dees-input-dropdown
164
- .label=${'Location'}
165
- .layoutMode=${'horizontal'}
166
- .options=${[
167
- { option: 'Remote', key: 'remote' },
168
- { option: 'On-site', key: 'onsite' },
169
- { option: 'Hybrid', key: 'hybrid' }
170
- ]}
171
- ></dees-input-dropdown>
172
- </div>
133
+ <dees-form>
134
+ <div class="horizontal-group">
135
+ <dees-input-dropdown
136
+ .label=${'Department'}
137
+ .layoutMode=${'horizontal'}
138
+ .options=${[
139
+ { option: 'Engineering', key: 'eng' },
140
+ { option: 'Design', key: 'design' },
141
+ { option: 'Marketing', key: 'marketing' },
142
+ { option: 'Sales', key: 'sales' }
143
+ ]}
144
+ ></dees-input-dropdown>
145
+
146
+ <dees-input-dropdown
147
+ .label=${'Team Size'}
148
+ .layoutMode=${'horizontal'}
149
+ .enableSearch=${false}
150
+ .options=${[
151
+ { option: '1-5', key: 'small' },
152
+ { option: '6-20', key: 'medium' },
153
+ { option: '21-50', key: 'large' },
154
+ { option: '50+', key: 'xlarge' }
155
+ ]}
156
+ ></dees-input-dropdown>
157
+
158
+ <dees-input-dropdown
159
+ .label=${'Location'}
160
+ .layoutMode=${'horizontal'}
161
+ .options=${[
162
+ { option: 'Remote', key: 'remote' },
163
+ { option: 'On-site', key: 'onsite' },
164
+ { option: 'Hybrid', key: 'hybrid' }
165
+ ]}
166
+ ></dees-input-dropdown>
167
+ </div>
168
+ </dees-form>
173
169
  </dees-panel>
174
170
  </dees-demowrapper>
175
171
 
@@ -185,7 +181,7 @@ export const demoFunc = () => html`
185
181
  }
186
182
  }}>
187
183
  <dees-panel .title=${'4. States'} .subtitle=${'Different states and configurations'}>
188
- <div class="input-group">
184
+ <dees-form>
189
185
  <dees-input-dropdown
190
186
  .label=${'Required Field'}
191
187
  .required=${true}
@@ -204,7 +200,7 @@ export const demoFunc = () => html`
204
200
  ]}
205
201
  .selectedOption=${{ option: 'Cannot Select', key: 'disabled' }}
206
202
  ></dees-input-dropdown>
207
- </div>
203
+ </dees-form>
208
204
  </dees-panel>
209
205
  </dees-demowrapper>
210
206