mithril-materialized 3.9.0 → 3.11.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,129 @@
1
+ import { FactoryComponent, Attributes } from 'mithril';
2
+ import { MaterialColor, ColorIntensity } from './types';
3
+ /** Badge positioning anchor origin */
4
+ export interface BadgeAnchorOrigin {
5
+ /** Vertical positioning: 'top' | 'bottom' */
6
+ vertical: 'top' | 'bottom';
7
+ /** Horizontal positioning: 'left' | 'right' */
8
+ horizontal: 'left' | 'right';
9
+ }
10
+ /** Badge display variant */
11
+ export type BadgeVariant = 'standard' | 'dot';
12
+ /** Badge overlap mode affecting positioning offset */
13
+ export type BadgeOverlap = 'rectangular' | 'circular';
14
+ /**
15
+ * Badge component attributes
16
+ *
17
+ * Displays a badge anchored to a child element, commonly used for notifications,
18
+ * counts, or status indicators.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // Standard notification badge
23
+ * m(Badge, { badgeContent: 4 },
24
+ * m('button.btn', 'Notifications')
25
+ * )
26
+ *
27
+ * // Dot variant with custom color
28
+ * m(Badge, {
29
+ * variant: 'dot',
30
+ * color: 'green',
31
+ * anchorOrigin: { vertical: 'bottom', horizontal: 'right' }
32
+ * },
33
+ * m(Icon, { iconName: 'notifications' })
34
+ * )
35
+ *
36
+ * // Badge with max value capping
37
+ * m(Badge, { badgeContent: 150, max: 99 },
38
+ * m('span', 'Inbox')
39
+ * )
40
+ * ```
41
+ */
42
+ export interface BadgeAttrs extends Attributes {
43
+ /**
44
+ * Content to display in badge (number or string)
45
+ * For 'dot' variant, this is ignored
46
+ */
47
+ badgeContent?: string | number;
48
+ /**
49
+ * Maximum value to display - if badgeContent exceeds this, shows "max+"
50
+ * @default undefined (no capping)
51
+ */
52
+ max?: number;
53
+ /**
54
+ * Badge positioning relative to child element
55
+ * @default { vertical: 'top', horizontal: 'right' }
56
+ */
57
+ anchorOrigin?: BadgeAnchorOrigin;
58
+ /**
59
+ * Overlap mode affecting positioning offset
60
+ * - 'rectangular': Badge positioned at corner edge
61
+ * - 'circular': Badge overlaps slightly for circular child elements
62
+ * @default 'rectangular'
63
+ */
64
+ overlap?: BadgeOverlap;
65
+ /**
66
+ * Badge display variant
67
+ * - 'standard': Shows badgeContent
68
+ * - 'dot': Displays minimal dot indicator
69
+ * @default 'standard'
70
+ */
71
+ variant?: BadgeVariant;
72
+ /**
73
+ * Badge background color from MaterialColor palette
74
+ * @default 'red'
75
+ */
76
+ color?: MaterialColor;
77
+ /**
78
+ * Color intensity modifier
79
+ * @example 'lighten-2', 'darken-3'
80
+ */
81
+ colorIntensity?: ColorIntensity;
82
+ /**
83
+ * Force hide badge regardless of badgeContent
84
+ * @default false
85
+ */
86
+ invisible?: boolean;
87
+ /**
88
+ * Show badge even when badgeContent is 0
89
+ * @default false
90
+ */
91
+ showZero?: boolean;
92
+ /**
93
+ * ARIA label for accessibility
94
+ * Automatically generated from badgeContent if not provided
95
+ */
96
+ 'aria-label'?: string;
97
+ /**
98
+ * Additional CSS class for badge element (not wrapper)
99
+ */
100
+ badgeClassName?: string;
101
+ /**
102
+ * Additional CSS class for wrapper element
103
+ */
104
+ className?: string;
105
+ }
106
+ /**
107
+ * Badge component
108
+ *
109
+ * Displays a badge anchored to a child element. Commonly used for notifications,
110
+ * counts, or status indicators. Supports flexible positioning, colors, and variants.
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * // Basic notification badge
115
+ * m(Badge, { badgeContent: 5 },
116
+ * m('button.btn', 'Messages')
117
+ * )
118
+ *
119
+ * // Dot badge on avatar
120
+ * m(Badge, {
121
+ * variant: 'dot',
122
+ * color: 'green',
123
+ * overlap: 'circular'
124
+ * },
125
+ * m('img.circle', { src: 'avatar.jpg' })
126
+ * )
127
+ * ```
128
+ */
129
+ export declare const Badge: FactoryComponent<BadgeAttrs>;
@@ -4529,3 +4529,230 @@ nav .theme-toggle:focus {
4529
4529
  display: none;
4530
4530
  }
4531
4531
  }
4532
+ /* Badge Component
4533
+ ========================================================================== */
4534
+ .badge-wrapper {
4535
+ position: relative;
4536
+ display: inline-flex;
4537
+ vertical-align: middle;
4538
+ flex-shrink: 0;
4539
+ }
4540
+
4541
+ .m-badge {
4542
+ position: absolute;
4543
+ display: flex;
4544
+ align-items: center;
4545
+ justify-content: center;
4546
+ box-sizing: border-box;
4547
+ font-family: Roboto, sans-serif;
4548
+ font-weight: 500;
4549
+ line-height: 1;
4550
+ white-space: nowrap;
4551
+ text-align: center;
4552
+ border-radius: 10px;
4553
+ background-color: #F44336;
4554
+ color: #fff;
4555
+ z-index: 1;
4556
+ transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1);
4557
+ }
4558
+ .m-badge.m-badge--standard {
4559
+ min-width: 20px;
4560
+ height: 20px;
4561
+ padding: 0 6px;
4562
+ font-size: 12px;
4563
+ }
4564
+ .m-badge.m-badge--dot {
4565
+ width: 8px;
4566
+ height: 8px;
4567
+ min-width: 8px;
4568
+ padding: 0;
4569
+ border-radius: 50%;
4570
+ }
4571
+ .m-badge.m-badge--invisible {
4572
+ transform: scale(0);
4573
+ opacity: 0;
4574
+ }
4575
+ .m-badge.m-badge--top-right {
4576
+ top: 0;
4577
+ right: 0;
4578
+ transform: scale(1) translate(50%, -50%);
4579
+ transform-origin: 100% 0%;
4580
+ }
4581
+ .m-badge.m-badge--top-right.m-badge--rectangular {
4582
+ transform: scale(1) translate(50%, -50%);
4583
+ }
4584
+ .m-badge.m-badge--top-right.m-badge--circular {
4585
+ transform: scale(1) translate(30%, -30%);
4586
+ }
4587
+ .m-badge.m-badge--top-right.m-badge--invisible {
4588
+ transform: scale(0) translate(50%, -50%);
4589
+ }
4590
+ .m-badge.m-badge--top-left {
4591
+ top: 0;
4592
+ left: 0;
4593
+ transform: scale(1) translate(-50%, -50%);
4594
+ transform-origin: 0% 0%;
4595
+ }
4596
+ .m-badge.m-badge--top-left.m-badge--rectangular {
4597
+ transform: scale(1) translate(-50%, -50%);
4598
+ }
4599
+ .m-badge.m-badge--top-left.m-badge--circular {
4600
+ transform: scale(1) translate(-30%, -30%);
4601
+ }
4602
+ .m-badge.m-badge--top-left.m-badge--invisible {
4603
+ transform: scale(0) translate(-50%, -50%);
4604
+ }
4605
+ .m-badge.m-badge--bottom-right {
4606
+ bottom: 0;
4607
+ right: 0;
4608
+ transform: scale(1) translate(50%, 50%);
4609
+ transform-origin: 100% 100%;
4610
+ }
4611
+ .m-badge.m-badge--bottom-right.m-badge--rectangular {
4612
+ transform: scale(1) translate(50%, 50%);
4613
+ }
4614
+ .m-badge.m-badge--bottom-right.m-badge--circular {
4615
+ transform: scale(1) translate(30%, 30%);
4616
+ }
4617
+ .m-badge.m-badge--bottom-right.m-badge--invisible {
4618
+ transform: scale(0) translate(50%, 50%);
4619
+ }
4620
+ .m-badge.m-badge--bottom-left {
4621
+ bottom: 0;
4622
+ left: 0;
4623
+ transform: scale(1) translate(-50%, 50%);
4624
+ transform-origin: 0% 100%;
4625
+ }
4626
+ .m-badge.m-badge--bottom-left.m-badge--rectangular {
4627
+ transform: scale(1) translate(-50%, 50%);
4628
+ }
4629
+ .m-badge.m-badge--bottom-left.m-badge--circular {
4630
+ transform: scale(1) translate(-30%, 30%);
4631
+ }
4632
+ .m-badge.m-badge--bottom-left.m-badge--invisible {
4633
+ transform: scale(0) translate(-50%, 50%);
4634
+ }
4635
+
4636
+ .m-badge--red {
4637
+ background-color: #F44336;
4638
+ }
4639
+
4640
+ .m-badge--pink {
4641
+ background-color: #e91e63;
4642
+ }
4643
+
4644
+ .m-badge--purple {
4645
+ background-color: #9c27b0;
4646
+ }
4647
+
4648
+ .m-badge--deep-purple {
4649
+ background-color: #673ab7;
4650
+ }
4651
+
4652
+ .m-badge--indigo {
4653
+ background-color: #3f51b5;
4654
+ }
4655
+
4656
+ .m-badge--blue {
4657
+ background-color: #2196F3;
4658
+ }
4659
+
4660
+ .m-badge--light-blue {
4661
+ background-color: #03a9f4;
4662
+ }
4663
+
4664
+ .m-badge--cyan {
4665
+ background-color: #00bcd4;
4666
+ }
4667
+
4668
+ .m-badge--teal {
4669
+ background-color: #009688;
4670
+ }
4671
+
4672
+ .m-badge--green {
4673
+ background-color: #4CAF50;
4674
+ }
4675
+
4676
+ .m-badge--light-green {
4677
+ background-color: #8bc34a;
4678
+ }
4679
+
4680
+ .m-badge--lime {
4681
+ background-color: #cddc39;
4682
+ }
4683
+
4684
+ .m-badge--yellow {
4685
+ background-color: #ffeb3b;
4686
+ color: #000;
4687
+ }
4688
+
4689
+ .m-badge--amber {
4690
+ background-color: #ffc107;
4691
+ }
4692
+
4693
+ .m-badge--orange {
4694
+ background-color: #ff9800;
4695
+ }
4696
+
4697
+ .m-badge--deep-orange {
4698
+ background-color: #ff5722;
4699
+ }
4700
+
4701
+ .m-badge--brown {
4702
+ background-color: #795548;
4703
+ }
4704
+
4705
+ .m-badge--grey {
4706
+ background-color: #9e9e9e;
4707
+ }
4708
+
4709
+ .m-badge--blue-grey {
4710
+ background-color: #607d8b;
4711
+ }
4712
+
4713
+ .m-badge--lighten-5 {
4714
+ filter: brightness(1.4);
4715
+ }
4716
+
4717
+ .m-badge--lighten-4 {
4718
+ filter: brightness(1.3);
4719
+ }
4720
+
4721
+ .m-badge--lighten-3 {
4722
+ filter: brightness(1.2);
4723
+ }
4724
+
4725
+ .m-badge--lighten-2 {
4726
+ filter: brightness(1.1);
4727
+ }
4728
+
4729
+ .m-badge--lighten-1 {
4730
+ filter: brightness(1.05);
4731
+ }
4732
+
4733
+ .m-badge--darken-1 {
4734
+ filter: brightness(0.95);
4735
+ }
4736
+
4737
+ .m-badge--darken-2 {
4738
+ filter: brightness(0.9);
4739
+ }
4740
+
4741
+ .m-badge--darken-3 {
4742
+ filter: brightness(0.8);
4743
+ }
4744
+
4745
+ .m-badge--darken-4 {
4746
+ filter: brightness(0.7);
4747
+ }
4748
+
4749
+ @media (prefers-reduced-motion: reduce) {
4750
+ .m-badge {
4751
+ transition: none;
4752
+ }
4753
+ }
4754
+ @media (prefers-contrast: high) {
4755
+ .m-badge {
4756
+ border: 2px solid currentColor;
4757
+ }
4758
+ }
package/dist/index.css CHANGED
@@ -4812,6 +4812,7 @@ small {
4812
4812
  align-items: center;
4813
4813
  justify-content: space-between;
4814
4814
  cursor: default;
4815
+ transition: transform 300ms cubic-bezier(0.215, 0.61, 0.355, 1), opacity 300ms cubic-bezier(0.215, 0.61, 0.355, 1), margin-top 300ms cubic-bezier(0.215, 0.61, 0.355, 1), max-height 300ms cubic-bezier(0.215, 0.61, 0.355, 1), padding-top 300ms cubic-bezier(0.215, 0.61, 0.355, 1), padding-bottom 300ms cubic-bezier(0.215, 0.61, 0.355, 1);
4815
4816
  }
4816
4817
  .toast .toast-action {
4817
4818
  color: #eeff41;
@@ -12518,4 +12519,231 @@ body.dark {
12518
12519
  [data-theme=dark] .linear-progress__track {
12519
12520
  background-color: rgba(255, 255, 255, 0.3);
12520
12521
  }
12522
+ }
12523
+ /* Badge Component
12524
+ ========================================================================== */
12525
+ .badge-wrapper {
12526
+ position: relative;
12527
+ display: inline-flex;
12528
+ vertical-align: middle;
12529
+ flex-shrink: 0;
12530
+ }
12531
+
12532
+ .m-badge {
12533
+ position: absolute;
12534
+ display: flex;
12535
+ align-items: center;
12536
+ justify-content: center;
12537
+ box-sizing: border-box;
12538
+ font-family: Roboto, sans-serif;
12539
+ font-weight: 500;
12540
+ line-height: 1;
12541
+ white-space: nowrap;
12542
+ text-align: center;
12543
+ border-radius: 10px;
12544
+ background-color: #F44336;
12545
+ color: #fff;
12546
+ z-index: 1;
12547
+ transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1);
12548
+ }
12549
+ .m-badge.m-badge--standard {
12550
+ min-width: 20px;
12551
+ height: 20px;
12552
+ padding: 0 6px;
12553
+ font-size: 12px;
12554
+ }
12555
+ .m-badge.m-badge--dot {
12556
+ width: 8px;
12557
+ height: 8px;
12558
+ min-width: 8px;
12559
+ padding: 0;
12560
+ border-radius: 50%;
12561
+ }
12562
+ .m-badge.m-badge--invisible {
12563
+ transform: scale(0);
12564
+ opacity: 0;
12565
+ }
12566
+ .m-badge.m-badge--top-right {
12567
+ top: 0;
12568
+ right: 0;
12569
+ transform: scale(1) translate(50%, -50%);
12570
+ transform-origin: 100% 0%;
12571
+ }
12572
+ .m-badge.m-badge--top-right.m-badge--rectangular {
12573
+ transform: scale(1) translate(50%, -50%);
12574
+ }
12575
+ .m-badge.m-badge--top-right.m-badge--circular {
12576
+ transform: scale(1) translate(30%, -30%);
12577
+ }
12578
+ .m-badge.m-badge--top-right.m-badge--invisible {
12579
+ transform: scale(0) translate(50%, -50%);
12580
+ }
12581
+ .m-badge.m-badge--top-left {
12582
+ top: 0;
12583
+ left: 0;
12584
+ transform: scale(1) translate(-50%, -50%);
12585
+ transform-origin: 0% 0%;
12586
+ }
12587
+ .m-badge.m-badge--top-left.m-badge--rectangular {
12588
+ transform: scale(1) translate(-50%, -50%);
12589
+ }
12590
+ .m-badge.m-badge--top-left.m-badge--circular {
12591
+ transform: scale(1) translate(-30%, -30%);
12592
+ }
12593
+ .m-badge.m-badge--top-left.m-badge--invisible {
12594
+ transform: scale(0) translate(-50%, -50%);
12595
+ }
12596
+ .m-badge.m-badge--bottom-right {
12597
+ bottom: 0;
12598
+ right: 0;
12599
+ transform: scale(1) translate(50%, 50%);
12600
+ transform-origin: 100% 100%;
12601
+ }
12602
+ .m-badge.m-badge--bottom-right.m-badge--rectangular {
12603
+ transform: scale(1) translate(50%, 50%);
12604
+ }
12605
+ .m-badge.m-badge--bottom-right.m-badge--circular {
12606
+ transform: scale(1) translate(30%, 30%);
12607
+ }
12608
+ .m-badge.m-badge--bottom-right.m-badge--invisible {
12609
+ transform: scale(0) translate(50%, 50%);
12610
+ }
12611
+ .m-badge.m-badge--bottom-left {
12612
+ bottom: 0;
12613
+ left: 0;
12614
+ transform: scale(1) translate(-50%, 50%);
12615
+ transform-origin: 0% 100%;
12616
+ }
12617
+ .m-badge.m-badge--bottom-left.m-badge--rectangular {
12618
+ transform: scale(1) translate(-50%, 50%);
12619
+ }
12620
+ .m-badge.m-badge--bottom-left.m-badge--circular {
12621
+ transform: scale(1) translate(-30%, 30%);
12622
+ }
12623
+ .m-badge.m-badge--bottom-left.m-badge--invisible {
12624
+ transform: scale(0) translate(-50%, 50%);
12625
+ }
12626
+
12627
+ .m-badge--red {
12628
+ background-color: #F44336;
12629
+ }
12630
+
12631
+ .m-badge--pink {
12632
+ background-color: #e91e63;
12633
+ }
12634
+
12635
+ .m-badge--purple {
12636
+ background-color: #9c27b0;
12637
+ }
12638
+
12639
+ .m-badge--deep-purple {
12640
+ background-color: #673ab7;
12641
+ }
12642
+
12643
+ .m-badge--indigo {
12644
+ background-color: #3f51b5;
12645
+ }
12646
+
12647
+ .m-badge--blue {
12648
+ background-color: #2196F3;
12649
+ }
12650
+
12651
+ .m-badge--light-blue {
12652
+ background-color: #03a9f4;
12653
+ }
12654
+
12655
+ .m-badge--cyan {
12656
+ background-color: #00bcd4;
12657
+ }
12658
+
12659
+ .m-badge--teal {
12660
+ background-color: #009688;
12661
+ }
12662
+
12663
+ .m-badge--green {
12664
+ background-color: #4CAF50;
12665
+ }
12666
+
12667
+ .m-badge--light-green {
12668
+ background-color: #8bc34a;
12669
+ }
12670
+
12671
+ .m-badge--lime {
12672
+ background-color: #cddc39;
12673
+ }
12674
+
12675
+ .m-badge--yellow {
12676
+ background-color: #ffeb3b;
12677
+ color: #000;
12678
+ }
12679
+
12680
+ .m-badge--amber {
12681
+ background-color: #ffc107;
12682
+ }
12683
+
12684
+ .m-badge--orange {
12685
+ background-color: #ff9800;
12686
+ }
12687
+
12688
+ .m-badge--deep-orange {
12689
+ background-color: #ff5722;
12690
+ }
12691
+
12692
+ .m-badge--brown {
12693
+ background-color: #795548;
12694
+ }
12695
+
12696
+ .m-badge--grey {
12697
+ background-color: #9e9e9e;
12698
+ }
12699
+
12700
+ .m-badge--blue-grey {
12701
+ background-color: #607d8b;
12702
+ }
12703
+
12704
+ .m-badge--lighten-5 {
12705
+ filter: brightness(1.4);
12706
+ }
12707
+
12708
+ .m-badge--lighten-4 {
12709
+ filter: brightness(1.3);
12710
+ }
12711
+
12712
+ .m-badge--lighten-3 {
12713
+ filter: brightness(1.2);
12714
+ }
12715
+
12716
+ .m-badge--lighten-2 {
12717
+ filter: brightness(1.1);
12718
+ }
12719
+
12720
+ .m-badge--lighten-1 {
12721
+ filter: brightness(1.05);
12722
+ }
12723
+
12724
+ .m-badge--darken-1 {
12725
+ filter: brightness(0.95);
12726
+ }
12727
+
12728
+ .m-badge--darken-2 {
12729
+ filter: brightness(0.9);
12730
+ }
12731
+
12732
+ .m-badge--darken-3 {
12733
+ filter: brightness(0.8);
12734
+ }
12735
+
12736
+ .m-badge--darken-4 {
12737
+ filter: brightness(0.7);
12738
+ }
12739
+
12740
+ @media (prefers-reduced-motion: reduce) {
12741
+ .m-badge {
12742
+ transition: none;
12743
+ }
12744
+ }
12745
+ @media (prefers-contrast: high) {
12746
+ .m-badge {
12747
+ border: 2px solid currentColor;
12748
+ }
12521
12749
  }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import './index.scss';
2
2
  export * from './autocomplete';
3
+ export * from './badge';
3
4
  export * from './button';
4
5
  export * from './carousel';
5
6
  export * from './chip';