@pure-ds/core 0.5.11 → 0.5.12

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.
@@ -1,5 +1,5 @@
1
- export { nt as startLive };
2
- declare function nt(n: any, t: any, { emitReady: e, applyResolvedTheme: a, setupSystemListenerIfNeeded: r }: {
1
+ export { it as startLive };
2
+ declare function it(n: any, t: any, { emitReady: e, applyResolvedTheme: a, setupSystemListenerIfNeeded: r }: {
3
3
  emitReady: any;
4
4
  applyResolvedTheme: any;
5
5
  setupSystemListenerIfNeeded: any;
@@ -604,8 +604,8 @@ declare function nt(n: any, t: any, { emitReady: e, applyResolvedTheme: a, setup
604
604
  };
605
605
  "__#private@#l"(t: any): number;
606
606
  "__#private@#c"(t: any, e: any): number;
607
- "__#private@#m"(t: any, e?: number): string;
608
607
  "__#private@#h"(t: any, e?: number): string;
608
+ "__#private@#m"(t: any, e?: number): string;
609
609
  "__#private@#z"(t: any, e: any, a?: number): string;
610
610
  "__#private@#M"(t: any, e: any, a: any): string;
611
611
  "__#private@#F"(t: any): {
@@ -718,10 +718,10 @@ declare function nt(n: any, t: any, { emitReady: e, applyResolvedTheme: a, setup
718
718
  externalPath: any;
719
719
  };
720
720
  "__#private@#D"(t: any): string;
721
- "__#private@#N"(t: any): string;
722
721
  "__#private@#P"(t: any): string;
723
- "__#private@#I"(t: any): string;
722
+ "__#private@#N"(t: any): string;
724
723
  "__#private@#U"(t: any): string;
724
+ "__#private@#I"(t: any): string;
725
725
  "__#private@#O"(t: any): string;
726
726
  "__#private@#H"(t: any): string;
727
727
  "__#private@#q"(t: any): string;
@@ -748,8 +748,8 @@ declare function nt(n: any, t: any, { emitReady: e, applyResolvedTheme: a, setup
748
748
  "__#private@#pe"(): string;
749
749
  "__#private@#ue"(): string;
750
750
  "__#private@#ge"(): string;
751
- "__#private@#me"(): string;
752
751
  "__#private@#he"(): string;
752
+ "__#private@#me"(): string;
753
753
  "__#private@#o"(t: any): {
754
754
  h: number;
755
755
  s: number;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pure-ds/core",
3
3
  "shortname": "pds",
4
- "version": "0.5.11",
4
+ "version": "0.5.12",
5
5
  "description": "Pure Design System - Why develop a Design System when you can generate one?",
6
6
  "repository": {
7
7
  "type": "git",
@@ -71,7 +71,7 @@ function buildIndexHtml({ version, generatedAt }) {
71
71
 
72
72
  <body class="container">
73
73
  <header class="stack-sm">
74
- <p class="text-muted">Auto-generated by PDS ${version} at ${generatedAt}</p>
74
+ <p class="auto-gen">Auto-generated by PDS ${version} at ${generatedAt}</p>
75
75
  </header>
76
76
 
77
77
  <main></main>
@@ -90,20 +90,18 @@ function buildDevReloadJs() {
90
90
 
91
91
  if (shouldConnect) {
92
92
  const reloadPort = 4174;
93
- const endpoint =
94
- <h1>Welcome to your new App</h1>
95
- source.onmessage = (event) => {
96
- if (event.data === 'reload') {
97
- This <code>&lt;wc-home&gt;</code> Web Component is lazy-loaded and styled with Pure Design System.
98
- };
93
+ const endpoint = 'http://localhost:' + reloadPort + '/events';
94
+ const source = new EventSource(endpoint);
99
95
 
100
- source.onerror = () => {
101
- <a target="_blank" href="https://github.com/Pure-Web-Foundation/pure-ds/blob/main/packages/pds-storybook/stories/GettingStarted.md" class="btn btn-primary btn-lg">
102
- <pds-icon icon="rocket"></pds-icon> Get Started
103
- </a>
104
- <a target="_blank" href="https://puredesignsystem.z6.web.core.windows.net/storybook/" class="btn btn-secondary btn-lg">
105
- <pds-icon icon="book-open"></pds-icon> Storybook
106
- </a>
96
+ source.onmessage = (event) => {
97
+ if (event.data === 'reload') {
98
+ location.reload();
99
+ }
100
+ };
101
+
102
+ source.onerror = () => {
103
+ source.close();
104
+ };
107
105
  }
108
106
  `;
109
107
  }
@@ -113,52 +111,182 @@ function buildAppCss() {
113
111
  opacity: 0;
114
112
  }
115
113
 
116
- async function getPdsCoreVersion() {
117
- try {
118
- const pkgPath = path.join(projectRoot, 'node_modules', '@pure-ds', 'core', 'package.json');
119
- const raw = await readFile(pkgPath, 'utf8');
120
- const pkg = JSON.parse(raw);
121
- return pkg?.version || 'unknown';
122
- } catch {
123
- return 'unknown';
124
- }
114
+ main {
115
+ margin: auto;
125
116
  }
126
117
 
127
- main {
128
- margin-top: var(--spacing-8);
118
+ h1 {
119
+ background: linear-gradient(var(--gradient-angle, 135deg),
120
+ var(--color-primary-400),
121
+ var(--color-accent-400)
122
+ );
123
+ background-clip: text;
124
+ -webkit-background-clip: text;
125
+ color: transparent;
126
+ }
127
+
128
+ .container {
129
+ display: grid;
130
+ grid-template-rows: auto 1fr auto;
131
+ height: 100dvh;
132
+ padding: 0;
133
+ }
134
+
135
+ header, footer {
136
+ padding: var(--spacing-4);
137
+ }
138
+
139
+ footer {
140
+ text-align: center;
141
+ }
142
+
143
+ .auto-gen {
144
+ color: var(--color-text-muted);
145
+ font-size: var(--font-size-xs);
146
+ }
147
+
148
+ #settings-btn {
149
+ position: fixed;
150
+ top: var(--spacing-4);
151
+ right: var(--spacing-4);
152
+ }
153
+
154
+ .hero {
155
+ padding: var(--spacing-8);
156
+ zoom: 1.15;
157
+ text-align: center;
158
+ border: var(--border-width-medium) solid transparent;
159
+ background: linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
160
+ linear-gradient(var(--gradient-angle, 135deg), var(--color-primary-400), var(--color-accent-400)) border-box;
161
+ max-width: var(--max-w-lg);
162
+ border-radius: var(--radius-lg);
163
+ border-width: 3px;
164
+ }
165
+
166
+ .hero > div {
167
+ margin: var(--spacing-10) 0;
129
168
  }
130
169
  `;
131
170
  }
132
171
 
133
- function buildWcHome() {
134
- return `customElements.define(
135
- "wc-home",
172
+ function buildMyHome() {
173
+ return `/**
174
+ * @file my-home.js
175
+ * @description A simple home component for the app.
176
+ */
177
+ customElements.define(
178
+ "my-home",
136
179
  class extends HTMLElement {
137
180
  connectedCallback() {
138
181
  this.innerHTML = /*html*/ \`
139
- <article class="card text-center border-gradient surface-translucent-50">
140
- <header>
141
- <h1>Welcome to Pure Design System</h1>
142
- <h2 class="text-muted">Build on What Lasts</h2>
143
- </header>
144
- <div class="stack-lg">
182
+ <article class="hero">
183
+ <h1>Welcome to your new App</h1>
184
+ <div>
145
185
  <p>
146
- This is a demo of a web component using Pure Design System.
147
- It showcases the design tokens, components, and utilities provided by PDS.
186
+ This <code>&lt;my-home&gt;</code> Web Component is lazy-loaded and styled with Pure Design System.
187
+ </p>
188
+ <p>
189
+ You can start building your app by editing the files in <code>public/assets/my/</code> and <code>src/js/</code>.
148
190
  </p>
149
191
  </div>
150
- <nav class="flex justify-center gap-sm">
151
- <button class="btn-primary btn-lg" data-enhanced-btn-working="true">
152
- Get Started
153
- </button>
154
- <a href="https://pureweb.dev" class="btn btn-secondary btn-lg" data-enhanced-btn-working="true">
155
- Learn More
192
+ <nav>
193
+ <a target="_blank" href="https://github.com/Pure-Web-Foundation/pure-ds/blob/main/packages/pds-storybook/stories/GettingStarted.md" class="btn btn-primary btn-lg">
194
+ <pds-icon icon="rocket"></pds-icon> Get Started
195
+ </a>
196
+ <a target="_blank" href="https://puredesignsystem.z6.web.core.windows.net/storybook/" class="btn btn-secondary btn-lg">
197
+ <pds-icon icon="book-open"></pds-icon> Storybook
156
198
  </a>
157
199
  </nav>
158
200
  </article>
159
201
  \`;
160
202
  }
161
- }
203
+ },
204
+ );
205
+ `;
206
+ }
207
+
208
+ function buildMyTheme() {
209
+ return `/**
210
+ * my-theme Web Component - allows users to select the app theme (light, dark, system)
211
+ *
212
+ * Uses Pure Design System (PDS) for styling and theming.
213
+ */
214
+ customElements.define(
215
+ "my-theme",
216
+ class extends HTMLElement {
217
+ constructor() {
218
+ super();
219
+ this.attachShadow({ mode: "open" });
220
+ }
221
+
222
+ async connectedCallback() {
223
+ const componentStyles = PDS.createStylesheet(\`
224
+ :host {
225
+ display: block;
226
+ }
227
+ \`);
228
+
229
+ await PDS.adoptLayers(
230
+ this.shadowRoot,
231
+ ["tokens", "primitives", "components", "utilities"],
232
+ [componentStyles],
233
+ );
234
+
235
+ this.shadowRoot.innerHTML += /*html*/ \`
236
+ <form>
237
+ <fieldset role="radiogroup" aria-label="Theme" class="buttons">
238
+ <legend>Theme</legend>
239
+ <label>
240
+ <input type="radio" name="theme" value="system">
241
+ <span>
242
+ <pds-icon icon="moon-stars"></pds-icon>
243
+ System
244
+ </span>
245
+ </label>
246
+ <label>
247
+ <input type="radio" name="theme" value="light">
248
+ <span>
249
+ <pds-icon icon="sun"></pds-icon>
250
+ Light
251
+ </span>
252
+ </label>
253
+ <label>
254
+ <input type="radio" name="theme" value="dark">
255
+ <span>
256
+ <pds-icon icon="moon"></pds-icon>
257
+ Dark
258
+ </span>
259
+ </label>
260
+ </fieldset>
261
+ </form>\`;
262
+
263
+ this.#updateCheckedState();
264
+
265
+ this.shadowRoot.addEventListener("change", (e) => {
266
+ if (e.target.type === "radio" && e.target.name === "theme") {
267
+ PDS.setTheme(e.target.value, { persist: true });
268
+ PDS.toast(\`Theme changed to \${e.target.value}\`, { duration: 2000 });
269
+ }
270
+ });
271
+
272
+ const observer = new MutationObserver(() => {
273
+ this.#updateCheckedState();
274
+ });
275
+
276
+ observer.observe(document.documentElement, {
277
+ attributes: true,
278
+ attributeFilter: ["data-theme"],
279
+ });
280
+ }
281
+
282
+ #updateCheckedState() {
283
+ const currentTheme = PDS.theme || "system";
284
+ const radios = this.shadowRoot.querySelectorAll('input[type="radio"]');
285
+ radios.forEach((radio) => {
286
+ radio.checked = radio.value === currentTheme;
287
+ });
288
+ }
289
+ },
162
290
  );
163
291
  `;
164
292
  }
@@ -170,12 +298,73 @@ import { config } from '../../pds.config.js';
170
298
  await PDS.start(config);
171
299
  PDS.theme = 'light';
172
300
 
173
- await import('/assets/wc/wc-home.js');
174
-
175
301
  const main = document.querySelector('main');
176
- if (main && !main.querySelector('wc-home')) {
177
- main.innerHTML = '<wc-home></wc-home>';
302
+ if (main && !main.querySelector('my-home')) {
303
+ main.innerHTML = '<my-home></my-home>';
304
+ }
305
+
306
+ const settingsBtn = document.createElement('button');
307
+ settingsBtn.id = 'settings-btn';
308
+ settingsBtn.className = 'icon-only btn-xs btn-outline';
309
+ settingsBtn.setAttribute('aria-label', 'Settings');
310
+ settingsBtn.innerHTML = '<pds-icon icon="gear"></pds-icon>';
311
+ document.body.appendChild(settingsBtn);
312
+
313
+ const drawer = document.createElement('pds-drawer');
314
+ drawer.setAttribute('position', 'right');
315
+ drawer.innerHTML = `
316
+ <div slot="drawer-header">Settings</div>
317
+ <div slot="drawer-content">
318
+ <my-theme></my-theme>
319
+ </div>
320
+ `;
321
+ document.body.appendChild(drawer);
322
+
323
+ settingsBtn.addEventListener('click', () => {
324
+ drawer.open = true;
325
+ });
326
+ `;
178
327
  }
328
+
329
+ function buildPdsConfig() {
330
+ return `let defaultEnhancers = [];
331
+ if (typeof window !== "undefined") defaultEnhancers = PDS.defaultEnhancers;
332
+
333
+ export const config = {
334
+ mode: "static",
335
+ preset: "social-feed",
336
+
337
+ autoDefine: {
338
+ predefine: ["pds-icon", "pds-drawer", "pds-toaster"],
339
+
340
+ // Custom component paths
341
+ mapper: (tag) => {
342
+ if (tag.startsWith("my-")) return "/assets/my/\${tag}.js";
343
+
344
+ // Return nothing to use PDS default mapping
345
+ },
346
+
347
+ enhancers: [
348
+ ...defaultEnhancers,
349
+ {
350
+ selector: ".hero",
351
+ description: "Adds tooltip on hover",
352
+ run: (element) => {
353
+ let angle = 135;
354
+ const speed = 0.5;
355
+
356
+ function animate() {
357
+ angle = (angle + speed) % 360;
358
+ element.style.setProperty("--gradient-angle", \`\${angle}deg\`);
359
+ requestAnimationFrame(animate);
360
+ }
361
+
362
+ animate();
363
+ },
364
+ },
365
+ ],
366
+ },
367
+ };
179
368
  `;
180
369
  }
181
370
 
@@ -242,7 +431,7 @@ async function start() {
242
431
  format: 'esm',
243
432
  sourcemap: true,
244
433
  publicPath: '/assets/js',
245
- external: ['/assets/wc/*'],
434
+ external: ['/assets/my/*'],
246
435
  logLevel: 'info',
247
436
  plugins: [liveReloadPlugin()]
248
437
  });
@@ -322,7 +511,7 @@ const ctx = await esbuild.context({
322
511
  format: 'esm',
323
512
  sourcemap: true,
324
513
  publicPath: '/assets/js',
325
- external: ['/assets/wc/*'],
514
+ external: ['/assets/my/*'],
326
515
  logLevel: 'info',
327
516
  plugins: [liveReloadPlugin()]
328
517
  });
@@ -445,13 +634,18 @@ async function main() {
445
634
  );
446
635
  await writeFileIfMissing(path.join(projectRoot, 'public', 'assets', 'css', 'app.css'), buildAppCss());
447
636
  await writeFileIfMissing(path.join(projectRoot, 'src', 'js', 'app.js'), buildAppJs());
637
+ await writeFileIfMissing(path.join(projectRoot, 'pds.config.js'), buildPdsConfig());
448
638
  await writeFileIfMissing(
449
639
  path.join(projectRoot, 'public', 'assets', 'js', 'dev-reload.js'),
450
640
  buildDevReloadJs()
451
641
  );
452
642
  await writeFileIfMissing(
453
- path.join(projectRoot, 'public', 'assets', 'wc', 'wc-home.js'),
454
- buildWcHome()
643
+ path.join(projectRoot, 'public', 'assets', 'my', 'my-home.js'),
644
+ buildMyHome()
645
+ );
646
+ await writeFileIfMissing(
647
+ path.join(projectRoot, 'public', 'assets', 'my', 'my-theme.js'),
648
+ buildMyTheme()
455
649
  );
456
650
 
457
651
  const esbuildDevPath = path.join(projectRoot, 'esbuild-dev.js');