@nordmanai/nif 0.1.0 → 0.2.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.
- package/README.md +18 -0
- package/bin/nif.mjs +196 -0
- package/dist/index.d.ts +30 -1
- package/dist/index.js +9661 -2499
- package/dist/styles.css +1 -1
- package/dist/tokens.css +4 -1
- package/dist/ui/components/nm-ai/nm-ai.d.ts +7 -7
- package/dist/ui/components/nm-brand-logo/nm-brand-logo.d.ts +10 -0
- package/dist/ui/components/nm-breadcrumb/nm-breadcrumb.d.ts +11 -0
- package/dist/ui/components/nm-button/nm-button.d.ts +2 -0
- package/dist/ui/components/nm-button-group/nm-button-group.d.ts +17 -0
- package/dist/ui/components/nm-calendar/nm-calendar.d.ts +3 -0
- package/dist/ui/components/nm-card/nm-card.d.ts +34 -0
- package/dist/ui/components/nm-chip/nm-chip.d.ts +38 -0
- package/dist/ui/components/nm-code-block/nm-code-block.d.ts +55 -0
- package/dist/ui/components/nm-color-picker/nm-color-picker.d.ts +15 -0
- package/dist/ui/components/nm-combobox/nm-combobox.d.ts +26 -0
- package/dist/ui/components/nm-command/nm-command.d.ts +37 -0
- package/dist/ui/components/nm-composer/nm-composer.d.ts +4 -0
- package/dist/ui/components/nm-context-menu/nm-context-menu.d.ts +9 -0
- package/dist/ui/components/nm-date-picker/nm-date-picker.d.ts +35 -0
- package/dist/ui/components/nm-dialog/nm-dialog.d.ts +13 -0
- package/dist/ui/components/nm-field/nm-field.d.ts +2 -0
- package/dist/ui/components/nm-form-field/nm-form-field.d.ts +18 -0
- package/dist/ui/components/nm-gallery/nm-gallery.d.ts +8 -0
- package/dist/ui/components/nm-input/nm-input.d.ts +5 -0
- package/dist/ui/components/nm-input-group/nm-input-group.d.ts +9 -0
- package/dist/ui/components/nm-label/nm-label.d.ts +2 -0
- package/dist/ui/components/nm-menubar/nm-menubar.d.ts +9 -0
- package/dist/ui/components/nm-native-select/nm-native-select.d.ts +5 -0
- package/dist/ui/components/nm-panel/nm-panel.d.ts +14 -0
- package/dist/ui/components/nm-prose/nm-prose.d.ts +6 -0
- package/dist/ui/components/nm-resize-handle/nm-resize-handle.d.ts +18 -0
- package/dist/ui/components/nm-select/nm-select.d.ts +22 -0
- package/dist/ui/components/nm-side-panel/nm-side-panel.d.ts +33 -0
- package/dist/ui/components/nm-slider/nm-slider.d.ts +5 -1
- package/dist/ui/components/nm-status-bar/nm-status-bar.d.ts +8 -0
- package/dist/ui/components/nm-table/nm-table.d.ts +38 -0
- package/dist/ui/components/nm-textarea/nm-textarea.d.ts +2 -0
- package/dist/ui/components/nm-toolbar/nm-toolbar.d.ts +21 -0
- package/dist/ui/config/nm-ai.d.ts +0 -3
- package/dist/ui/config/nm-appearance.d.ts +36 -1
- package/dist/ui/config/nm-button.d.ts +2 -1
- package/dist/ui/config/nm-composer.d.ts +1 -2
- package/dist/ui/config/nm-field.d.ts +2 -0
- package/dist/ui/config/nm-icons.d.ts +13 -1
- package/dist/ui/config/nm-radius.d.ts +4 -4
- package/dist/ui/config/nm-side-panel.d.ts +33 -0
- package/dist/ui/lib/appearance/appearanceState.d.ts +1 -0
- package/dist/ui/lib/appearance/deriveTokens.d.ts +2 -0
- package/package.json +12 -4
- package/registry/index.json +1634 -0
- package/registry/tokens.css +72 -0
- package/registry/ui/components/nm-ai/nm-ai.css +358 -0
- package/registry/ui/components/nm-ai/nm-ai.tsx +632 -0
- package/registry/ui/components/nm-app-panel/nm-app-panel.css +169 -0
- package/registry/ui/components/nm-ask/nm-ask.css +277 -0
- package/registry/ui/components/nm-avatar/nm-avatar.css +85 -0
- package/registry/ui/components/nm-avatar/nm-avatar.tsx +30 -0
- package/registry/ui/components/nm-bar-overflow/nm-bar-overflow.css +43 -0
- package/registry/ui/components/nm-bar-overflow/nm-bar-overflow.tsx +61 -0
- package/registry/ui/components/nm-bar-overflow/use-bar-overflow.ts +92 -0
- package/registry/ui/components/nm-brand-logo/nm-brand-logo.css +20 -0
- package/registry/ui/components/nm-brand-logo/nm-brand-logo.tsx +21 -0
- package/registry/ui/components/nm-breadcrumb/nm-breadcrumb.css +57 -0
- package/registry/ui/components/nm-breadcrumb/nm-breadcrumb.tsx +42 -0
- package/registry/ui/components/nm-button/nm-button.css +110 -0
- package/registry/ui/components/nm-button/nm-button.tsx +58 -0
- package/registry/ui/components/nm-button-group/nm-button-group.css +87 -0
- package/registry/ui/components/nm-button-group/nm-button-group.tsx +32 -0
- package/registry/ui/components/nm-calendar/nm-calendar.css +178 -0
- package/registry/ui/components/nm-calendar/nm-calendar.tsx +43 -0
- package/registry/ui/components/nm-card/nm-card.css +130 -0
- package/registry/ui/components/nm-card/nm-card.tsx +83 -0
- package/registry/ui/components/nm-chatbox/nm-chatbox-icon.tsx +39 -0
- package/registry/ui/components/nm-chatbox/nm-chatbox.css +682 -0
- package/registry/ui/components/nm-chatbox/nm-chatbox.tsx +101 -0
- package/registry/ui/components/nm-checkbox/nm-checkbox.css +61 -0
- package/registry/ui/components/nm-checkbox/nm-checkbox.tsx +14 -0
- package/registry/ui/components/nm-chip/nm-chip.css +112 -0
- package/registry/ui/components/nm-chip/nm-chip.tsx +86 -0
- package/registry/ui/components/nm-code-block/nm-code-block.css +240 -0
- package/registry/ui/components/nm-code-block/nm-code-block.tsx +196 -0
- package/registry/ui/components/nm-collection/nm-collection-bar.tsx +65 -0
- package/registry/ui/components/nm-collection/nm-collection-grid.tsx +69 -0
- package/registry/ui/components/nm-collection/nm-collection-query.tsx +99 -0
- package/registry/ui/components/nm-collection/nm-collection-row-menu.tsx +55 -0
- package/registry/ui/components/nm-collection/nm-collection-table.tsx +99 -0
- package/registry/ui/components/nm-collection/nm-collection-tile-actions.tsx +50 -0
- package/registry/ui/components/nm-collection/nm-collection-title.tsx +25 -0
- package/registry/ui/components/nm-collection/nm-collection.css +353 -0
- package/registry/ui/components/nm-collection/use-collection-scroll-reveal.ts +38 -0
- package/registry/ui/components/nm-color-picker/nm-color-picker.css +67 -0
- package/registry/ui/components/nm-color-picker/nm-color-picker.tsx +79 -0
- package/registry/ui/components/nm-combobox/nm-combobox.css +72 -0
- package/registry/ui/components/nm-combobox/nm-combobox.tsx +80 -0
- package/registry/ui/components/nm-command/nm-command.css +190 -0
- package/registry/ui/components/nm-command/nm-command.tsx +125 -0
- package/registry/ui/components/nm-composer/nm-composer.css +178 -0
- package/registry/ui/components/nm-composer/nm-composer.tsx +151 -0
- package/registry/ui/components/nm-context-menu/nm-context-menu.tsx +25 -0
- package/registry/ui/components/nm-date-picker/nm-date-picker.css +140 -0
- package/registry/ui/components/nm-date-picker/nm-date-picker.tsx +153 -0
- package/registry/ui/components/nm-dialog/nm-dialog.css +84 -0
- package/registry/ui/components/nm-dialog/nm-dialog.tsx +40 -0
- package/registry/ui/components/nm-dropdown/nm-dropdown-item.ts +68 -0
- package/registry/ui/components/nm-dropdown/nm-dropdown-options.tsx +242 -0
- package/registry/ui/components/nm-dropdown/nm-dropdown-panel.tsx +171 -0
- package/registry/ui/components/nm-dropdown/nm-dropdown-placement.ts +157 -0
- package/registry/ui/components/nm-dropdown/nm-dropdown.css +312 -0
- package/registry/ui/components/nm-dropdown/nm-dropdown.tsx +412 -0
- package/registry/ui/components/nm-dropdown-menu/nm-dropdown-menu.css +145 -0
- package/registry/ui/components/nm-dropdown-menu/nm-dropdown-menu.tsx +118 -0
- package/registry/ui/components/nm-field/nm-field.css +356 -0
- package/registry/ui/components/nm-field/nm-field.tsx +355 -0
- package/registry/ui/components/nm-form-field/nm-form-field.css +103 -0
- package/registry/ui/components/nm-form-field/nm-form-field.tsx +71 -0
- package/registry/ui/components/nm-gallery/nm-gallery.css +66 -0
- package/registry/ui/components/nm-gallery/nm-gallery.tsx +31 -0
- package/registry/ui/components/nm-hover-card/nm-hover-card.css +26 -0
- package/registry/ui/components/nm-hover-card/nm-hover-card.tsx +28 -0
- package/registry/ui/components/nm-icon/nm-icon.css +6 -0
- package/registry/ui/components/nm-icon/nm-icon.tsx +69 -0
- package/registry/ui/components/nm-icon/nm-lucide.tsx +180 -0
- package/registry/ui/components/nm-icon-border/nm-icon-border.tsx +56 -0
- package/registry/ui/components/nm-input/nm-input.css +75 -0
- package/registry/ui/components/nm-input/nm-input.tsx +7 -0
- package/registry/ui/components/nm-input-group/nm-input-group.css +66 -0
- package/registry/ui/components/nm-input-group/nm-input-group.tsx +20 -0
- package/registry/ui/components/nm-label/nm-label.css +11 -0
- package/registry/ui/components/nm-label/nm-label.tsx +6 -0
- package/registry/ui/components/nm-list-item/nm-list-item.css +177 -0
- package/registry/ui/components/nm-list-item/nm-list-item.tsx +112 -0
- package/registry/ui/components/nm-menubar/nm-menubar.css +32 -0
- package/registry/ui/components/nm-menubar/nm-menubar.tsx +19 -0
- package/registry/ui/components/nm-message/nm-message-actions.tsx +24 -0
- package/registry/ui/components/nm-message/nm-message-meta.tsx +49 -0
- package/registry/ui/components/nm-message/nm-message.css +686 -0
- package/registry/ui/components/nm-message/nm-text-shimmer.tsx +6 -0
- package/registry/ui/components/nm-message/nm-trace.tsx +219 -0
- package/registry/ui/components/nm-modal/nm-modal.css +763 -0
- package/registry/ui/components/nm-modal/nm-modal.tsx +497 -0
- package/registry/ui/components/nm-native-select/nm-native-select.css +47 -0
- package/registry/ui/components/nm-native-select/nm-native-select.tsx +23 -0
- package/registry/ui/components/nm-panel/nm-panel.css +73 -0
- package/registry/ui/components/nm-panel/nm-panel.tsx +35 -0
- package/registry/ui/components/nm-panel-bar/nm-panel-bar.css +20 -0
- package/registry/ui/components/nm-panel-bar/nm-panel-bar.tsx +48 -0
- package/registry/ui/components/nm-popover/nm-popover.css +43 -0
- package/registry/ui/components/nm-popover/nm-popover.tsx +40 -0
- package/registry/ui/components/nm-progress/nm-progress.css +21 -0
- package/registry/ui/components/nm-progress/nm-progress.tsx +14 -0
- package/registry/ui/components/nm-prose/nm-prose.css +81 -0
- package/registry/ui/components/nm-prose/nm-prose.tsx +10 -0
- package/registry/ui/components/nm-questionnaire/nm-questionnaire.css +182 -0
- package/registry/ui/components/nm-questionnaire/nm-questionnaire.tsx +221 -0
- package/registry/ui/components/nm-radio-group/nm-radio-group.css +48 -0
- package/registry/ui/components/nm-radio-group/nm-radio-group.tsx +15 -0
- package/registry/ui/components/nm-rail-icon/nm-rail-icon.css +6 -0
- package/registry/ui/components/nm-rail-icon/nm-rail-icon.tsx +28 -0
- package/registry/ui/components/nm-resize-handle/nm-resize-handle.css +45 -0
- package/registry/ui/components/nm-resize-handle/nm-resize-handle.tsx +102 -0
- package/registry/ui/components/nm-segmented/nm-segmented.css +104 -0
- package/registry/ui/components/nm-segmented/nm-segmented.tsx +77 -0
- package/registry/ui/components/nm-select/nm-select.css +78 -0
- package/registry/ui/components/nm-select/nm-select.tsx +64 -0
- package/registry/ui/components/nm-separator/nm-separator.css +14 -0
- package/registry/ui/components/nm-separator/nm-separator.tsx +6 -0
- package/registry/ui/components/nm-side-panel/nm-side-panel.css +93 -0
- package/registry/ui/components/nm-side-panel/nm-side-panel.tsx +86 -0
- package/registry/ui/components/nm-slider/nm-slider.css +53 -0
- package/registry/ui/components/nm-slider/nm-slider.tsx +40 -0
- package/registry/ui/components/nm-small-icon-button/nm-small-icon-button.tsx +66 -0
- package/registry/ui/components/nm-status-bar/nm-status-bar.css +50 -0
- package/registry/ui/components/nm-status-bar/nm-status-bar.tsx +28 -0
- package/registry/ui/components/nm-switch/nm-switch.css +45 -0
- package/registry/ui/components/nm-switch/nm-switch.tsx +10 -0
- package/registry/ui/components/nm-table/nm-table.css +155 -0
- package/registry/ui/components/nm-table/nm-table.tsx +95 -0
- package/registry/ui/components/nm-tabs/nm-tabs.css +28 -0
- package/registry/ui/components/nm-tabs/nm-tabs.tsx +32 -0
- package/registry/ui/components/nm-textarea/nm-textarea.css +41 -0
- package/registry/ui/components/nm-textarea/nm-textarea.tsx +6 -0
- package/registry/ui/components/nm-toggle/nm-toggle.css +55 -0
- package/registry/ui/components/nm-toggle/nm-toggle.tsx +16 -0
- package/registry/ui/components/nm-toolbar/nm-toolbar.css +42 -0
- package/registry/ui/components/nm-toolbar/nm-toolbar.tsx +54 -0
- package/registry/ui/components/nm-tooltip/nm-tooltip.css +37 -0
- package/registry/ui/components/nm-tooltip/nm-tooltip.tsx +35 -0
- package/registry/ui/components/nm-top-bar/nm-top-bar.css +29 -0
- package/registry/ui/components/nm-top-bar/nm-top-bar.tsx +34 -0
- package/registry/ui/components/nordman-icon-button/nordman-icon-button.css +119 -0
- package/registry/ui/components/nordman-icon-button/nordman-icon-button.tsx +185 -0
- package/registry/ui/components/nordman-login/nordman-login.css +195 -0
- package/registry/ui/components/nordman-login/nordman-login.tsx +136 -0
- package/registry/ui/components/nordman-login-field/nordman-login-field.tsx +55 -0
- package/registry/ui/components/nordman-login-forgot/nordman-login-forgot.tsx +56 -0
- package/registry/ui/components/nordman-login-google/nordman-login-google.tsx +28 -0
- package/registry/ui/components/nordman-login-hero/nordman-login-hero.tsx +38 -0
- package/registry/ui/components/nordman-login-register/nordman-login-register.tsx +70 -0
- package/registry/ui/components/nordman-login-reset/nordman-login-reset.tsx +71 -0
- package/registry/ui/components/nordman-login-reveal/nordman-login-reveal.tsx +41 -0
- package/registry/ui/components/nordman-login-sign-in/nordman-login-sign-in.tsx +69 -0
- package/registry/ui/components/nordman-toggle/nordman-toggle.css +28 -0
- package/registry/ui/components/nordman-toggle/nordman-toggle.tsx +35 -0
- package/registry/ui/config/nm-ai.ts +59 -0
- package/registry/ui/config/nm-appearance.ts +275 -0
- package/registry/ui/config/nm-bar-overflow.ts +10 -0
- package/registry/ui/config/nm-button.ts +38 -0
- package/registry/ui/config/nm-chatbox-icons.ts +67 -0
- package/registry/ui/config/nm-chatbox.ts +42 -0
- package/registry/ui/config/nm-collection.ts +101 -0
- package/registry/ui/config/nm-composer.ts +39 -0
- package/registry/ui/config/nm-dropdown.ts +62 -0
- package/registry/ui/config/nm-field.ts +43 -0
- package/registry/ui/config/nm-icon-button.ts +35 -0
- package/registry/ui/config/nm-icons.ts +417 -0
- package/registry/ui/config/nm-list-item.ts +14 -0
- package/registry/ui/config/nm-message.ts +106 -0
- package/registry/ui/config/nm-modal.ts +76 -0
- package/registry/ui/config/nm-panel-bar.ts +11 -0
- package/registry/ui/config/nm-questionnaire.ts +53 -0
- package/registry/ui/config/nm-radius.ts +56 -0
- package/registry/ui/config/nm-rail-icons.ts +27 -0
- package/registry/ui/config/nm-segmented.ts +19 -0
- package/registry/ui/config/nm-side-panel.ts +16 -0
- package/registry/ui/config/nm-site-palette.ts +30 -0
- package/registry/ui/config/nm-small-icon-button.ts +17 -0
- package/registry/ui/config/nm-tabs.ts +9 -0
- package/registry/ui/config/nm-top-bar.ts +4 -0
- package/registry/ui/config/nordman-chrome.ts +14 -0
- package/registry/ui/config/nordman-login.ts +28 -0
- package/registry/ui/content/nm-modal.ts +5 -0
- package/registry/ui/content/nordman-login.ts +85 -0
- package/registry/ui/kit-logger.ts +1 -0
- package/registry/ui/lib/appearance/appearanceState.ts +240 -0
- package/registry/ui/lib/appearance/applyAppearance.ts +36 -0
- package/registry/ui/lib/appearance/cloudOrbAppearance.ts +36 -0
- package/registry/ui/lib/appearance/color.ts +96 -0
- package/registry/ui/lib/appearance/deriveTokens.ts +218 -0
- package/registry/ui/lib/appearance/index.ts +6 -0
- package/registry/ui/lib/appearance/markTokens.ts +49 -0
- package/registry/ui/lib/appearance/readLayoutMetrics.ts +28 -0
- package/registry/ui/lib/bar-overflow.ts +41 -0
- package/registry/ui/lib/logger.ts +53 -0
- package/registry/ui/lib/menu-motion.ts +187 -0
- package/registry/ui/lib/nm-class.ts +4 -0
- package/registry/ui/lib/nordman-ui-locale.ts +43 -0
- package/registry/ui/styles/interface-theme.css +196 -0
- package/registry/ui/styles/light-appearance.css +72 -0
- package/registry/ui/styles/tokens.css +424 -0
- package/registry/ui/styles/utilities.css +12 -0
- package/dist/ui/components/nm-accordion/nm-accordion.d.ts +0 -6
package/README.md
CHANGED
|
@@ -60,3 +60,21 @@ applyAppearanceState({ ...createDefaultAppearanceState(), uiRadiusPercent: 120,
|
|
|
60
60
|
## Source of truth
|
|
61
61
|
|
|
62
62
|
NIF is authored in the Nordman web repo (`ui/` and `assets/tokens.css`). This package is built from that source. Never edit a copy in a product.
|
|
63
|
+
|
|
64
|
+
## Add one component
|
|
65
|
+
|
|
66
|
+
Install a component, and only what it is built from, into a product. The files are copied, so you can read them,
|
|
67
|
+
and `nif update` brings them back in line with the kit.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npx @nordmanai/nif@latest init # tokens, base styles and nif.json
|
|
71
|
+
npx @nordmanai/nif@latest add button # the component, what it needs and its libraries
|
|
72
|
+
npx @nordmanai/nif@latest list # every component, and which you have
|
|
73
|
+
npx @nordmanai/nif@latest diff button # what changed in the kit since you copied it
|
|
74
|
+
npx @nordmanai/nif@latest update button # copy the kit version over
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`init` writes `src/nordman-ui/nordman.css`. Import it once, before the app renders. Options: `--dir`, `--alias`,
|
|
78
|
+
`--overwrite`, `--no-install`. A file you changed is kept unless you pass `--overwrite`. The package install above
|
|
79
|
+
stays the default for a product that wants the whole kit.
|
|
80
|
+
|
package/bin/nif.mjs
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// nif: put NIF components into a product, one at a time, the way shadcn does.
|
|
3
|
+
// nif init the tokens, the base styles and nif.json
|
|
4
|
+
// nif add button field the component, everything it is built from, and the libraries it needs
|
|
5
|
+
// nif list every component, and which are installed
|
|
6
|
+
// nif diff button what changed in the kit since you copied it
|
|
7
|
+
// nif update [button ...] copy the kit version over (all installed components when none are named)
|
|
8
|
+
import { execFileSync } from 'node:child_process';
|
|
9
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
|
|
13
|
+
const registryDir = path.join(path.dirname(fileURLToPath(import.meta.url)), '../registry');
|
|
14
|
+
const registry = JSON.parse(readFileSync(path.join(registryDir, 'index.json'), 'utf8'));
|
|
15
|
+
const cwd = process.cwd();
|
|
16
|
+
const configPath = path.join(cwd, 'nif.json');
|
|
17
|
+
|
|
18
|
+
const HEADER = `/* @nordmanai/nif ${registry.version}. Copied by "nif add". Update it with "nif update". Do not edit it by hand. */\n`;
|
|
19
|
+
const HEADER_LINE = /^\/\* @nordmanai\/nif [^\n]* \*\/\n/;
|
|
20
|
+
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
const flags = new Set(args.filter((a) => a.startsWith('--')));
|
|
23
|
+
const valueOf = (name) => {
|
|
24
|
+
const at = args.indexOf(name);
|
|
25
|
+
return at >= 0 ? args[at + 1] : undefined;
|
|
26
|
+
};
|
|
27
|
+
const positional = args.filter((a, i) => !a.startsWith('--') && !(i > 0 && ['--dir', '--alias'].includes(args[i - 1])));
|
|
28
|
+
const [command, ...names] = positional;
|
|
29
|
+
|
|
30
|
+
const say = (text = '') => console.log(text);
|
|
31
|
+
const fail = (text) => {
|
|
32
|
+
console.error(`nif: ${text}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const readConfig = () => {
|
|
37
|
+
if (!existsSync(configPath)) fail('there is no nif.json here. Run "nif init" first.');
|
|
38
|
+
return JSON.parse(readFileSync(configPath, 'utf8'));
|
|
39
|
+
};
|
|
40
|
+
const writeConfig = (config) => writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);
|
|
41
|
+
|
|
42
|
+
const itemFor = (name) => {
|
|
43
|
+
const key = name.replace(/^nm-/, '');
|
|
44
|
+
const item = registry.items[key];
|
|
45
|
+
if (!item) fail(`there is no component called "${name}". Run "nif list" to see them.`);
|
|
46
|
+
return [key, item];
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const withHeader = (text) => HEADER + text;
|
|
50
|
+
const withoutHeader = (text) => text.replace(HEADER_LINE, '');
|
|
51
|
+
const targetOf = (config, rel) => path.join(cwd, config.dir, 'ui', rel);
|
|
52
|
+
const sourceOf = (rel) => readFileSync(path.join(registryDir, 'ui', rel), 'utf8');
|
|
53
|
+
|
|
54
|
+
/** Copy a file out of the registry. Returns what happened. */
|
|
55
|
+
function place(config, rel, { overwrite }) {
|
|
56
|
+
const to = targetOf(config, rel);
|
|
57
|
+
const text = sourceOf(rel);
|
|
58
|
+
if (existsSync(to) && !overwrite) {
|
|
59
|
+
return withoutHeader(readFileSync(to, 'utf8')) === text ? 'same' : 'kept';
|
|
60
|
+
}
|
|
61
|
+
mkdirSync(path.dirname(to), { recursive: true });
|
|
62
|
+
writeFileSync(to, withHeader(text));
|
|
63
|
+
return 'copied';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function packageManager() {
|
|
67
|
+
if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return ['pnpm', 'add'];
|
|
68
|
+
if (existsSync(path.join(cwd, 'yarn.lock'))) return ['yarn', 'add'];
|
|
69
|
+
if (existsSync(path.join(cwd, 'bun.lockb')) || existsSync(path.join(cwd, 'bun.lock'))) return ['bun', 'add'];
|
|
70
|
+
return ['npm', ['install']].flat();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function installLibs(libs) {
|
|
74
|
+
const manifest = existsSync(path.join(cwd, 'package.json')) ? JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf8')) : {};
|
|
75
|
+
const have = { ...manifest.dependencies, ...manifest.devDependencies, ...manifest.peerDependencies };
|
|
76
|
+
const missing = [...new Set(libs)].filter((lib) => !(lib in have));
|
|
77
|
+
if (missing.length === 0) return;
|
|
78
|
+
const [bin, ...rest] = packageManager();
|
|
79
|
+
say(`Installing ${missing.join(', ')} with ${bin}`);
|
|
80
|
+
if (flags.has('--no-install')) {
|
|
81
|
+
say(` Skipped. Run: ${[bin, ...rest, ...missing.map((lib) => (registry.versions[lib] ? `${lib}@${registry.versions[lib]}` : lib))].join(' ')}`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// The kit is tested against these versions, so ask for the same range.
|
|
85
|
+
const wanted = missing.map((lib) => (registry.versions[lib] ? `${lib}@${registry.versions[lib]}` : lib));
|
|
86
|
+
execFileSync(bin, [...rest, ...wanted], { cwd, stdio: 'inherit' });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** components.css imports the CSS of every installed component, in the order the kit uses. */
|
|
90
|
+
function writeComponentsCss(config) {
|
|
91
|
+
const css = new Set();
|
|
92
|
+
for (const name of config.installed) {
|
|
93
|
+
for (const rel of registry.items[name]?.files ?? []) if (rel.startsWith('components/') && rel.endsWith('.css')) css.add(rel);
|
|
94
|
+
}
|
|
95
|
+
const rank = (rel) => {
|
|
96
|
+
const index = registry.cssOrder.indexOf(rel.split('/')[1].replace(/^nm-/, ''));
|
|
97
|
+
return index < 0 ? registry.cssOrder.length : index;
|
|
98
|
+
};
|
|
99
|
+
const lines = [...css].sort((a, b) => rank(a) - rank(b) || a.localeCompare(b)).map((rel) => `@import '../${rel}';`);
|
|
100
|
+
const to = targetOf(config, 'styles/components.css');
|
|
101
|
+
mkdirSync(path.dirname(to), { recursive: true });
|
|
102
|
+
writeFileSync(to, `${HEADER}${lines.join('\n')}\n`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function init() {
|
|
106
|
+
const config = { dir: valueOf('--dir') ?? 'src/nordman-ui', alias: valueOf('--alias') ?? '@/nordman-ui', version: registry.version, installed: [] };
|
|
107
|
+
for (const rel of registry.core.files) place(config, rel, { overwrite: flags.has('--overwrite') });
|
|
108
|
+
const tokens = path.join(cwd, config.dir, 'tokens.css');
|
|
109
|
+
mkdirSync(path.dirname(tokens), { recursive: true });
|
|
110
|
+
writeFileSync(tokens, withHeader(readFileSync(path.join(registryDir, 'tokens.css'), 'utf8')));
|
|
111
|
+
const fonts = [400, 500, 600, 700].map((w) => `@import '@fontsource/poppins/latin-${w}.css';`).concat([400, 500].map((w) => `@import '@fontsource/geist-mono/latin-${w}.css';`));
|
|
112
|
+
writeFileSync(
|
|
113
|
+
path.join(cwd, config.dir, 'nordman.css'),
|
|
114
|
+
`${fonts.join('\n')}\n@import './tokens.css';\n@import './ui/styles/tokens.css';\n@import './ui/styles/interface-theme.css';\n@import './ui/styles/light-appearance.css';\n@import './ui/styles/utilities.css';\n@import './ui/styles/components.css';\n`,
|
|
115
|
+
);
|
|
116
|
+
writeComponentsCss(config);
|
|
117
|
+
writeConfig(config);
|
|
118
|
+
installLibs(registry.core.libs);
|
|
119
|
+
say(`NIF is set up in ${config.dir}.`);
|
|
120
|
+
say(`Load the styles once, before the app renders:\n import '${config.alias}/nordman.css';`);
|
|
121
|
+
say('Then add components: nif add button');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function add(list) {
|
|
125
|
+
if (list.length === 0) fail('name a component, for example "nif add button".');
|
|
126
|
+
const config = readConfig();
|
|
127
|
+
const libs = [];
|
|
128
|
+
for (const name of list) {
|
|
129
|
+
const [key, item] = itemFor(name);
|
|
130
|
+
const outcome = { copied: [], same: [], kept: [] };
|
|
131
|
+
for (const rel of [...registry.core.files, ...item.files]) outcome[place(config, rel, { overwrite: flags.has('--overwrite') })].push(rel);
|
|
132
|
+
libs.push(...item.libs);
|
|
133
|
+
if (!config.installed.includes(key)) config.installed.push(key);
|
|
134
|
+
say(`${key}: ${outcome.copied.length} copied${outcome.kept.length ? `, ${outcome.kept.length} kept because you changed them (use --overwrite to replace)` : ''}`);
|
|
135
|
+
const main = item.dir ? item.files.find((f) => f === `components/${item.dir}/${item.dir}.tsx`) : undefined;
|
|
136
|
+
if (main) say(` import { ... } from '${config.alias}/ui/${main.replace(/\.tsx$/, '')}';`);
|
|
137
|
+
}
|
|
138
|
+
config.version = registry.version;
|
|
139
|
+
writeComponentsCss(config);
|
|
140
|
+
writeConfig(config);
|
|
141
|
+
installLibs(libs);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function changes(config, key) {
|
|
145
|
+
const [, item] = itemFor(key);
|
|
146
|
+
const out = [];
|
|
147
|
+
for (const rel of item.files) {
|
|
148
|
+
const to = targetOf(config, rel);
|
|
149
|
+
if (!existsSync(to)) out.push([rel, 'missing']);
|
|
150
|
+
else if (withoutHeader(readFileSync(to, 'utf8')) !== sourceOf(rel)) out.push([rel, 'changed']);
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function diff(list) {
|
|
156
|
+
const config = readConfig();
|
|
157
|
+
for (const name of list.length ? list : config.installed) {
|
|
158
|
+
const rows = changes(config, name);
|
|
159
|
+
say(rows.length === 0 ? `${name}: up to date` : `${name}:\n${rows.map(([rel, state]) => ` ${state} ${rel}`).join('\n')}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function update(list) {
|
|
164
|
+
const config = readConfig();
|
|
165
|
+
const targets = list.length ? list : config.installed;
|
|
166
|
+
add(targets.map((n) => n), config) ;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function listAll() {
|
|
170
|
+
const config = existsSync(configPath) ? readConfig() : { installed: [] };
|
|
171
|
+
for (const [name, item] of Object.entries(registry.items)) {
|
|
172
|
+
say(`${config.installed.includes(name) ? '●' : '○'} ${name.padEnd(22)} ${item.libs.join(' ')}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
switch (command) {
|
|
177
|
+
case 'init':
|
|
178
|
+
init();
|
|
179
|
+
break;
|
|
180
|
+
case 'add':
|
|
181
|
+
add(names);
|
|
182
|
+
break;
|
|
183
|
+
case 'list':
|
|
184
|
+
listAll();
|
|
185
|
+
break;
|
|
186
|
+
case 'diff':
|
|
187
|
+
diff(names);
|
|
188
|
+
break;
|
|
189
|
+
case 'update':
|
|
190
|
+
flags.add('--overwrite');
|
|
191
|
+
update(names);
|
|
192
|
+
break;
|
|
193
|
+
default:
|
|
194
|
+
say('nif init | add <component…> | list | diff [component…] | update [component…]');
|
|
195
|
+
say('Options: --dir <folder> --alias <import path> --overwrite --no-install');
|
|
196
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import './styles.css';
|
|
2
|
-
export * from './ui/components/nm-accordion/nm-accordion.tsx';
|
|
3
2
|
export * from './ui/components/nm-ai/nm-ai.tsx';
|
|
4
3
|
export * from './ui/components/nm-avatar/nm-avatar.tsx';
|
|
5
4
|
export * from './ui/components/nm-bar-overflow/nm-bar-overflow.tsx';
|
|
6
5
|
export * from './ui/components/nm-bar-overflow/use-bar-overflow.ts';
|
|
6
|
+
export * from './ui/components/nm-brand-logo/nm-brand-logo.tsx';
|
|
7
|
+
export * from './ui/components/nm-breadcrumb/nm-breadcrumb.tsx';
|
|
7
8
|
export * from './ui/components/nm-button/nm-button.tsx';
|
|
9
|
+
export * from './ui/components/nm-button-group/nm-button-group.tsx';
|
|
10
|
+
export * from './ui/components/nm-calendar/nm-calendar.tsx';
|
|
11
|
+
export * from './ui/components/nm-card/nm-card.tsx';
|
|
8
12
|
export * from './ui/components/nm-chatbox/nm-chatbox-icon.tsx';
|
|
9
13
|
export * from './ui/components/nm-chatbox/nm-chatbox.tsx';
|
|
10
14
|
export * from './ui/components/nm-checkbox/nm-checkbox.tsx';
|
|
15
|
+
export * from './ui/components/nm-chip/nm-chip.tsx';
|
|
16
|
+
export * from './ui/components/nm-code-block/nm-code-block.tsx';
|
|
11
17
|
export * from './ui/components/nm-collection/nm-collection-bar.tsx';
|
|
12
18
|
export * from './ui/components/nm-collection/nm-collection-grid.tsx';
|
|
13
19
|
export * from './ui/components/nm-collection/nm-collection-query.tsx';
|
|
@@ -16,7 +22,13 @@ export * from './ui/components/nm-collection/nm-collection-table.tsx';
|
|
|
16
22
|
export * from './ui/components/nm-collection/nm-collection-tile-actions.tsx';
|
|
17
23
|
export * from './ui/components/nm-collection/nm-collection-title.tsx';
|
|
18
24
|
export * from './ui/components/nm-collection/use-collection-scroll-reveal.ts';
|
|
25
|
+
export * from './ui/components/nm-color-picker/nm-color-picker.tsx';
|
|
26
|
+
export * from './ui/components/nm-combobox/nm-combobox.tsx';
|
|
27
|
+
export * from './ui/components/nm-command/nm-command.tsx';
|
|
19
28
|
export * from './ui/components/nm-composer/nm-composer.tsx';
|
|
29
|
+
export * from './ui/components/nm-context-menu/nm-context-menu.tsx';
|
|
30
|
+
export * from './ui/components/nm-date-picker/nm-date-picker.tsx';
|
|
31
|
+
export * from './ui/components/nm-dialog/nm-dialog.tsx';
|
|
20
32
|
export * from './ui/components/nm-dropdown/nm-dropdown-item.ts';
|
|
21
33
|
export * from './ui/components/nm-dropdown/nm-dropdown-options.tsx';
|
|
22
34
|
export * from './ui/components/nm-dropdown/nm-dropdown-panel.tsx';
|
|
@@ -24,29 +36,45 @@ export * from './ui/components/nm-dropdown/nm-dropdown-placement.ts';
|
|
|
24
36
|
export * from './ui/components/nm-dropdown/nm-dropdown.tsx';
|
|
25
37
|
export * from './ui/components/nm-dropdown-menu/nm-dropdown-menu.tsx';
|
|
26
38
|
export * from './ui/components/nm-field/nm-field.tsx';
|
|
39
|
+
export * from './ui/components/nm-form-field/nm-form-field.tsx';
|
|
40
|
+
export * from './ui/components/nm-gallery/nm-gallery.tsx';
|
|
27
41
|
export * from './ui/components/nm-hover-card/nm-hover-card.tsx';
|
|
28
42
|
export * from './ui/components/nm-icon/nm-icon.tsx';
|
|
29
43
|
export * from './ui/components/nm-icon/nm-lucide.tsx';
|
|
30
44
|
export * from './ui/components/nm-icon-border/nm-icon-border.tsx';
|
|
45
|
+
export * from './ui/components/nm-input/nm-input.tsx';
|
|
46
|
+
export * from './ui/components/nm-input-group/nm-input-group.tsx';
|
|
47
|
+
export * from './ui/components/nm-label/nm-label.tsx';
|
|
31
48
|
export * from './ui/components/nm-list-item/nm-list-item.tsx';
|
|
49
|
+
export * from './ui/components/nm-menubar/nm-menubar.tsx';
|
|
32
50
|
export * from './ui/components/nm-message/nm-message-actions.tsx';
|
|
33
51
|
export * from './ui/components/nm-message/nm-message-meta.tsx';
|
|
34
52
|
export * from './ui/components/nm-message/nm-text-shimmer.tsx';
|
|
35
53
|
export * from './ui/components/nm-message/nm-trace.tsx';
|
|
36
54
|
export * from './ui/components/nm-modal/nm-modal.tsx';
|
|
55
|
+
export * from './ui/components/nm-native-select/nm-native-select.tsx';
|
|
56
|
+
export * from './ui/components/nm-panel/nm-panel.tsx';
|
|
37
57
|
export * from './ui/components/nm-panel-bar/nm-panel-bar.tsx';
|
|
38
58
|
export * from './ui/components/nm-popover/nm-popover.tsx';
|
|
39
59
|
export * from './ui/components/nm-progress/nm-progress.tsx';
|
|
60
|
+
export * from './ui/components/nm-prose/nm-prose.tsx';
|
|
40
61
|
export * from './ui/components/nm-questionnaire/nm-questionnaire.tsx';
|
|
41
62
|
export * from './ui/components/nm-radio-group/nm-radio-group.tsx';
|
|
42
63
|
export * from './ui/components/nm-rail-icon/nm-rail-icon.tsx';
|
|
64
|
+
export * from './ui/components/nm-resize-handle/nm-resize-handle.tsx';
|
|
43
65
|
export * from './ui/components/nm-segmented/nm-segmented.tsx';
|
|
66
|
+
export * from './ui/components/nm-select/nm-select.tsx';
|
|
44
67
|
export * from './ui/components/nm-separator/nm-separator.tsx';
|
|
68
|
+
export * from './ui/components/nm-side-panel/nm-side-panel.tsx';
|
|
45
69
|
export * from './ui/components/nm-slider/nm-slider.tsx';
|
|
46
70
|
export * from './ui/components/nm-small-icon-button/nm-small-icon-button.tsx';
|
|
71
|
+
export * from './ui/components/nm-status-bar/nm-status-bar.tsx';
|
|
47
72
|
export * from './ui/components/nm-switch/nm-switch.tsx';
|
|
73
|
+
export * from './ui/components/nm-table/nm-table.tsx';
|
|
48
74
|
export * from './ui/components/nm-tabs/nm-tabs.tsx';
|
|
75
|
+
export * from './ui/components/nm-textarea/nm-textarea.tsx';
|
|
49
76
|
export * from './ui/components/nm-toggle/nm-toggle.tsx';
|
|
77
|
+
export * from './ui/components/nm-toolbar/nm-toolbar.tsx';
|
|
50
78
|
export * from './ui/components/nm-tooltip/nm-tooltip.tsx';
|
|
51
79
|
export * from './ui/components/nm-top-bar/nm-top-bar.tsx';
|
|
52
80
|
export * from './ui/components/nordman-icon-button/nordman-icon-button.tsx';
|
|
@@ -85,6 +113,7 @@ export * from './ui/config/nm-radius.ts';
|
|
|
85
113
|
export * from './ui/config/nm-rail-icons.ts';
|
|
86
114
|
export * from './ui/config/nm-rail.ts';
|
|
87
115
|
export * from './ui/config/nm-segmented.ts';
|
|
116
|
+
export * from './ui/config/nm-side-panel.ts';
|
|
88
117
|
export * from './ui/config/nm-site-palette.ts';
|
|
89
118
|
export * from './ui/config/nm-small-icon-button.ts';
|
|
90
119
|
export * from './ui/config/nm-tabs.ts';
|