mithril-materialized 3.6.0 → 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>;
@@ -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>;
package/dist/index.css CHANGED
@@ -9096,12 +9096,14 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9096
9096
  .timepicker-modal {
9097
9097
  max-width: 325px;
9098
9098
  max-height: none;
9099
+ overflow: hidden;
9099
9100
  }
9100
9101
 
9101
9102
  .timepicker-container.modal-content {
9102
9103
  display: flex;
9103
9104
  flex-direction: column;
9104
9105
  padding: 0;
9106
+ overflow: hidden;
9105
9107
  }
9106
9108
 
9107
9109
  .text-primary {
@@ -9189,6 +9191,10 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9189
9191
  bottom: 0;
9190
9192
  }
9191
9193
 
9194
+ .timepicker-dial {
9195
+ pointer-events: none;
9196
+ }
9197
+
9192
9198
  .timepicker-minutes {
9193
9199
  visibility: hidden;
9194
9200
  }
@@ -9203,6 +9209,7 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9203
9209
  position: absolute;
9204
9210
  cursor: pointer;
9205
9211
  font-size: 15px;
9212
+ pointer-events: none;
9206
9213
  }
9207
9214
 
9208
9215
  .timepicker-tick.active,
@@ -9268,6 +9275,171 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
9268
9275
  padding: 0 20px;
9269
9276
  }
9270
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
+
9271
9443
  /* Media Queries */
9272
9444
  @media only screen and (min-width : 601px) {
9273
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';