mithril-materialized 3.5.10 → 3.7.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.
@@ -0,0 +1,57 @@
1
+ import { FactoryComponent } from 'mithril';
2
+ /**
3
+ * Attributes for the AnalogClock component
4
+ */
5
+ export interface AnalogClockAttrs {
6
+ /** Current hours value (1-12 for 12-hour, 0-23 for 24-hour) */
7
+ hours: number;
8
+ /** Current minutes value (0-59) */
9
+ minutes: number;
10
+ /** Current AM/PM value (only relevant in 12-hour mode) */
11
+ amOrPm: 'AM' | 'PM';
12
+ /** Current view mode: 'hours' or 'minutes' */
13
+ currentView: 'hours' | 'minutes';
14
+ /** Whether to use 12-hour format (true) or 24-hour format (false) */
15
+ twelveHour: boolean;
16
+ /** Radius of the clock dial (default: 135) */
17
+ dialRadius?: number;
18
+ /** Radius of outer clock ticks (default: 105) */
19
+ outerRadius?: number;
20
+ /** Radius of inner clock ticks for 24-hour mode (default: 70) */
21
+ innerRadius?: number;
22
+ /** Radius of tick circles (default: 20) */
23
+ tickRadius?: number;
24
+ /** Round minutes to nearest 5 when dragging (default: false) */
25
+ roundBy5?: boolean;
26
+ /** Enable haptic feedback vibration (default: true) */
27
+ vibrate?: boolean;
28
+ /** Callback when time changes */
29
+ onTimeChange: (hours: number, minutes: number) => void;
30
+ /** Callback when view changes (optional) */
31
+ onViewChange?: (view: 'hours' | 'minutes') => void;
32
+ /** Optional reference to external hours display element for updates */
33
+ spanHours?: HTMLElement;
34
+ /** Optional reference to external minutes display element for updates */
35
+ spanMinutes?: HTMLElement;
36
+ }
37
+ /**
38
+ * AnalogClock component - A draggable analog clock face for time selection
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * m(AnalogClock, {
43
+ * hours: 10,
44
+ * minutes: 30,
45
+ * amOrPm: 'AM',
46
+ * currentView: 'hours',
47
+ * twelveHour: true,
48
+ * onTimeChange: (hours, minutes) => {
49
+ * console.log(`Time changed to ${hours}:${minutes}`);
50
+ * },
51
+ * onViewChange: (view) => {
52
+ * console.log(`View changed to ${view}`);
53
+ * }
54
+ * })
55
+ * ```
56
+ */
57
+ export declare const AnalogClock: FactoryComponent<AnalogClockAttrs>;
@@ -1313,7 +1313,6 @@ body.keyboard-focused .dropdown-content li:focus {
1313
1313
  .collapsible-header .collapsible-header-text,
1314
1314
  .collapsible-header .collapsible-header-content {
1315
1315
  flex: 1;
1316
- display: flex;
1317
1316
  align-items: center;
1318
1317
  gap: 1rem;
1319
1318
  }
package/dist/core.css CHANGED
@@ -3168,6 +3168,10 @@ body.keyboard-focused .select-dropdown.dropdown-content li:focus {
3168
3168
  background-color: var(--mm-dropdown-focus, rgba(0, 0, 0, 0.08));
3169
3169
  }
3170
3170
 
3171
+ .select-dropdown.dropdown-content {
3172
+ max-height: 400px;
3173
+ overflow-y: auto;
3174
+ }
3171
3175
  .select-dropdown.dropdown-content li:hover {
3172
3176
  background-color: var(--mm-dropdown-hover, rgba(0, 0, 0, 0.08));
3173
3177
  }
@@ -0,0 +1,48 @@
1
+ import { FactoryComponent } from 'mithril';
2
+ /**
3
+ * Attributes for the DigitalClock component
4
+ */
5
+ export interface DigitalClockAttrs {
6
+ /** Current hours value (1-12 for 12-hour, 0-23 for 24-hour) */
7
+ hours: number;
8
+ /** Current minutes value (0-59) */
9
+ minutes: number;
10
+ /** Current AM/PM value (only relevant in 12-hour mode) */
11
+ amOrPm: 'AM' | 'PM';
12
+ /** Whether to use 12-hour format (true) or 24-hour format (false) */
13
+ twelveHour: boolean;
14
+ /** Step between minute options (default: 5) */
15
+ minuteStep?: number;
16
+ /** Step between hour options (default: 1) */
17
+ hourStep?: number;
18
+ /** Minimum allowed time in format "HH:MM" or "HH:MM AM/PM" */
19
+ minTime?: string;
20
+ /** Maximum allowed time in format "HH:MM" or "HH:MM AM/PM" */
21
+ maxTime?: string;
22
+ /** Callback when time changes */
23
+ onTimeChange: (hours: number, minutes: number, amOrPm: 'AM' | 'PM') => void;
24
+ /** Optional reference to external hours display element for updates */
25
+ spanHours?: HTMLElement;
26
+ /** Optional reference to external minutes display element for updates */
27
+ spanMinutes?: HTMLElement;
28
+ /** Optional reference to external AM/PM display element for updates */
29
+ spanAmPm?: HTMLElement;
30
+ }
31
+ /**
32
+ * DigitalClock component - A scrollable digital time picker
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * m(DigitalClock, {
37
+ * hours: 10,
38
+ * minutes: 30,
39
+ * amOrPm: 'AM',
40
+ * twelveHour: true,
41
+ * minuteStep: 5,
42
+ * onTimeChange: (hours, minutes, amOrPm) => {
43
+ * console.log(`Time changed to ${hours}:${minutes} ${amOrPm}`);
44
+ * }
45
+ * })
46
+ * ```
47
+ */
48
+ export declare const DigitalClock: FactoryComponent<DigitalClockAttrs>;
@@ -43,6 +43,8 @@ export interface DropdownAttrs<T extends string | number> extends Attributes {
43
43
  iconName?: string;
44
44
  /** Add a description underneath the input field. */
45
45
  helperText?: string;
46
+ /** Max height of the dropdown menu, default '400px', use 'none' to disable it */
47
+ maxHeight?: string;
46
48
  }
47
49
  /** Pure TypeScript Dropdown component - no Materialize dependencies */
48
50
  export declare const Dropdown: <T extends string | number>() => Component<DropdownAttrs<T>>;
package/dist/forms.css CHANGED
@@ -1413,6 +1413,10 @@ body.keyboard-focused .select-dropdown.dropdown-content li:focus {
1413
1413
  background-color: var(--mm-dropdown-focus, rgba(0, 0, 0, 0.08));
1414
1414
  }
1415
1415
 
1416
+ .select-dropdown.dropdown-content {
1417
+ max-height: 400px;
1418
+ overflow-y: auto;
1419
+ }
1416
1420
  .select-dropdown.dropdown-content li:hover {
1417
1421
  background-color: var(--mm-dropdown-hover, rgba(0, 0, 0, 0.08));
1418
1422
  }
package/dist/index.css CHANGED
@@ -5580,7 +5580,6 @@ body.keyboard-focused .dropdown-content li:focus {
5580
5580
  .collapsible-header .collapsible-header-text,
5581
5581
  .collapsible-header .collapsible-header-content {
5582
5582
  flex: 1;
5583
- display: flex;
5584
5583
  align-items: center;
5585
5584
  gap: 1rem;
5586
5585
  }
@@ -6914,6 +6913,10 @@ body.keyboard-focused .select-dropdown.dropdown-content li:focus {
6914
6913
  background-color: var(--mm-dropdown-focus, rgba(0, 0, 0, 0.08));
6915
6914
  }
6916
6915
 
6916
+ .select-dropdown.dropdown-content {
6917
+ max-height: 400px;
6918
+ overflow-y: auto;
6919
+ }
6917
6920
  .select-dropdown.dropdown-content li:hover {
6918
6921
  background-color: var(--mm-dropdown-hover, rgba(0, 0, 0, 0.08));
6919
6922
  }
@@ -9093,12 +9096,14 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9093
9096
  .timepicker-modal {
9094
9097
  max-width: 325px;
9095
9098
  max-height: none;
9099
+ overflow: hidden;
9096
9100
  }
9097
9101
 
9098
9102
  .timepicker-container.modal-content {
9099
9103
  display: flex;
9100
9104
  flex-direction: column;
9101
9105
  padding: 0;
9106
+ overflow: hidden;
9102
9107
  }
9103
9108
 
9104
9109
  .text-primary {
@@ -9186,6 +9191,10 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9186
9191
  bottom: 0;
9187
9192
  }
9188
9193
 
9194
+ .timepicker-dial {
9195
+ pointer-events: none;
9196
+ }
9197
+
9189
9198
  .timepicker-minutes {
9190
9199
  visibility: hidden;
9191
9200
  }
@@ -9200,6 +9209,7 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9200
9209
  position: absolute;
9201
9210
  cursor: pointer;
9202
9211
  font-size: 15px;
9212
+ pointer-events: none;
9203
9213
  }
9204
9214
 
9205
9215
  .timepicker-tick.active,
@@ -9265,6 +9275,171 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9265
9275
  padding: 0 20px;
9266
9276
  }
9267
9277
 
9278
+ /* Digital Clock Mode */
9279
+ .timepicker-digital-mode {
9280
+ padding: 20px;
9281
+ display: flex;
9282
+ flex-direction: column;
9283
+ align-items: center;
9284
+ flex: 2.5 auto;
9285
+ overflow: hidden;
9286
+ }
9287
+
9288
+ .timepicker-digital-clock {
9289
+ display: flex;
9290
+ align-items: center;
9291
+ gap: 8px;
9292
+ margin-bottom: 20px;
9293
+ -webkit-user-select: none;
9294
+ -moz-user-select: none;
9295
+ user-select: none;
9296
+ overflow: hidden;
9297
+ }
9298
+
9299
+ .digital-clock-column {
9300
+ width: 80px;
9301
+ height: 240px;
9302
+ overflow-y: scroll;
9303
+ overflow-x: hidden;
9304
+ scroll-snap-type: y mandatory;
9305
+ scrollbar-width: thin;
9306
+ scrollbar-color: transparent transparent;
9307
+ position: relative;
9308
+ }
9309
+ .digital-clock-column::-webkit-scrollbar {
9310
+ width: 6px;
9311
+ }
9312
+ .digital-clock-column::-webkit-scrollbar-track {
9313
+ background: transparent;
9314
+ }
9315
+ .digital-clock-column::-webkit-scrollbar-thumb {
9316
+ background: transparent;
9317
+ border-radius: 3px;
9318
+ }
9319
+ .digital-clock-column:hover {
9320
+ scrollbar-color: rgba(0, 0, 0, 0.3) transparent;
9321
+ }
9322
+ .digital-clock-column:hover::-webkit-scrollbar-thumb {
9323
+ background: rgba(0, 0, 0, 0.3);
9324
+ }
9325
+ .digital-clock-column:hover::-webkit-scrollbar-thumb:hover {
9326
+ background: rgba(0, 0, 0, 0.5);
9327
+ }
9328
+ .digital-clock-column {
9329
+ background: linear-gradient(to bottom, var(--mm-background-color, #fafafa) 0%, transparent 20%, transparent 80%, var(--mm-background-color, #fafafa) 100%);
9330
+ }
9331
+ .digital-clock-column.ampm-column {
9332
+ width: 60px;
9333
+ scrollbar-width: none;
9334
+ }
9335
+ .digital-clock-column.ampm-column::-webkit-scrollbar {
9336
+ display: none;
9337
+ }
9338
+ .digital-clock-column::before, .digital-clock-column::after {
9339
+ content: "";
9340
+ position: absolute;
9341
+ left: 0;
9342
+ right: 0;
9343
+ height: 1px;
9344
+ pointer-events: none;
9345
+ z-index: 1;
9346
+ background-color: rgba(0, 0, 0, 0.1);
9347
+ }
9348
+ .digital-clock-column::before {
9349
+ top: calc(50% - 24px);
9350
+ }
9351
+ .digital-clock-column::after {
9352
+ top: calc(50% + 24px);
9353
+ }
9354
+
9355
+ .digital-clock-item {
9356
+ height: 48px;
9357
+ display: flex;
9358
+ align-items: center;
9359
+ justify-content: center;
9360
+ font-size: 1.5rem;
9361
+ font-weight: 300;
9362
+ scroll-snap-align: center;
9363
+ cursor: pointer;
9364
+ color: rgba(0, 0, 0, 0.4);
9365
+ transition: all 0.2s ease;
9366
+ }
9367
+ .digital-clock-item:hover:not(.padding):not(.disabled) {
9368
+ background-color: rgba(0, 0, 0, 0.05);
9369
+ }
9370
+ .digital-clock-item.selected {
9371
+ color: var(--mm-primary-color, #26a69a);
9372
+ font-weight: 500;
9373
+ font-size: 2rem;
9374
+ }
9375
+ .digital-clock-item.disabled {
9376
+ color: rgba(0, 0, 0, 0.15);
9377
+ cursor: not-allowed;
9378
+ pointer-events: none;
9379
+ }
9380
+ .digital-clock-item.padding {
9381
+ pointer-events: none;
9382
+ cursor: default;
9383
+ }
9384
+
9385
+ .digital-clock-separator {
9386
+ font-size: 2rem;
9387
+ font-weight: 300;
9388
+ margin: 0 4px;
9389
+ color: rgba(0, 0, 0, 0.6);
9390
+ }
9391
+
9392
+ /* Time Range Picker Styles */
9393
+ .timerange-display-vertical {
9394
+ flex: 1 auto;
9395
+ background-color: #26a69a;
9396
+ padding: 20px;
9397
+ display: flex;
9398
+ flex-direction: column;
9399
+ gap: 20px;
9400
+ min-width: 200px;
9401
+ }
9402
+
9403
+ .timerange-time-section {
9404
+ color: rgba(255, 255, 255, 0.6);
9405
+ }
9406
+ .timerange-time-section.active {
9407
+ color: rgb(255, 255, 255);
9408
+ }
9409
+
9410
+ .timerange-label {
9411
+ font-size: 0.9rem;
9412
+ font-weight: 300;
9413
+ margin-bottom: 8px;
9414
+ opacity: 0.8;
9415
+ }
9416
+
9417
+ .timerange-time {
9418
+ font-size: 3rem;
9419
+ font-weight: 300;
9420
+ letter-spacing: 0.05em;
9421
+ min-width: 200px;
9422
+ display: flex;
9423
+ align-items: baseline;
9424
+ }
9425
+
9426
+ .timerange-hours {
9427
+ display: inline-block;
9428
+ min-width: 2ch;
9429
+ text-align: right;
9430
+ }
9431
+
9432
+ .timerange-minutes {
9433
+ display: inline-block;
9434
+ min-width: 2ch;
9435
+ text-align: left;
9436
+ }
9437
+
9438
+ .timerange-ampm {
9439
+ font-size: 1.5rem;
9440
+ margin-left: 8px;
9441
+ }
9442
+
9268
9443
  /* Media Queries */
9269
9444
  @media only screen and (min-width : 601px) {
9270
9445
  .timepicker-modal {
package/dist/index.d.ts CHANGED
@@ -30,6 +30,11 @@ export * from './switch';
30
30
  export * from './tabs';
31
31
  export * from './search-select';
32
32
  export * from './timepicker';
33
+ export { TimeRangePicker } from './time-range-picker';
34
+ export type { TimeRangePickerAttrs } from './time-range-picker';
35
+ export * from './digital-clock';
36
+ export * from './analog-clock';
37
+ export * from './time-utils';
33
38
  export * from './toast';
34
39
  export * from './tooltip';
35
40
  export * from './utils';