@pure-ds/core 0.6.10 → 0.7.1

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 (132) hide show
  1. package/.github/copilot-instructions.md +6 -1
  2. package/custom-elements.json +803 -16
  3. package/dist/types/pds.d.ts +1 -0
  4. package/dist/types/public/assets/js/pds-ask.d.ts +2 -0
  5. package/dist/types/public/assets/js/pds-ask.d.ts.map +1 -0
  6. package/dist/types/public/assets/js/pds-auto-definer.d.ts +14 -0
  7. package/dist/types/public/assets/js/pds-auto-definer.d.ts.map +1 -0
  8. package/dist/types/public/assets/js/pds-autocomplete.d.ts +79 -0
  9. package/dist/types/public/assets/js/pds-autocomplete.d.ts.map +1 -0
  10. package/dist/types/public/assets/js/pds-enhancers.d.ts +7 -0
  11. package/dist/types/public/assets/js/pds-enhancers.d.ts.map +1 -0
  12. package/dist/types/public/assets/js/pds-manager.d.ts +98 -1
  13. package/dist/types/public/assets/js/pds-manager.d.ts.map +1 -1
  14. package/dist/types/public/assets/js/pds-toast.d.ts +8 -0
  15. package/dist/types/public/assets/js/pds-toast.d.ts.map +1 -0
  16. package/dist/types/public/assets/js/pds.d.ts.map +1 -1
  17. package/dist/types/public/assets/pds/components/pds-drawer.d.ts +1 -143
  18. package/dist/types/public/assets/pds/components/pds-drawer.d.ts.map +1 -1
  19. package/dist/types/public/assets/pds/components/pds-form.d.ts.map +1 -1
  20. package/dist/types/public/assets/pds/components/pds-icon.d.ts.map +1 -1
  21. package/dist/types/public/assets/pds/components/pds-live-converter.d.ts +8 -0
  22. package/dist/types/public/assets/pds/components/pds-live-converter.d.ts.map +1 -0
  23. package/dist/types/public/assets/pds/components/pds-live-importer.d.ts +2 -0
  24. package/dist/types/public/assets/pds/components/pds-live-importer.d.ts.map +1 -0
  25. package/dist/types/public/assets/pds/components/pds-live-template-canvas.d.ts +2 -0
  26. package/dist/types/public/assets/pds/components/pds-live-template-canvas.d.ts.map +1 -0
  27. package/dist/types/public/assets/pds/components/pds-omnibox.d.ts.map +1 -1
  28. package/dist/types/public/assets/pds/components/pds-richtext.d.ts.map +1 -1
  29. package/dist/types/public/assets/pds/components/pds-scrollrow.d.ts +1 -63
  30. package/dist/types/public/assets/pds/components/pds-scrollrow.d.ts.map +1 -1
  31. package/dist/types/public/assets/pds/components/pds-splitpanel.d.ts +1 -89
  32. package/dist/types/public/assets/pds/components/pds-splitpanel.d.ts.map +1 -1
  33. package/dist/types/public/assets/pds/components/pds-theme.d.ts +1 -22
  34. package/dist/types/public/assets/pds/components/pds-theme.d.ts.map +1 -1
  35. package/dist/types/public/assets/pds/components/pds-toaster.d.ts +1 -1
  36. package/dist/types/public/assets/pds/components/pds-toaster.d.ts.map +1 -1
  37. package/dist/types/public/assets/pds/components/pds-treeview.d.ts +37 -0
  38. package/dist/types/public/assets/pds/components/pds-treeview.d.ts.map +1 -0
  39. package/dist/types/public/assets/pds/components/pds-upload.d.ts.map +1 -1
  40. package/dist/types/src/js/common/ask.d.ts.map +1 -1
  41. package/dist/types/src/js/common/toast.d.ts +8 -0
  42. package/dist/types/src/js/common/toast.d.ts.map +1 -1
  43. package/dist/types/src/js/pds-ask.d.ts +2 -0
  44. package/dist/types/src/js/pds-ask.d.ts.map +1 -0
  45. package/dist/types/src/js/pds-auto-definer.d.ts +2 -0
  46. package/dist/types/src/js/pds-auto-definer.d.ts.map +1 -0
  47. package/dist/types/src/js/pds-autocomplete.d.ts +2 -0
  48. package/dist/types/src/js/pds-autocomplete.d.ts.map +1 -0
  49. package/dist/types/src/js/pds-core/pds-enhancers.d.ts.map +1 -1
  50. package/dist/types/src/js/pds-core/pds-generator.d.ts.map +1 -1
  51. package/dist/types/src/js/pds-core/pds-live.d.ts +2 -1
  52. package/dist/types/src/js/pds-core/pds-live.d.ts.map +1 -1
  53. package/dist/types/src/js/pds-core/pds-start-helpers.d.ts.map +1 -1
  54. package/dist/types/src/js/pds-enhancers.d.ts +2 -0
  55. package/dist/types/src/js/pds-enhancers.d.ts.map +1 -0
  56. package/dist/types/src/js/pds-live-manager/conversion-service.d.ts +66 -0
  57. package/dist/types/src/js/pds-live-manager/conversion-service.d.ts.map +1 -0
  58. package/dist/types/src/js/pds-live-manager/import-contract.d.ts +15 -0
  59. package/dist/types/src/js/pds-live-manager/import-contract.d.ts.map +1 -0
  60. package/dist/types/src/js/pds-live-manager/import-history-service.d.ts +32 -0
  61. package/dist/types/src/js/pds-live-manager/import-history-service.d.ts.map +1 -0
  62. package/dist/types/src/js/pds-live-manager/import-service.d.ts +21 -0
  63. package/dist/types/src/js/pds-live-manager/import-service.d.ts.map +1 -0
  64. package/dist/types/src/js/pds-live-manager/template-service.d.ts +17 -0
  65. package/dist/types/src/js/pds-live-manager/template-service.d.ts.map +1 -0
  66. package/dist/types/src/js/pds-manager.d.ts +4 -0
  67. package/dist/types/src/js/pds-toast.d.ts +2 -0
  68. package/dist/types/src/js/pds-toast.d.ts.map +1 -0
  69. package/dist/types/src/js/pds.d.ts.map +1 -1
  70. package/package.json +11 -5
  71. package/packages/pds-cli/README.md +60 -0
  72. package/packages/pds-cli/bin/pds-import.js +176 -0
  73. package/packages/pds-cli/bin/pds-static.js +27 -1
  74. package/packages/pds-cli/bin/postinstall.mjs +17 -8
  75. package/packages/pds-cli/bin/templates/bootstrap/pds.config.js +1 -5
  76. package/packages/pds-cli/bin/templates/bootstrap/public/index.html +2 -1
  77. package/packages/pds-cli/bin/templates/starter-templates.js +1 -3
  78. package/public/assets/js/app.js +9 -163
  79. package/public/assets/js/pds-ask.js +25 -0
  80. package/public/assets/js/pds-auto-definer.js +1 -0
  81. package/public/assets/js/pds-autocomplete.js +7 -0
  82. package/public/assets/js/pds-enhancers.js +1 -0
  83. package/public/assets/js/pds-manager.js +370 -267
  84. package/public/assets/js/pds-toast.js +1 -0
  85. package/public/assets/js/pds.js +2 -32
  86. package/public/assets/pds/components/pds-calendar.js +2 -2
  87. package/public/assets/pds/components/pds-drawer.js +1 -1
  88. package/public/assets/pds/components/pds-form.js +7 -6
  89. package/public/assets/pds/components/pds-icon.js +12 -9
  90. package/public/assets/pds/components/pds-live-converter.js +47 -0
  91. package/public/assets/pds/components/pds-live-edit.js +758 -44
  92. package/public/assets/pds/components/pds-live-importer.js +773 -0
  93. package/public/assets/pds/components/pds-live-template-canvas.js +172 -0
  94. package/public/assets/pds/components/pds-omnibox.js +147 -3
  95. package/public/assets/pds/components/pds-richtext.js +2 -0
  96. package/public/assets/pds/components/pds-scrollrow.js +61 -2
  97. package/public/assets/pds/components/pds-splitpanel.js +3 -1
  98. package/public/assets/pds/components/pds-theme.js +2 -0
  99. package/public/assets/pds/components/pds-toaster.js +52 -5
  100. package/public/assets/pds/components/pds-treeview.js +974 -0
  101. package/public/assets/pds/components/pds-upload.js +2 -0
  102. package/public/assets/pds/core/pds-ask.js +25 -0
  103. package/public/assets/pds/core/pds-auto-definer.js +1 -0
  104. package/public/assets/pds/core/pds-autocomplete.js +7 -0
  105. package/public/assets/pds/core/pds-enhancers.js +1 -0
  106. package/public/assets/pds/core/pds-manager.js +3646 -0
  107. package/public/assets/pds/core/pds-toast.js +1 -0
  108. package/public/assets/pds/core.js +2 -0
  109. package/public/assets/pds/custom-elements.json +803 -16
  110. package/public/assets/pds/pds-css-complete.json +7 -2
  111. package/public/assets/pds/templates/commerce-scroll-explorer.html +115 -0
  112. package/public/assets/pds/templates/content-brand-showcase.html +110 -0
  113. package/public/assets/pds/templates/feedback-ops-dashboard.html +91 -0
  114. package/public/assets/pds/templates/release-readiness-radar.html +69 -0
  115. package/public/assets/pds/templates/support-command-center.html +92 -0
  116. package/public/assets/pds/templates/templates.json +53 -0
  117. package/public/assets/pds/templates/workspace-settings-lab.html +131 -0
  118. package/public/assets/pds/vscode-custom-data.json +54 -4
  119. package/readme.md +38 -1
  120. package/src/js/pds-core/pds-config.js +9 -9
  121. package/src/js/pds-core/pds-enhancers.js +146 -0
  122. package/src/js/pds-core/pds-generator.js +170 -29
  123. package/src/js/pds-core/pds-live.js +456 -13
  124. package/src/js/pds-core/pds-start-helpers.js +5 -1
  125. package/src/js/pds-live-manager/conversion-service.js +3135 -0
  126. package/src/js/pds-live-manager/import-contract.js +57 -0
  127. package/src/js/pds-live-manager/import-history-service.js +145 -0
  128. package/src/js/pds-live-manager/import-service.js +255 -0
  129. package/src/js/pds-live-manager/tailwind-conversion-rules.json +383 -0
  130. package/src/js/pds-live-manager/template-service.js +170 -0
  131. package/src/js/pds.d.ts +1 -0
  132. package/src/js/pds.js +192 -12
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { mkdir, readFile, writeFile } from 'fs/promises';
4
+ import path from 'path';
5
+ import { fileURLToPath, pathToFileURL } from 'url';
6
+ import { runLiveImport, listLiveTemplates, getLiveImportSources } from '../../../src/js/pds-live-manager/import-service.js';
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ function help() {
12
+ console.log(`pds-import — Import and convert external design inputs for PDS
13
+
14
+ Usage:
15
+ pds-import --type tailwind-html --mode convert-only --source ./input.html --out ./pds-import.json
16
+ pds-import --type tailwind-html --mode adopt-design-and-convert --source ./input.html --out ./pds-import.json
17
+ pds-import --type brand-guidelines --mode adopt-design-and-convert --source ./brand.txt --out ./brand-import.json
18
+ pds-import --type template --template marketing-hero --out ./template-import.json
19
+
20
+ Options:
21
+ --type <value> Import type: tailwind-html | brand-guidelines | template
22
+ --mode <value> Import mode: convert-only | adopt-design-and-convert
23
+ --source <path> Source file path for tailwind-html or brand-guidelines
24
+ --text <value> Inline input text instead of source file
25
+ --template <id> Template id when --type=template
26
+ --config <path> Optional PDS config file (.json/.js/.mjs) to govern conversion rules
27
+ --describe-rules Print Tailwind→PDS conversion rulebook and exit
28
+ --out <path> Output JSON file path (required)
29
+ --html-out <path> Optional output path for converted template HTML (if present)
30
+ --design-out <path> Optional output path for design patch JSON (if present)
31
+ --list List available sources and templates
32
+ --help Show this help message
33
+ `);
34
+ }
35
+
36
+ function normalizeImportMode(value) {
37
+ const raw = String(value || '').trim().toLowerCase();
38
+ if (raw === 'adopt-design-and-convert') return raw;
39
+ return 'convert-only';
40
+ }
41
+
42
+ async function writeTextOutput(absPath, contents) {
43
+ await mkdir(path.dirname(absPath), { recursive: true });
44
+ await writeFile(absPath, contents, 'utf8');
45
+ }
46
+
47
+ function parseArgs(argv) {
48
+ const args = { _: [] };
49
+ for (let i = 2; i < argv.length; i += 1) {
50
+ const current = argv[i];
51
+ if (current.startsWith('--')) {
52
+ const key = current.slice(2);
53
+ const next = argv[i + 1];
54
+ if (!next || next.startsWith('--')) {
55
+ args[key] = true;
56
+ } else {
57
+ args[key] = next;
58
+ i += 1;
59
+ }
60
+ } else {
61
+ args._.push(current);
62
+ }
63
+ }
64
+ return args;
65
+ }
66
+
67
+ async function loadInput(args) {
68
+ if (typeof args.text === 'string') return args.text;
69
+ if (typeof args.source === 'string') {
70
+ const sourcePath = path.resolve(process.cwd(), args.source);
71
+ return readFile(sourcePath, 'utf8');
72
+ }
73
+ return '';
74
+ }
75
+
76
+ async function loadConfig(args) {
77
+ if (typeof args.config !== 'string' || !args.config.trim()) return null;
78
+
79
+ const configPath = path.resolve(process.cwd(), args.config);
80
+ const ext = path.extname(configPath).toLowerCase();
81
+
82
+ if (ext === '.json') {
83
+ const raw = await readFile(configPath, 'utf8');
84
+ return JSON.parse(raw);
85
+ }
86
+
87
+ if (ext === '.js' || ext === '.mjs' || ext === '.cjs') {
88
+ const mod = await import(pathToFileURL(configPath).href);
89
+ return mod?.config || mod?.default || null;
90
+ }
91
+
92
+ throw new Error('Unsupported --config format. Use .json, .js, .mjs, or .cjs');
93
+ }
94
+
95
+ async function main() {
96
+ const args = parseArgs(process.argv);
97
+
98
+ if (args.help) {
99
+ help();
100
+ return;
101
+ }
102
+
103
+ if (args.list) {
104
+ console.log('Sources:');
105
+ getLiveImportSources().forEach((source) => {
106
+ console.log(`- ${source.id}: ${source.name}`);
107
+ });
108
+ console.log('Templates:');
109
+ (await listLiveTemplates()).forEach((template) => {
110
+ console.log(`- ${template.id}: ${template.name} [${template.icon || 'layout'}]`);
111
+ if (template.description) {
112
+ console.log(` ${template.description}`);
113
+ }
114
+ });
115
+ return;
116
+ }
117
+
118
+ if (args['describe-rules']) {
119
+ const rulesPath = path.resolve(__dirname, '../../../src/js/pds-live-manager/tailwind-conversion-rules.json');
120
+ const rulesJson = await readFile(rulesPath, 'utf8');
121
+ console.log(rulesJson);
122
+ return;
123
+ }
124
+
125
+ const type = String(args.type || '').trim();
126
+ const outPath = String(args.out || '').trim();
127
+ const mode = normalizeImportMode(args.mode);
128
+
129
+ if (!type || !outPath) {
130
+ console.error('❌ Missing required arguments --type and --out');
131
+ help();
132
+ process.exitCode = 2;
133
+ return;
134
+ }
135
+
136
+ const request = {
137
+ sourceType: type,
138
+ importMode: mode,
139
+ templateId: args.template,
140
+ input: await loadInput(args),
141
+ config: await loadConfig(args),
142
+ cwd: process.cwd(),
143
+ caller: path.relative(process.cwd(), __dirname),
144
+ };
145
+
146
+ const result = await runLiveImport(request);
147
+ const absOutPath = path.resolve(process.cwd(), outPath);
148
+
149
+ await writeTextOutput(absOutPath, JSON.stringify(result, null, 2) + '\n');
150
+ console.log(`✅ Wrote import result to ${absOutPath}`);
151
+
152
+ if (typeof args['html-out'] === 'string' && String(args['html-out']).trim()) {
153
+ const html = String(result?.template?.html || '');
154
+ const absHtmlOutPath = path.resolve(process.cwd(), String(args['html-out']).trim());
155
+ await writeTextOutput(absHtmlOutPath, html);
156
+ console.log(`✅ Wrote converted HTML to ${absHtmlOutPath}`);
157
+ }
158
+
159
+ if (typeof args['design-out'] === 'string' && String(args['design-out']).trim()) {
160
+ const designPatch = result?.designPatch && typeof result.designPatch === 'object'
161
+ ? result.designPatch
162
+ : {};
163
+ const absDesignOutPath = path.resolve(process.cwd(), String(args['design-out']).trim());
164
+ await writeTextOutput(absDesignOutPath, JSON.stringify(designPatch, null, 2) + '\n');
165
+ console.log(`✅ Wrote design patch to ${absDesignOutPath}`);
166
+ }
167
+
168
+ const issueCount = Array.isArray(result?.issues) ? result.issues.length : 0;
169
+ const validationBlocked = Boolean(result?.meta?.validationBlocked || result?.meta?.validation?.ok === false);
170
+ console.log(`ℹ️ mode=${mode} confidence=${Math.round((result?.confidence || 0) * 100)}% issues=${issueCount} blocked=${validationBlocked}`);
171
+ }
172
+
173
+ main().catch((error) => {
174
+ console.error('❌ pds-import failed:', error?.message || error);
175
+ process.exit(1);
176
+ });
@@ -349,7 +349,7 @@ async function loadConsumerConfig() {
349
349
  if (/PDS is not defined/i.test(msg)) {
350
350
  log('❌ Failed to evaluate pds.config.js: PDS is not defined', 'red');
351
351
  log(' This usually means your config references the browser global "PDS".', 'yellow');
352
- log(' The static exporter runs in Node, so please import presets instead of using window.PDS.', 'yellow');
352
+ log(' The static exporter runs in Node, so please import presets instead of using a browser global PDS object.', 'yellow');
353
353
  log(' Example fix for pds.config.js:', 'yellow');
354
354
  log(" import { presets } from 'pure-ds/src/js/pds-core/pds-config.js'", 'blue');
355
355
  log(' export const config = { ...presets.default, static: { root: "public/assets/pds/" } }', 'blue');
@@ -433,6 +433,17 @@ async function main(options = {}) {
433
433
 
434
434
  // 4b) Copy live manager bundle into target/core for dynamic import fallback
435
435
  try {
436
+ const coreEntrySourceNew = path.join(repoRoot, 'public/assets/pds/core.js');
437
+ const coreEntrySourceLegacy = path.join(repoRoot, 'public/assets/js/pds.js');
438
+ const coreEntrySource = existsSync(coreEntrySourceNew) ? coreEntrySourceNew : coreEntrySourceLegacy;
439
+ if (!existsSync(coreEntrySource)) {
440
+ log('⚠️ core.js not found in package assets; skipping copy', 'yellow');
441
+ } else {
442
+ const coreEntryTarget = path.join(targetDir, 'core.js');
443
+ await copyFile(coreEntrySource, coreEntryTarget);
444
+ log(`✅ Copied core runtime entry → ${path.relative(process.cwd(), coreEntryTarget)}`, 'green');
445
+ }
446
+
436
447
  const managerSource = path.join(repoRoot, 'public/assets/js/pds-manager.js');
437
448
  if (!existsSync(managerSource)) {
438
449
  log('⚠️ pds-manager.js not found in package assets; skipping copy', 'yellow');
@@ -466,6 +477,21 @@ async function main(options = {}) {
466
477
  log(`⚠️ Failed to copy lit.js: ${e?.message || e}`, 'yellow');
467
478
  }
468
479
 
480
+ // 4d) Copy template catalog and HTML files into target/templates
481
+ try {
482
+ const templateSource = path.join(repoRoot, 'public', 'assets', 'pds', 'templates');
483
+ if (!existsSync(templateSource)) {
484
+ log('⚠️ No templates source found; skipping templates copy', 'yellow');
485
+ } else {
486
+ const templatesDir = path.join(targetDir, 'templates');
487
+ await mkdir(templatesDir, { recursive: true });
488
+ await copyDirectory(templateSource, templatesDir);
489
+ log(`✅ Copied templates → ${path.relative(process.cwd(), templatesDir)}`, 'green');
490
+ }
491
+ } catch (e) {
492
+ log(`⚠️ Failed to copy templates: ${e?.message || e}`, 'yellow');
493
+ }
494
+
469
495
  // 5) Generate CSS layers into target/styles
470
496
  log('🧬 Generating styles...', 'bold');
471
497
  const { Generator } = await loadGenerator();
@@ -121,18 +121,27 @@ async function ensureBuildScript(consumerRoot) {
121
121
 
122
122
  consumerPkg.scripts = consumerPkg.scripts || {};
123
123
 
124
- const desiredScriptName = 'pds:build';
125
- const desiredScriptCmd = 'pds-build';
124
+ const requiredScripts = {
125
+ 'pds:build': 'pds-build',
126
+ 'pds:import': 'pds-import',
127
+ };
128
+
129
+ let changed = false;
130
+ for (const [scriptName, scriptCommand] of Object.entries(requiredScripts)) {
131
+ if (!consumerPkg.scripts[scriptName]) {
132
+ consumerPkg.scripts[scriptName] = scriptCommand;
133
+ console.log(`🧩 Added "${scriptName}" script to consumer package.json`);
134
+ changed = true;
135
+ } else {
136
+ console.log(`🔧 Script "${scriptName}" already present in consumer package.json`);
137
+ }
138
+ }
126
139
 
127
- if (!consumerPkg.scripts[desiredScriptName]) {
128
- consumerPkg.scripts[desiredScriptName] = desiredScriptCmd;
140
+ if (changed) {
129
141
  await writeFile(consumerPkgPath, JSON.stringify(consumerPkg, null, 2) + '\n');
130
- console.log(`🧩 Added "${desiredScriptName}" script to consumer package.json`);
131
- } else {
132
- console.log(`🔧 Script "${desiredScriptName}" already present in consumer package.json`);
133
142
  }
134
143
  } catch (e) {
135
- console.warn('⚠️ Could not ensure pds:build script in consumer package.json:', e.message);
144
+ console.warn('⚠️ Could not ensure PDS scripts in consumer package.json:', e.message);
136
145
  }
137
146
  }
138
147
 
@@ -2,11 +2,7 @@
2
2
 
3
3
  /** @typedef {import("@pure-ds/core").PDSInitConfig} PDSInitConfig */
4
4
 
5
- const pdsGlobal = globalThis.PDS;
6
-
7
- const standardPDSEnhancers = Array.isArray(pdsGlobal?.defaultEnhancers)
8
- ? pdsGlobal.defaultEnhancers
9
- : [];
5
+ const standardPDSEnhancers = [];
10
6
 
11
7
  /** @type {PDSInitConfig} */
12
8
  export const config = {
@@ -8,10 +8,11 @@
8
8
  <!-- PDS Styles -->
9
9
  <link rel="stylesheet" href="/assets/css/app.css" />
10
10
 
11
- <!-- Import Map for Lit components -->
11
+ <!-- Import map for PDS runtime (#pds) and Lit bridge (#pds/lit) -->
12
12
  <script type="importmap">
13
13
  {
14
14
  "imports": {
15
+ "#pds": "/assets/pds/core.js",
15
16
  "#pds/lit": "/assets/pds/external/lit.js"
16
17
  }
17
18
  }
@@ -1,7 +1,5 @@
1
1
  export function buildStarterPdsConfig() {
2
- return `const defaultEnhancers = Array.isArray(globalThis.PDS?.defaultEnhancers)
3
- ? globalThis.PDS.defaultEnhancers
4
- : [];
2
+ return `const defaultEnhancers = [];
5
3
 
6
4
  export const config = {
7
5
  mode: "static",