@pure-ds/storybook 0.4.16 → 0.4.17

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 (51) hide show
  1. package/.storybook/addons/html-preview/Panel.jsx +71 -20
  2. package/dist/pds-reference.json +2 -7
  3. package/package.json +2 -2
  4. package/public/assets/js/app.js +617 -10565
  5. package/public/assets/js/lit.js +3 -1048
  6. package/public/assets/js/pds.js +396 -7354
  7. package/public/assets/pds/components/pds-calendar.js +1 -1
  8. package/public/assets/pds/custom-elements.json +263 -18
  9. package/public/assets/pds/pds-runtime-config.json +1 -1
  10. package/public/assets/pds/styles/pds-components.css +83 -221
  11. package/public/assets/pds/styles/pds-components.css.js +166 -442
  12. package/public/assets/pds/styles/pds-styles.css +240 -437
  13. package/public/assets/pds/styles/pds-styles.css.js +479 -881
  14. package/public/assets/pds/styles/pds-utilities.css +151 -214
  15. package/public/assets/pds/styles/pds-utilities.css.js +302 -428
  16. package/src/js/pds-core/pds-generator.js +88 -38
  17. package/src/js/pds-core/pds-ontology.js +1 -1
  18. package/stories/components/PdsCalendar.stories.js +2 -2
  19. package/stories/components/PdsDrawer.stories.js +15 -15
  20. package/stories/components/PdsJsonform.stories.js +78 -0
  21. package/stories/components/PdsRichtext.stories.js +4 -17
  22. package/stories/components/PdsScrollrow.stories.js +224 -72
  23. package/stories/components/PdsSplitpanel.stories.js +63 -28
  24. package/stories/components/PdsTabstrip.stories.js +7 -7
  25. package/stories/enhancements/Accordion.stories.js +2 -2
  26. package/stories/enhancements/Dropdowns.stories.js +13 -10
  27. package/stories/enhancements/RangeSliders.stories.js +9 -9
  28. package/stories/enhancements/RequiredFields.stories.js +8 -8
  29. package/stories/enhancements/Toggles.stories.js +45 -36
  30. package/stories/enhancements/_enhancement-header.js +2 -2
  31. package/stories/foundations/Colors.stories.js +13 -13
  32. package/stories/foundations/HTMLDefaults.stories.js +4 -4
  33. package/stories/foundations/Icons.stories.js +123 -288
  34. package/stories/foundations/MeshGradients.stories.js +161 -250
  35. package/stories/foundations/SmartSurfaces.stories.js +147 -64
  36. package/stories/foundations/Spacing.stories.js +30 -30
  37. package/stories/foundations/Typography.stories.js +352 -723
  38. package/stories/foundations/ZIndex.stories.js +124 -141
  39. package/stories/layout/LayoutOverview.stories.js +343 -250
  40. package/stories/layout/LayoutSystem.stories.js +60 -76
  41. package/stories/patterns/InteractiveStates.stories.js +29 -29
  42. package/stories/patterns/Utilities.stories.js +17 -5
  43. package/stories/primitives/Alerts.stories.js +6 -6
  44. package/stories/primitives/Cards.stories.js +22 -11
  45. package/stories/primitives/Forms.stories.js +17 -8
  46. package/stories/primitives/Media.stories.js +23 -20
  47. package/stories/utilities/Backdrop.stories.js +68 -27
  48. package/stories/utils/PdsAsk.stories.js +1 -1
  49. package/public/assets/js/app.js.map +0 -7
  50. package/public/assets/js/lit.js.map +0 -7
  51. package/public/assets/js/pds.js.map +0 -7
@@ -1,10 +1,13 @@
1
1
  import { html } from "lit";
2
2
  import { enhancementHeader } from './_enhancement-header.js';
3
3
 
4
- // Demo-specific styles (legitimate custom CSS for visual demos)
5
- const dropdownGlassDemoStyles = html`
4
+ // Story-specific styles for dropdown demos
5
+ const dropdownStoryStyles = html`
6
6
  <style>
7
- .dropdown-story-glass-demo {
7
+ .story-dropdown-container {
8
+ height: 260px;
9
+ }
10
+ .story-glass-demo {
8
11
  position: relative;
9
12
  display: flex;
10
13
  justify-content: center;
@@ -13,10 +16,12 @@ const dropdownGlassDemoStyles = html`
13
16
  padding: var(--spacing-8);
14
17
  border-radius: var(--radius-xl);
15
18
  overflow: hidden;
16
- background-image: var(--dropdown-demo-image);
17
19
  background-size: cover;
18
20
  background-position: center;
19
21
  }
22
+ .story-glass-demo-travel {
23
+ background-image: url('https://images.unsplash.com/photo-1517832207067-4db24a2ae47c?auto=format&fit=crop&w=1200&q=80');
24
+ }
20
25
  </style>
21
26
  `;
22
27
 
@@ -95,11 +100,12 @@ export const WithIcons = () => html`
95
100
  `;
96
101
 
97
102
  export const DropUp = () => html`
103
+ ${dropdownStoryStyles}
98
104
  ${enhancementHeader('dropdown', {
99
105
  selector: '[data-mode="up"]',
100
106
  description: ' Adds `data-mode="up"` to make the dropdown menu open upwards instead of downwards.'
101
107
  })}
102
- <div class="flex justify-center items-end card" style="height: 260px;">
108
+ <div class="flex justify-center items-end card story-dropdown-container">
103
109
  <nav data-dropdown data-mode="up">
104
110
  <button class="btn-primary">Resources</button>
105
111
  <menu>
@@ -112,12 +118,9 @@ export const DropUp = () => html`
112
118
  `;
113
119
 
114
120
  export const BackgroundImageLiquidGlass = () => html`
115
- ${dropdownGlassDemoStyles}
121
+ ${dropdownStoryStyles}
116
122
  ${enhancementHeader('dropdown')}
117
- <section
118
- class="dropdown-story-glass-demo"
119
- style="--dropdown-demo-image: url('https://images.unsplash.com/photo-1517832207067-4db24a2ae47c?auto=format&fit=crop&w=1200&q=80');"
120
- >
123
+ <section class="story-glass-demo story-glass-demo-travel">
121
124
  <div class="stack-md gap-md text-center max-w-sm">
122
125
  <div class="card liquid-glass stack-md">
123
126
  <h3>Plan Your Escape</h3>
@@ -21,7 +21,7 @@ export const StandardFloatingBubble = () => html`
21
21
  Default behavior: A floating bubble appears when you interact with the slider.
22
22
  </small>
23
23
  <label>
24
- <span>Volume</span>
24
+ <span data-label>Volume</span>
25
25
  <input type="range" min="0" max="100" value="50">
26
26
  </label>
27
27
  </section>
@@ -39,19 +39,19 @@ export const MultipleRanges = () => html`
39
39
  }}"
40
40
  >
41
41
  <label>
42
- <span>Brightness</span>
42
+ <span data-label>Brightness</span>
43
43
  <input type="range" name="brightness" min="0" max="100" value="75">
44
44
  </label>
45
45
  <label>
46
- <span>Contrast</span>
46
+ <span data-label>Contrast</span>
47
47
  <input type="range" name="contrast" min="0" max="100" value="50">
48
48
  </label>
49
49
  <label>
50
- <span>Saturation</span>
50
+ <span data-label>Saturation</span>
51
51
  <input type="range" name="saturation" min="0" max="100" value="60">
52
52
  </label>
53
53
  <label>
54
- <span>Temperature</span>
54
+ <span data-label>Temperature</span>
55
55
  <input type="range" name="temperature" min="-100" max="100" value="0">
56
56
  </label>
57
57
  <button type="submit" class="btn-primary">Apply Settings</button>
@@ -68,11 +68,11 @@ export const CustomSteps = () => html`
68
68
  }}"
69
69
  >
70
70
  <label>
71
- <span>Opacity (10% steps)</span>
71
+ <span data-label>Opacity (10% steps)</span>
72
72
  <input type="range" name="opacity" min="0" max="100" value="100" step="10">
73
73
  </label>
74
74
  <label>
75
- <span>Font Size (0.25rem steps)</span>
75
+ <span data-label>Font Size (0.25rem steps)</span>
76
76
  <input type="range" name="fontSize" min="0.5" max="3" value="1" step="0.25">
77
77
  </label>
78
78
  <button type="submit" class="btn-primary">Apply Settings</button>
@@ -148,11 +148,11 @@ export const ComparisonView = () => html`
148
148
  </header>
149
149
  <div class="stack-md">
150
150
  <label>
151
- <span>Volume</span>
151
+ <span data-label>Volume</span>
152
152
  <input type="range" min="0" max="100" value="75">
153
153
  </label>
154
154
  <label>
155
- <span>Brightness</span>
155
+ <span data-label>Brightness</span>
156
156
  <input type="range" min="0" max="100" value="50">
157
157
  </label>
158
158
  </div>
@@ -23,18 +23,18 @@ export const BasicRequired = () => html`
23
23
  }}"
24
24
  >
25
25
  <label>
26
- <span>Full Name</span>
26
+ <span data-label>Full Name</span>
27
27
  <input type="text" required placeholder="John Doe">
28
28
  </label>
29
29
  <label>
30
- <span>Email</span>
30
+ <span data-label>Email</span>
31
31
  <div class="input-icon">
32
32
  <pds-icon icon="envelope"></pds-icon>
33
33
  <input type="email" required placeholder="john@example.com">
34
34
  </div>
35
35
  </label>
36
36
  <label>
37
- <span>Phone (optional)</span>
37
+ <span data-label>Phone (optional)</span>
38
38
  <div class="input-icon">
39
39
  <pds-icon icon="phone"></pds-icon>
40
40
  <input type="tel" placeholder="+1 (555) 123-4567">
@@ -55,21 +55,21 @@ export const MixedRequired = () => html`
55
55
  <fieldset>
56
56
  <legend>Account Information</legend>
57
57
  <label>
58
- <span>Username</span>
58
+ <span data-label>Username</span>
59
59
  <div class="input-icon">
60
60
  <pds-icon icon="user"></pds-icon>
61
61
  <input type="text" required placeholder="username">
62
62
  </div>
63
63
  </label>
64
64
  <label>
65
- <span>Password</span>
65
+ <span data-label>Password</span>
66
66
  <div class="input-icon">
67
67
  <pds-icon icon="lock"></pds-icon>
68
68
  <input type="password" required placeholder="••••••••">
69
69
  </div>
70
70
  </label>
71
71
  <label>
72
- <span>Confirm Password</span>
72
+ <span data-label>Confirm Password</span>
73
73
  <div class="input-icon">
74
74
  <pds-icon icon="lock"></pds-icon>
75
75
  <input type="password" required placeholder="••••••••">
@@ -80,11 +80,11 @@ export const MixedRequired = () => html`
80
80
  <fieldset>
81
81
  <legend>Optional Details</legend>
82
82
  <label>
83
- <span>Company</span>
83
+ <span data-label>Company</span>
84
84
  <input type="text" placeholder="Acme Corp">
85
85
  </label>
86
86
  <label>
87
- <span>Website</span>
87
+ <span data-label>Website</span>
88
88
  <div class="input-icon">
89
89
  <pds-icon icon="globe"></pds-icon>
90
90
  <input type="url" placeholder="https://example.com">
@@ -1,39 +1,48 @@
1
- import { html } from 'lit';
2
- import { enhancementHeader } from './_enhancement-header.js';
1
+ import { html } from "lit";
2
+ import { enhancementHeader } from "./_enhancement-header.js";
3
3
 
4
4
  export default {
5
- title: 'Enhancements/Toggles',
6
- tags: ['toggle', 'switch', 'checkbox', 'forms', 'interaction'],
5
+ title: "Enhancements/Toggles",
6
+ tags: ["toggle", "switch", "checkbox", "forms", "interaction"],
7
7
  parameters: {
8
8
  options: {
9
- selectedPanel: 'html-preview/panel'
9
+ selectedPanel: "html-preview/panel",
10
10
  },
11
11
  pds: {
12
- tags: ['toggle', 'switch', 'checkbox', 'forms', 'interaction', 'data-toggle', 'enhancement']
13
- }
14
- }
12
+ tags: [
13
+ "toggle",
14
+ "switch",
15
+ "checkbox",
16
+ "forms",
17
+ "interaction",
18
+ "data-toggle",
19
+ "enhancement",
20
+ ],
21
+ },
22
+ },
15
23
  };
16
24
 
17
25
  export const BasicToggle = () => html`
18
- ${enhancementHeader('toggle')}
26
+ ${enhancementHeader("toggle")}
27
+
19
28
  <label data-toggle>
29
+ <input type="checkbox" />
20
30
  <span data-label>Enable notifications</span>
21
- <input type="checkbox">
22
31
  </label>
23
32
  `;
24
33
 
25
34
  export const PreChecked = () => html`
26
- ${enhancementHeader('toggle')}
35
+ ${enhancementHeader("toggle")}
27
36
  <label data-toggle>
28
37
  <span data-label>Dark mode</span>
29
- <input type="checkbox" checked>
38
+ <input type="checkbox" checked />
30
39
  </label>
31
40
  `;
32
41
 
33
42
  export const MultipleToggles = () => html`
34
- ${enhancementHeader('toggle')}
43
+ ${enhancementHeader("toggle")}
35
44
  <form
36
- class="flex flex-col gap-sm toggle-story-form"
45
+ class="stack-sm toggle-story-form"
37
46
  @submit="${(event) => {
38
47
  event.preventDefault();
39
48
  toastFormData(new FormData(event.target));
@@ -41,26 +50,28 @@ export const MultipleToggles = () => html`
41
50
  >
42
51
  <label data-toggle>
43
52
  <span data-label>Email notifications</span>
44
- <input type="checkbox" name="email" checked>
53
+ <input type="checkbox" name="email" checked />
45
54
  </label>
46
55
  <label data-toggle>
47
56
  <span data-label>Push notifications</span>
48
- <input type="checkbox" name="push">
57
+ <input type="checkbox" name="push" />
49
58
  </label>
50
59
  <label data-toggle>
51
60
  <span data-label>SMS notifications</span>
52
- <input type="checkbox" name="sms">
61
+ <input type="checkbox" name="sms" />
53
62
  </label>
54
63
  <label data-toggle>
55
64
  <span data-label>Weekly digest</span>
56
- <input type="checkbox" name="digest" checked>
65
+ <input type="checkbox" name="digest" checked />
57
66
  </label>
58
- <button type="submit" class="btn-primary toggle-story-form__button">Save Preferences</button>
67
+ <button type="submit" class="btn-primary toggle-story-form__button">
68
+ Save Preferences
69
+ </button>
59
70
  </form>
60
71
  `;
61
72
 
62
73
  export const TogglePositions = () => html`
63
- ${enhancementHeader('toggle')}
74
+ ${enhancementHeader("toggle")}
64
75
  <div class="toggle-story-layout">
65
76
  <div>
66
77
  <h3>Toggle Position Variations</h3>
@@ -68,30 +79,30 @@ export const TogglePositions = () => html`
68
79
  Toggle knob position adapts based on label placement in DOM
69
80
  </p>
70
81
  </div>
71
- <div class="flex flex-col gap-md">
82
+ <div class="stack-md">
72
83
  <section class="toggle-story-section">
73
84
  <h4 class="toggle-story-subheading">Label First (Knob on Right)</h4>
74
- <div class="flex flex-col gap-sm">
85
+ <div class="stack-sm">
75
86
  <label data-toggle>
76
87
  <span data-label>Email notifications</span>
77
- <input type="checkbox" checked>
88
+ <input type="checkbox" checked />
78
89
  </label>
79
90
  <label data-toggle>
80
91
  <span data-label>Push notifications</span>
81
- <input type="checkbox">
92
+ <input type="checkbox" />
82
93
  </label>
83
94
  </div>
84
95
  </section>
85
96
 
86
97
  <section class="toggle-story-section">
87
98
  <h4 class="toggle-story-subheading">Label Last (Knob on Left)</h4>
88
- <div class="flex flex-col gap-sm">
99
+ <div class="stack-sm">
89
100
  <label data-toggle>
90
- <input type="checkbox" checked>
101
+ <input type="checkbox" checked />
91
102
  <span data-label>Dark mode enabled</span>
92
103
  </label>
93
104
  <label data-toggle>
94
- <input type="checkbox">
105
+ <input type="checkbox" />
95
106
  <span data-label>Auto-save changes</span>
96
107
  </label>
97
108
  </div>
@@ -101,26 +112,24 @@ export const TogglePositions = () => html`
101
112
  `;
102
113
 
103
114
  export const InCard = () => html`
104
- ${enhancementHeader('toggle')}
105
- <article class="card toggle-story-card">
115
+ ${enhancementHeader("toggle")}
116
+ <article class="card toggle-story-card stack-md max-w-sm">
106
117
  <div>
107
118
  <h3>Privacy Settings</h3>
108
- <p class="toggle-story-muted">
109
- Control your privacy preferences
110
- </p>
119
+ <p class="toggle-story-muted">Control your privacy preferences</p>
111
120
  </div>
112
- <div class="flex flex-col gap-sm">
121
+ <div class="stack-sm">
113
122
  <label data-toggle>
123
+ <input type="checkbox" checked />
114
124
  <span data-label>Profile visibility</span>
115
- <input type="checkbox" checked>
116
125
  </label>
117
126
  <label data-toggle>
127
+ <input type="checkbox" />
118
128
  <span data-label>Show online status</span>
119
- <input type="checkbox">
120
129
  </label>
121
130
  <label data-toggle>
131
+ <input type="checkbox" checked />
122
132
  <span data-label>Allow message requests</span>
123
- <input type="checkbox" checked>
124
133
  </label>
125
134
  </div>
126
135
  </article>
@@ -25,8 +25,8 @@ export const enhancementHeader = (key, extraInfo = {}) => {
25
25
 
26
26
  return html`
27
27
  <header>
28
- <h2><code>${selector}</code></h2>
29
- <p class="text-muted" style="margin: 0;">${info.description} ${extraInfo.description || ''}</p>
28
+ <h2>${selector}</h2>
29
+ <p class="text-muted">${info.description} ${extraInfo.description || ''}</p>
30
30
  </header>
31
31
  `;
32
32
  };
@@ -177,26 +177,26 @@ const getFallbackTextColor = (color, shade) =>
177
177
 
178
178
  const colorScaleStoryStyles = html`
179
179
  <style>
180
- .color-scale-story-container {
180
+ .story-color-scale-story-container {
181
181
  padding: var(--spacing-8);
182
182
  }
183
- .color-scale-container {
183
+ .story-color-scale-container {
184
184
  margin-bottom: var(--spacing-8);
185
185
  }
186
- .color-scale-row {
186
+ .story-color-scale-row {
187
187
  display: flex;
188
188
  align-items: center;
189
189
  gap: var(--spacing-4);
190
190
  }
191
- .color-scale-label {
191
+ .story-color-scale-label {
192
192
  width: 7.5rem;
193
193
  font-weight: 600;
194
194
  }
195
- .color-scale-swatches {
195
+ .story-color-scale-swatches {
196
196
  display: flex;
197
197
  flex: 1;
198
198
  }
199
- .color-scale-swatch {
199
+ .story-color-scale-swatch {
200
200
  flex: 1;
201
201
  min-height: 3.75rem;
202
202
  padding: var(--spacing-4);
@@ -206,7 +206,7 @@ const colorScaleStoryStyles = html`
206
206
  position: relative;
207
207
  z-index: 1;
208
208
  }
209
- .color-scale-swatch--hover {
209
+ .story-color-scale-swatch--hover {
210
210
  transform: translateY(-0.25rem);
211
211
  z-index: 10;
212
212
  box-shadow: var(--shadow-md);
@@ -217,7 +217,7 @@ const colorScaleStoryStyles = html`
217
217
  .map((shade) => {
218
218
  const textColor = getFallbackTextColor(color, shade);
219
219
  return `
220
- .color-scale-swatch[data-color="${color}"][data-shade="${shade}"] {
220
+ .story-color-scale-swatch[data-color="${color}"][data-shade="${shade}"] {
221
221
  background: var(--color-${color}-${shade});
222
222
  color: ${textColor};
223
223
  }
@@ -238,14 +238,14 @@ const handleSwatchHoverLeave = (event) => {
238
238
  };
239
239
 
240
240
  const renderColorScale = (colorName) => html`
241
- <div class="color-scale-container">
242
- <div class="color-scale-row">
243
- <div class="color-scale-label">${colorName}</div>
244
- <div class="color-scale-swatches">
241
+ <div class="story-color-scale-container">
242
+ <div class="story-color-scale-row">
243
+ <div class="story-color-scale-label">${colorName}</div>
244
+ <div class="story-color-scale-swatches">
245
245
  ${colorShades.map(
246
246
  (shade) => html`
247
247
  <div
248
- class="color-scale-swatch"
248
+ class="story-color-scale-swatch"
249
249
  data-color=${colorName}
250
250
  data-shade=${shade}
251
251
  style=${`color: ${chooseReadableTextColor(colorName, shade, getFallbackTextColor(colorName, shade))}`}
@@ -52,7 +52,7 @@ export const Overview = {
52
52
  </article>
53
53
 
54
54
  <article class="card">
55
- <h2>Why <code>:where()</code>?</h2>
55
+ <h2>Why :where()?</h2>
56
56
  <p>
57
57
  All semantic element styles use the <code>:where()</code> pseudo-class, which has
58
58
  <strong>zero specificity</strong>. This means:
@@ -246,11 +246,11 @@ export const TextElements = {
246
246
 
247
247
  <article class="card">
248
248
  <h3><code>&lt;blockquote&gt;</code></h3>
249
- <p>Styled with a left border, subtle background, and optional citation.</p>
249
+ <p>Styled with a left border, elevated surface, and optional citation that matches the border color.</p>
250
250
 
251
251
  <blockquote>
252
- <p>The browser is the framework. Every line of JavaScript you write is technical debt against the platform itself.</p>
253
- <cite>Pure Web Manifesto</cite>
252
+ <p>The most important investment you can make is not in stocks, bonds, or real estate. The most important investment is in yourself—your skills, your knowledge, and your ability to adapt to changing market conditions. This has never been more relevant than in today's rapidly evolving financial landscape.</p>
253
+ <cite>Warren Buffett, CEO, Berkshire Hathaway</cite>
254
254
  </blockquote>
255
255
 
256
256
  <div class="code-blockquote"></div>