@ulu/frontend 0.6.7 → 0.6.9

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 (53) hide show
  1. package/README.dev.md +6 -1
  2. package/dist/mcp-data.json +72004 -0
  3. package/dist/umd/frontend.css +1 -1
  4. package/lib/scss/base/_themes.demo.html +25 -0
  5. package/lib/scss/components/_accordion.demo.html +89 -0
  6. package/lib/scss/components/_accordion.scss +1 -1
  7. package/lib/scss/components/_badge-stack.demo.html +54 -0
  8. package/lib/scss/components/_badge.demo.html +41 -0
  9. package/lib/scss/components/_basic-hero.demo.html +33 -0
  10. package/lib/scss/components/_breadcrumb.demo.html +39 -0
  11. package/lib/scss/components/_button-group.demo.html +19 -0
  12. package/lib/scss/components/_button-verbose.demo.html +23 -0
  13. package/lib/scss/components/_button.demo.html +24 -0
  14. package/lib/scss/components/_button.scss +9 -11
  15. package/lib/scss/components/_callout.demo.html +32 -0
  16. package/lib/scss/components/_captioned-figure.demo.html +32 -0
  17. package/lib/scss/components/_card-grid.demo.html +34 -0
  18. package/lib/scss/components/_card.demo.html +49 -0
  19. package/lib/scss/components/_card.scss +14 -4
  20. package/lib/scss/components/_counter-list.demo.html +28 -0
  21. package/lib/scss/components/_css-icon.demo.html +49 -0
  22. package/lib/scss/components/_data-grid.demo.html +47 -0
  23. package/lib/scss/components/_data-list.demo.html +67 -0
  24. package/lib/scss/components/_data-table.demo.html +91 -0
  25. package/lib/scss/components/_definition-list.demo.html +59 -0
  26. package/lib/scss/components/_flipcard.demo.html +40 -0
  27. package/lib/scss/components/_headline-label.demo.html +9 -0
  28. package/lib/scss/components/_hero.demo.html +40 -0
  29. package/lib/scss/components/_image-grid.demo.html +24 -0
  30. package/lib/scss/components/_input-group.demo.html +42 -0
  31. package/lib/scss/components/_list-inline.demo.html +20 -0
  32. package/lib/scss/components/_list-lines.demo.html +19 -0
  33. package/lib/scss/components/_menu-stack.demo.html +69 -0
  34. package/lib/scss/components/_modal.demo.html +49 -0
  35. package/lib/scss/components/_nav-strip.demo.html +36 -0
  36. package/lib/scss/components/_overlay-section.demo.html +29 -0
  37. package/lib/scss/components/_panel.demo.html +31 -0
  38. package/lib/scss/components/_popover.demo.html +48 -0
  39. package/lib/scss/components/_progress-bar.demo.html +40 -0
  40. package/lib/scss/components/_progress-circle.demo.html +44 -0
  41. package/lib/scss/components/_pull-quote.demo.html +20 -0
  42. package/lib/scss/components/_rail.demo.html +41 -0
  43. package/lib/scss/components/_ratio-box.demo.html +15 -0
  44. package/lib/scss/components/_rule.demo.html +22 -0
  45. package/lib/scss/components/_skeleton.demo.html +39 -0
  46. package/lib/scss/components/_slider.demo.html +28 -0
  47. package/lib/scss/components/_sticky-list.demo.html +25 -0
  48. package/lib/scss/components/_tabs.demo.html +41 -0
  49. package/lib/scss/components/_tag.demo.html +20 -0
  50. package/lib/scss/components/_tagged.demo.html +17 -0
  51. package/lib/scss/components/_tile-grid.demo.html +22 -0
  52. package/lib/scss/components/_wysiwyg.demo.html +14 -0
  53. package/package.json +9 -4
@@ -0,0 +1,25 @@
1
+ <!-- @ulu-demo
2
+ title: Theme Switching
3
+ description: Using the `theme-light` and `theme-dark` classes to change the visual context of a section.
4
+ -->
5
+ <div>
6
+ <button class="button" data-ulu-theme-toggle='{ "target": "#theme-demo-box" }'>Toggle Theme</button>
7
+
8
+ <div id="theme-demo-box" class="demo-theme-box theme-light padding">
9
+ <h3 class="h3">Themed Content</h3>
10
+ <p>This section changes its colors based on the applied theme class.</p>
11
+ <button class="button">Themed Button</button>
12
+ </div>
13
+ </div>
14
+
15
+ <!-- @ulu-demo
16
+ title: Theme Inversion
17
+ description: The `theme-inverse` utility automatically applies the opposite theme (e.g., dark inside light) based on the current context.
18
+ -->
19
+ <div class="demo-theme-box theme-light">
20
+ <h3 class="h3">Light Context</h3>
21
+ <div class="demo-theme-box theme-inverse padding margin-top">
22
+ <p>This box is automatically inverted to the dark theme because its parent is light.</p>
23
+ <button class="button">Inverted Button</button>
24
+ </div>
25
+ </div>
@@ -0,0 +1,89 @@
1
+ <!-- @ulu-demo
2
+ title: Basic Accordion
3
+ description: A standard accordion stack with plus-to-minus icons and one-at-a-time behavior.
4
+ -->
5
+ <div data-ulu-details-group='{ "onlyOneOpen": true }'>
6
+ <details class="accordion">
7
+ <summary class="accordion__summary">
8
+ What is your return policy?
9
+ <span class="accordion__icon" aria-hidden="true">
10
+ <span class="css-icon css-icon--plus-to-minus"></span>
11
+ </span>
12
+ </summary>
13
+ <div class="accordion__content">
14
+ <p>You can return any unused item within 30 days of purchase for a full refund.</p>
15
+ </div>
16
+ </details>
17
+ <details class="accordion">
18
+ <summary class="accordion__summary">
19
+ Do you offer customer support?
20
+ <span class="accordion__icon" aria-hidden="true">
21
+ <span class="css-icon css-icon--plus-to-minus"></span>
22
+ </span>
23
+ </summary>
24
+ <div class="accordion__content">
25
+ <p>Yes, our customer support team is available 24/7 via email, live chat, or phone.</p>
26
+ </div>
27
+ </details>
28
+ </div>
29
+
30
+ <!-- @ulu-demo
31
+ title: Transparent Variant
32
+ description: The `accordion--transparent` modifier blends the component into the background.
33
+ -->
34
+ <div data-ulu-details-group='{ "onlyOneOpen": true }'>
35
+ <details class="accordion accordion--transparent">
36
+ <summary class="accordion__summary">
37
+ Product Features
38
+ <span class="accordion__icon" aria-hidden="true">
39
+ <span class="css-icon css-icon--angle-right-to-down"></span>
40
+ </span>
41
+ </summary>
42
+ <div class="accordion__content">
43
+ <ul>
44
+ <li>Water-resistant design</li>
45
+ <li>24-hour battery life</li>
46
+ </ul>
47
+ </div>
48
+ </details>
49
+ <details class="accordion accordion--transparent">
50
+ <summary class="accordion__summary">
51
+ Warranty Information
52
+ <span class="accordion__icon" aria-hidden="true">
53
+ <span class="css-icon css-icon--angle-right-to-down"></span>
54
+ </span>
55
+ </summary>
56
+ <div class="accordion__content">
57
+ <p>This product comes with a one-year limited warranty covering manufacturer defects.</p>
58
+ </div>
59
+ </details>
60
+ </div>
61
+
62
+ <!-- @ulu-demo
63
+ title: Borderless Variant
64
+ description: The `accordion--borderless` modifier removes external borders for an inline look.
65
+ -->
66
+ <div data-ulu-details-group='{ "onlyOneOpen": true }'>
67
+ <details class="accordion accordion--borderless">
68
+ <summary class="accordion__summary">
69
+ Privacy Settings
70
+ <span class="accordion__icon" aria-hidden="true">
71
+ <span class="css-icon css-icon--angle-down-to-up"></span>
72
+ </span>
73
+ </summary>
74
+ <div class="accordion__content">
75
+ <p>Manage who can see your profile and activity status.</p>
76
+ </div>
77
+ </details>
78
+ <details class="accordion accordion--borderless">
79
+ <summary class="accordion__summary">
80
+ Cookie Policy
81
+ <span class="accordion__icon" aria-hidden="true">
82
+ <span class="css-icon css-icon--angle-down-to-up"></span>
83
+ </span>
84
+ </summary>
85
+ <div class="accordion__content">
86
+ <p>We use cookies to improve your browsing experience.</p>
87
+ </div>
88
+ </details>
89
+ </div>
@@ -1,6 +1,6 @@
1
1
  ////
2
2
  /// @group accordion
3
- /// Outputs accordion component stylesheet, which can be used with <details> or custom disclosure components
3
+ /// Outputs accordion component stylesheet, which can be used with html details element or custom disclosure components.
4
4
  ////
5
5
 
6
6
  @use "sass:map";
@@ -0,0 +1,54 @@
1
+ <!-- @ulu-demo
2
+ title: Basic Badge Stack
3
+ description: Overlapping text-based badges.
4
+ -->
5
+ <ul class="badge-stack">
6
+ <li class="badge-stack__item">
7
+ <span class="badge badge--small">
8
+ <span class="badge__inner"><span>JD</span></span>
9
+ </span>
10
+ </li>
11
+ <li class="badge-stack__item">
12
+ <span class="badge badge--small">
13
+ <span class="badge__inner"><span>MS</span></span>
14
+ </span>
15
+ </li>
16
+ <li class="badge-stack__item">
17
+ <span class="badge badge--small">
18
+ <span class="badge__inner"><span>AJ</span></span>
19
+ </span>
20
+ </li>
21
+ <li class="badge-stack__item">
22
+ <span class="badge badge--small">
23
+ <span class="badge__inner"><span>+3</span></span>
24
+ </span>
25
+ </li>
26
+ </ul>
27
+
28
+ <!-- @ulu-demo
29
+ title: Clickable Image Stack
30
+ description: A stack of clickable user profiles with images.
31
+ -->
32
+ <ul class="badge-stack">
33
+ <li class="badge-stack__item">
34
+ <a href="#" class="badge badge--small badge--clickable">
35
+ <div class="badge__inner">
36
+ <img src="https://picsum.photos/id/64/100/100" alt="User 1">
37
+ </div>
38
+ </a>
39
+ </li>
40
+ <li class="badge-stack__item">
41
+ <a href="#" class="badge badge--small badge--clickable">
42
+ <div class="badge__inner">
43
+ <img src="https://picsum.photos/id/65/100/100" alt="User 2">
44
+ </div>
45
+ </a>
46
+ </li>
47
+ <li class="badge-stack__item">
48
+ <a href="#" class="badge badge--small badge--clickable">
49
+ <div class="badge__inner">
50
+ <img src="https://picsum.photos/id/66/100/100" alt="User 3">
51
+ </div>
52
+ </a>
53
+ </li>
54
+ </ul>
@@ -0,0 +1,41 @@
1
+ <!-- @ulu-demo
2
+ title: Basic Badge
3
+ description: A standard badge with text.
4
+ -->
5
+ <div class="badge">
6
+ <div class="badge__inner">
7
+ <span>JS</span>
8
+ </div>
9
+ </div>
10
+
11
+ <!-- @ulu-demo
12
+ title: Badge Sizes
13
+ description: Demonstrating small, default, and large badge variants.
14
+ -->
15
+ <div style="display: flex; gap: 1rem; align-items: center;">
16
+ <div class="badge badge--small">
17
+ <div class="badge__inner">
18
+ <span>SM</span>
19
+ </div>
20
+ </div>
21
+ <div class="badge">
22
+ <div class="badge__inner">
23
+ <span>MD</span>
24
+ </div>
25
+ </div>
26
+ <div class="badge badge--large">
27
+ <div class="badge__inner">
28
+ <span>LG</span>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- @ulu-demo
34
+ title: Clickable Badge with Image
35
+ description: A badge containing an image that scales on hover.
36
+ -->
37
+ <a href="#" class="badge">
38
+ <div class="badge__inner">
39
+ <img src="https://picsum.photos/id/64/300/300" alt="Profile Image">
40
+ </div>
41
+ </a>
@@ -0,0 +1,33 @@
1
+ <!-- @ulu-demo
2
+ title: Basic Hero
3
+ description: A hero section with content and media side-by-side on larger screens.
4
+ fullscreen: true
5
+ -->
6
+ <div class="basic-hero">
7
+ <div class="basic-hero__content container">
8
+ <div class="basic-hero__content-main">
9
+ <h1 class="h1">Hero Title with Supporting Text</h1>
10
+ <p class="type-large">This is a description that provides more context about the page or section.</p>
11
+ </div>
12
+ <div class="basic-hero__content-media">
13
+ <img src="https://picsum.photos/id/10/400/300" alt="Hero Media">
14
+ </div>
15
+ </div>
16
+ </div>
17
+
18
+ <!-- @ulu-demo
19
+ title: Centered Hero
20
+ description: A centered layout for the hero section.
21
+ fullscreen: true
22
+ -->
23
+ <div class="basic-hero basic-hero--center">
24
+ <div class="basic-hero__content container">
25
+ <div class="basic-hero__content-main">
26
+ <h1 class="h1">Centered Hero Title</h1>
27
+ <p class="type-large">A brief and compelling reason to explore further.</p>
28
+ </div>
29
+ <div class="basic-hero__content-media">
30
+ <img src="https://picsum.photos/id/20/400/300" alt="Hero Media">
31
+ </div>
32
+ </div>
33
+ </div>
@@ -0,0 +1,39 @@
1
+ <!-- @ulu-demo
2
+ title: Standard Breadcrumb
3
+ description: A typical breadcrumb trail for navigation.
4
+ -->
5
+ <nav class="breadcrumb" aria-label="Breadcrumb">
6
+ <ol class="breadcrumb__list">
7
+ <li class="breadcrumb__item">
8
+ <a href="#" class="breadcrumb__link">Home</a>
9
+ <span class="breadcrumb__separator" aria-hidden="true">/</span>
10
+ </li>
11
+ <li class="breadcrumb__item">
12
+ <a href="#" class="breadcrumb__link">Products</a>
13
+ <span class="breadcrumb__separator" aria-hidden="true">/</span>
14
+ </li>
15
+ <li class="breadcrumb__item" aria-current="page">
16
+ <span class="breadcrumb__current">Electronic Gadgets</span>
17
+ </li>
18
+ </ol>
19
+ </nav>
20
+
21
+ <!-- @ulu-demo
22
+ title: Truncated Breadcrumb
23
+ description: Items automatically truncate with an ellipsis if they exceed the `item-max-width`.
24
+ -->
25
+ <nav class="breadcrumb" aria-label="Breadcrumb">
26
+ <ol class="breadcrumb__list">
27
+ <li class="breadcrumb__item">
28
+ <a href="#" class="breadcrumb__link">Home</a>
29
+ <span class="breadcrumb__separator" aria-hidden="true">/</span>
30
+ </li>
31
+ <li class="breadcrumb__item">
32
+ <a href="#" class="breadcrumb__link">This is an extremely long page title that will be truncated by the breadcrumb component</a>
33
+ <span class="breadcrumb__separator" aria-hidden="true">/</span>
34
+ </li>
35
+ <li class="breadcrumb__item" aria-current="page">
36
+ <span class="breadcrumb__current">Current Page</span>
37
+ </li>
38
+ </ol>
39
+ </nav>
@@ -0,0 +1,19 @@
1
+ <!-- @ulu-demo
2
+ title: Standard Button Group
3
+ description: A group of buttons with a standard gap between them.
4
+ -->
5
+ <div class="button-group">
6
+ <button class="button">Action 1</button>
7
+ <button class="button">Action 2</button>
8
+ <button class="button">Action 3</button>
9
+ </div>
10
+
11
+ <!-- @ulu-demo
12
+ title: Joined Button Group
13
+ description: Buttons in this group are visually connected, with rounded corners only on the outer edges.
14
+ -->
15
+ <div class="button-group button-group--joined">
16
+ <button class="button">Left</button>
17
+ <button class="button is-active">Middle</button>
18
+ <button class="button">Right</button>
19
+ </div>
@@ -0,0 +1,23 @@
1
+ <!-- @ulu-demo
2
+ title: Standard Verbose Button
3
+ description: A button that includes a title and body text, often used for important links or pagination.
4
+ -->
5
+ <a href="#" class="button-verbose">
6
+ <strong class="button-verbose__title">Primary Action Title</strong>
7
+ <span class="button-verbose__body">Additional descriptive text that explains the consequence of this action.</span>
8
+ <span class="button-verbose__icon" aria-hidden="true">
9
+ <span class="css-icon css-icon--angle-right"></span>
10
+ </span>
11
+ </a>
12
+
13
+ <!-- @ulu-demo
14
+ title: Full Width Verbose Button
15
+ description: The `button-verbose--full-width` modifier makes the button span the entire width of its container.
16
+ -->
17
+ <a href="#" class="button-verbose button-verbose--full-width">
18
+ <strong class="button-verbose__title">Next Chapter</strong>
19
+ <span class="button-verbose__body">Continue reading about the architecture of the system.</span>
20
+ <span class="button-verbose__icon" aria-hidden="true">
21
+ <span class="css-icon css-icon--angle-right"></span>
22
+ </span>
23
+ </a>
@@ -0,0 +1,24 @@
1
+ <!-- @ulu-demo
2
+ title: Primary Button
3
+ description: The default button style for main actions.
4
+ wrapperClass: demo-theme-box demo-width-small
5
+ -->
6
+ <button class="button">Primary Button</button>
7
+
8
+ <!-- @ulu-demo
9
+ title: Secondary Button
10
+ description: An alternative style for less important actions.
11
+ -->
12
+ <button class="button button--secondary">Secondary Button</button>
13
+
14
+ <!-- @ulu-demo
15
+ title: Small Button
16
+ description: A smaller button variant.
17
+ -->
18
+ <button class="button button--small">Small Button</button>
19
+
20
+ <!-- @ulu-demo
21
+ title: Large Button
22
+ description: A larger button variant.
23
+ -->
24
+ <button class="button button--large">Large Button</button>
@@ -62,12 +62,15 @@ $config: (
62
62
  #{ $prefix } {
63
63
  @include button.default();
64
64
  }
65
+ #{ $prefix }--fit {
66
+ min-width: 0;
67
+ }
65
68
  #{ $prefix }__icon {
66
- &:first-child {
67
- margin-right: get("icon-margin");
69
+ &:not(:first-child) {
70
+ margin-inline-start: get("icon-margin");
68
71
  }
69
- &:last-child {
70
- margin-left: get("icon-margin");
72
+ &:not(:last-child) {
73
+ margin-inline-end: get("icon-margin");
71
74
  }
72
75
  }
73
76
 
@@ -97,13 +100,8 @@ $config: (
97
100
  padding: 0 !important;
98
101
 
99
102
  #{ $prefix }__icon {
100
- transform: translatey(get("icon-centered-vertical-offset"));
101
- &:first-child {
102
- margin-right: 0;
103
- }
104
- &:last-child {
105
- margin-left: 0;
106
- }
103
+ transform: translateY(get("icon-centered-vertical-offset"));
104
+ margin: 0;
107
105
  }
108
106
  }
109
107
 
@@ -0,0 +1,32 @@
1
+ <!-- @ulu-demo
2
+ title: Basic Callout
3
+ description: A simple container to highlight content.
4
+ -->
5
+ <div class="callout">
6
+ <p>This is a default callout. It provides a subtle background to distinguish this section from the rest of the content.</p>
7
+ </div>
8
+
9
+ <!-- @ulu-demo
10
+ title: Status Callouts
11
+ description: Modifiers for different semantic states.
12
+ -->
13
+ <div class="callout callout--info">
14
+ <p><strong>Info:</strong> Use this for helpful tips or additional context.</p>
15
+ </div>
16
+ <div class="callout callout--success">
17
+ <p><strong>Success:</strong> Use this to confirm a positive action or state.</p>
18
+ </div>
19
+ <div class="callout callout--warning">
20
+ <p><strong>Warning:</strong> Use this to alert the user about potential issues.</p>
21
+ </div>
22
+ <div class="callout callout--danger">
23
+ <p><strong>Danger:</strong> Use this for critical errors or irreversible actions.</p>
24
+ </div>
25
+
26
+ <!-- @ulu-demo
27
+ title: Outline Callout
28
+ description: A variant with no background color.
29
+ -->
30
+ <div class="callout callout--outline">
31
+ <p>This is an outline callout. It uses a border without a background fill.</p>
32
+ </div>
@@ -0,0 +1,32 @@
1
+ <!-- @ulu-demo
2
+ title: Traditional Layout
3
+ description: A traditional figure layout with the caption appearing below the image.
4
+ -->
5
+ <figure class="captioned-figure captioned-figure--traditional">
6
+ <img src="https://picsum.photos/id/1018/600/400" alt="Landscape photo">
7
+ <figcaption class="captioned-figure__caption">
8
+ A beautiful landscape captured during sunset.
9
+ </figcaption>
10
+ </figure>
11
+
12
+ <!-- @ulu-demo
13
+ title: Bottom-Right Overlay
14
+ description: The caption is overlaid on the bottom-right of the image using absolute positioning.
15
+ -->
16
+ <figure class="captioned-figure captioned-figure--bottom captioned-figure--right">
17
+ <img src="https://picsum.photos/id/1015/600/400" alt="Landscape photo">
18
+ <figcaption class="captioned-figure__caption">
19
+ Overlay Caption
20
+ </figcaption>
21
+ </figure>
22
+
23
+ <!-- @ulu-demo
24
+ title: Bottom-Center Overlay
25
+ description: The caption is centered at the bottom of the image.
26
+ -->
27
+ <figure class="captioned-figure captioned-figure--bottom captioned-figure--center">
28
+ <img src="https://picsum.photos/id/1016/600/400" alt="Landscape photo">
29
+ <figcaption class="captioned-figure__caption">
30
+ Centered Overlay
31
+ </figcaption>
32
+ </figure>
@@ -0,0 +1,34 @@
1
+ <!-- @ulu-demo
2
+ title: Standard Card Grid
3
+ description: A responsive grid that automatically fills rows with cards.
4
+ -->
5
+ <div class="card-grid">
6
+ <article class="card">
7
+ <div class="card__body"><div class="card__main"><h3 class="card__title">Card 1</h3><p>Content for the first card.</p></div></div>
8
+ </article>
9
+ <article class="card">
10
+ <div class="card__body"><div class="card__main"><h3 class="card__title">Card 2</h3><p>Content for the second card.</p></div></div>
11
+ </article>
12
+ <article class="card">
13
+ <div class="card__body"><div class="card__main"><h3 class="card__title">Card 3</h3><p>Content for the third card.</p></div></div>
14
+ </article>
15
+ </div>
16
+
17
+ <!-- @ulu-demo
18
+ title: Compact Card Grid
19
+ description: A grid with smaller minimum column widths and tighter gaps.
20
+ -->
21
+ <div class="card-grid card-grid--compact">
22
+ <article class="card">
23
+ <div class="card__body"><div class="card__main"><h3 class="card__title">Compact 1</h3></div></div>
24
+ </article>
25
+ <article class="card">
26
+ <div class="card__body"><div class="card__main"><h3 class="card__title">Compact 2</h3></div></div>
27
+ </article>
28
+ <article class="card">
29
+ <div class="card__body"><div class="card__main"><h3 class="card__title">Compact 3</h3></div></div>
30
+ </article>
31
+ <article class="card">
32
+ <div class="card__body"><div class="card__main"><h3 class="card__title">Compact 4</h3></div></div>
33
+ </article>
34
+ </div>
@@ -0,0 +1,49 @@
1
+ <!-- @ulu-demo
2
+ title: Basic Card
3
+ description: A standard card with a title, body content, and a footer.
4
+ -->
5
+ <article class="card">
6
+ <div class="card__body">
7
+ <div class="card__main">
8
+ <h3 class="card__title">Card Title</h3>
9
+ <p>This is the main content of the card. It provides a brief summary or introduction to a more detailed resource.</p>
10
+ </div>
11
+ </div>
12
+ <div class="card__footer">
13
+ <a href="#" class="button button--small">Read More</a>
14
+ </div>
15
+ </article>
16
+
17
+ <!-- @ulu-demo
18
+ title: Card with Image
19
+ description: A card that includes a featured image at the top.
20
+ -->
21
+ <article class="card">
22
+ <div class="card__image">
23
+ <img src="https://picsum.photos/id/1035/600/400" alt="Card Image">
24
+ </div>
25
+ <div class="card__body">
26
+ <div class="card__main">
27
+ <h3 class="card__title">Featured Resource</h3>
28
+ <p>Discover interesting insights and helpful tips in our latest featured article.</p>
29
+ </div>
30
+ </div>
31
+ </article>
32
+
33
+ <!-- @ulu-demo
34
+ title: Clickable Card (Proxy Click)
35
+ description: A card where the entire area is clickable, using a proxy click pattern for accessibility.
36
+ -->
37
+ <article class="card" data-ulu-proxy-click>
38
+ <div class="card__image">
39
+ <img src="https://picsum.photos/id/1019/600/400" alt="Card Image">
40
+ </div>
41
+ <div class="card__body">
42
+ <div class="card__main">
43
+ <h3 class="card__title">
44
+ <a href="#" class="card__title-link" data-ulu-proxy-click-source>Entire Card is Clickable</a>
45
+ </h3>
46
+ <p>This pattern allows the whole card to act as a link while maintaining a single, accessible anchor point.</p>
47
+ </div>
48
+ </div>
49
+ </article>
@@ -551,21 +551,31 @@ $config: (
551
551
  $prefix: selector.class("card");
552
552
 
553
553
  grid-template-columns: get("horizontal-image-width") 1fr;
554
- grid-template-rows: 1fr auto; // Footer is native height first row fills
554
+ // Fix: Use minmax(0, ...) to allow the row to shrink smaller than the image's height
555
+ grid-template-rows: minmax(0, 1fr) auto; // Footer is native height, first row fills
555
556
  min-height: get("horizontal-min-height");
556
557
  max-width: get("horizontal-max-width");
557
558
 
558
559
  // When no footer remove extra row
559
560
  &:not(:has(> #{ $prefix }__footer)) {
560
- grid-template-rows: auto;
561
+ grid-template-rows: minmax(0, 1fr);
561
562
  }
562
563
  #{ $prefix }__image {
563
564
  grid-column: 1 / 2;
564
565
  grid-row: 1 / -1;
565
566
  aspect-ratio: auto;
567
+ // Fix: Force the container to ignore the image's intrinsic height (height: 0)
568
+ // and instead stretch to fill the grid area (min-height: 100%).
569
+ height: 0;
570
+ min-height: 100%;
566
571
  border-top-right-radius: 0;
567
572
  border-bottom-left-radius: get("border-radius");
568
573
  }
574
+ #{ $prefix }__image img,
575
+ #{ $prefix}__image-media {
576
+ // Fix: Ensure the image itself doesn't have a minimum size requirement
577
+ min-height: 0;
578
+ }
569
579
  #{ $prefix }__body,
570
580
  #{ $prefix }__footer {
571
581
  grid-column: 2 / 3;
@@ -611,10 +621,10 @@ $config: (
611
621
  $prefix: selector.class("card");
612
622
 
613
623
  grid-template-columns: get("horizontal-image-width") 1fr auto;
614
- grid-template-rows: 1fr; // Footer is native height first row fills
624
+ // Fix: Use minmax(0, ...) to allow the row to shrink smaller than the image's height
625
+ grid-template-rows: minmax(0, 1fr);
615
626
  #{ $prefix }__footer {
616
627
  grid-column: 3;
617
-
618
628
  }
619
629
  }
620
630
 
@@ -0,0 +1,28 @@
1
+ <!-- @ulu-demo
2
+ title: Numeric Counter List
3
+ description: A standard ordered list styled with custom counters.
4
+ -->
5
+ <ol class="counter-list">
6
+ <li>First item in the list.</li>
7
+ <li>Second item with more content to demonstrate how the counter stays aligned.</li>
8
+ <li>Third item.</li>
9
+ </ol>
10
+
11
+ <!-- @ulu-demo
12
+ title: Alphabetical Counter List
13
+ description: Using the `counter-list--alphabetical` modifier to use letters instead of numbers.
14
+ -->
15
+ <ol class="counter-list counter-list--alphabetical">
16
+ <li>Analyze the requirements.</li>
17
+ <li>Design the solution.</li>
18
+ <li>Implement the features.</li>
19
+ </ol>
20
+
21
+ <!-- @ulu-demo
22
+ title: Non-List Counter Elements
23
+ description: You can also use the `counter-list__item` class on non-list elements (like divs).
24
+ -->
25
+ <div class="counter-list">
26
+ <div class="counter-list__item">This is a div acting as a counter item.</div>
27
+ <div class="counter-list__item">Another div in the counter flow.</div>
28
+ </div>