@openwaggle/extension-sdk 0.0.0-bootstrap.0 → 0.1.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.
Files changed (104) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +3 -0
  4. package/dist/agent-loop.d.ts +128 -0
  5. package/dist/agent-loop.js +47 -0
  6. package/dist/broker-validation.d.ts +17 -0
  7. package/dist/broker-validation.js +99 -0
  8. package/dist/broker.d.ts +193 -0
  9. package/dist/broker.js +81 -0
  10. package/dist/constants.d.ts +183 -0
  11. package/dist/constants.js +245 -0
  12. package/dist/context.d.ts +66 -0
  13. package/dist/context.js +49 -0
  14. package/dist/contribution-types.d.ts +21 -0
  15. package/dist/contribution-types.js +1 -0
  16. package/dist/core-types.d.ts +58 -0
  17. package/dist/core-types.js +1 -0
  18. package/dist/docs-validation.d.ts +3 -0
  19. package/dist/docs-validation.js +93 -0
  20. package/dist/docs.d.ts +231 -0
  21. package/dist/docs.js +85 -0
  22. package/dist/index.d.ts +15 -0
  23. package/dist/index.js +10 -0
  24. package/dist/internal-validation.d.ts +4 -0
  25. package/dist/internal-validation.js +24 -0
  26. package/dist/json.d.ts +9 -0
  27. package/dist/json.js +3 -0
  28. package/dist/manifest-contributions.d.ts +380 -0
  29. package/dist/manifest-contributions.js +75 -0
  30. package/dist/manifest-primitives.d.ts +20 -0
  31. package/dist/manifest-primitives.js +118 -0
  32. package/dist/manifest.d.ts +303 -0
  33. package/dist/manifest.js +89 -0
  34. package/dist/openwaggle-sdk.d.ts +2 -0
  35. package/dist/openwaggle-sdk.js +127 -0
  36. package/dist/openwaggle-types.d.ts +111 -0
  37. package/dist/openwaggle-types.js +1 -0
  38. package/dist/openwaggle-validation.d.ts +12 -0
  39. package/dist/openwaggle-validation.js +135 -0
  40. package/dist/registry-types.d.ts +34 -0
  41. package/dist/registry-types.js +1 -0
  42. package/dist/runtime-sdk.d.ts +2 -0
  43. package/dist/runtime-sdk.js +19 -0
  44. package/dist/runtime-types.d.ts +19 -0
  45. package/dist/runtime-types.js +1 -0
  46. package/dist/runtime.d.ts +22 -0
  47. package/dist/runtime.js +22 -0
  48. package/dist/schema.d.ts +13 -0
  49. package/dist/schema.js +25 -0
  50. package/dist/sdk-types.d.ts +92 -0
  51. package/dist/sdk-types.js +1 -0
  52. package/dist/storage-sdk.d.ts +2 -0
  53. package/dist/storage-sdk.js +51 -0
  54. package/dist/storage-types.d.ts +40 -0
  55. package/dist/storage-types.js +1 -0
  56. package/dist/theme-data.d.ts +126 -0
  57. package/dist/theme-data.js +144 -0
  58. package/dist/theme-types.d.ts +61 -0
  59. package/dist/theme-types.js +1 -0
  60. package/dist/theme.d.ts +6 -0
  61. package/dist/theme.js +128 -0
  62. package/dist/types.d.ts +6 -0
  63. package/dist/types.js +1 -0
  64. package/dist/ui-constants.d.ts +24 -0
  65. package/dist/ui-constants.js +22 -0
  66. package/dist/ui-stylesheet.d.ts +8 -0
  67. package/dist/ui-stylesheet.js +223 -0
  68. package/dist/ui.d.ts +6 -0
  69. package/dist/ui.js +16 -0
  70. package/dist-cjs/agent-loop.js +83 -0
  71. package/dist-cjs/broker-validation.js +109 -0
  72. package/dist-cjs/broker.js +120 -0
  73. package/dist-cjs/constants.js +248 -0
  74. package/dist-cjs/context.js +54 -0
  75. package/dist-cjs/contribution-types.js +2 -0
  76. package/dist-cjs/core-types.js +2 -0
  77. package/dist-cjs/docs-validation.js +97 -0
  78. package/dist-cjs/docs.js +121 -0
  79. package/dist-cjs/index.js +56 -0
  80. package/dist-cjs/internal-validation.js +30 -0
  81. package/dist-cjs/json.js +39 -0
  82. package/dist-cjs/manifest-contributions.js +111 -0
  83. package/dist-cjs/manifest-primitives.js +158 -0
  84. package/dist-cjs/manifest.js +140 -0
  85. package/dist-cjs/openwaggle-sdk.js +130 -0
  86. package/dist-cjs/openwaggle-types.js +2 -0
  87. package/dist-cjs/openwaggle-validation.js +148 -0
  88. package/dist-cjs/package.json +3 -0
  89. package/dist-cjs/registry-types.js +2 -0
  90. package/dist-cjs/runtime-sdk.js +22 -0
  91. package/dist-cjs/runtime-types.js +2 -0
  92. package/dist-cjs/runtime.js +61 -0
  93. package/dist-cjs/schema.js +61 -0
  94. package/dist-cjs/sdk-types.js +2 -0
  95. package/dist-cjs/storage-sdk.js +54 -0
  96. package/dist-cjs/storage-types.js +2 -0
  97. package/dist-cjs/theme-data.js +147 -0
  98. package/dist-cjs/theme-types.js +2 -0
  99. package/dist-cjs/theme.js +135 -0
  100. package/dist-cjs/types.js +2 -0
  101. package/dist-cjs/ui-constants.js +25 -0
  102. package/dist-cjs/ui-stylesheet.js +227 -0
  103. package/dist-cjs/ui.js +24 -0
  104. package/package.json +98 -8
@@ -0,0 +1,144 @@
1
+ export const OPENWAGGLE_EXTENSION_THEME_CSS_VARIABLES = {
2
+ color: {
3
+ background: '--ow-color-background',
4
+ surface: '--ow-color-surface',
5
+ surfaceRaised: '--ow-color-surface-raised',
6
+ surfaceHover: '--ow-color-surface-hover',
7
+ surfaceActive: '--ow-color-surface-active',
8
+ border: '--ow-color-border',
9
+ borderStrong: '--ow-color-border-strong',
10
+ text: '--ow-color-text',
11
+ textSubtle: '--ow-color-text-subtle',
12
+ textMuted: '--ow-color-text-muted',
13
+ textDim: '--ow-color-text-dim',
14
+ accent: '--ow-color-accent',
15
+ accentDim: '--ow-color-accent-dim',
16
+ success: '--ow-color-success',
17
+ danger: '--ow-color-danger',
18
+ warning: '--ow-color-warning',
19
+ info: '--ow-color-info',
20
+ },
21
+ typography: {
22
+ sansFamily: '--ow-font-family-sans',
23
+ monoFamily: '--ow-font-family-mono',
24
+ },
25
+ spacing: {
26
+ xs: '--ow-space-xs',
27
+ sm: '--ow-space-sm',
28
+ md: '--ow-space-md',
29
+ lg: '--ow-space-lg',
30
+ xl: '--ow-space-xl',
31
+ },
32
+ radius: {
33
+ sm: '--ow-radius-sm',
34
+ md: '--ow-radius-md',
35
+ lg: '--ow-radius-lg',
36
+ panel: '--ow-radius-panel',
37
+ },
38
+ focus: {
39
+ ring: '--ow-focus-ring',
40
+ shadow: '--ow-focus-shadow',
41
+ },
42
+ elevation: {
43
+ card: '--ow-elevation-card',
44
+ overlay: '--ow-elevation-overlay',
45
+ },
46
+ };
47
+ export const DEFAULT_EXTENSION_THEME_TOKENS = {
48
+ color: {
49
+ background: '#141619',
50
+ surface: '#1a1d22',
51
+ surfaceRaised: '#1f232a',
52
+ surfaceHover: '#262b33',
53
+ surfaceActive: '#1d1a10',
54
+ border: '#1e2229',
55
+ borderStrong: '#2a3240',
56
+ text: '#e7e9ee',
57
+ textSubtle: '#c9cdd6',
58
+ textMuted: '#9098a8',
59
+ textDim: '#666f7d',
60
+ accent: '#f5a623',
61
+ accentDim: '#b87410',
62
+ success: '#4caf72',
63
+ danger: '#ef4444',
64
+ warning: '#f5a623',
65
+ info: '#61a8ff',
66
+ },
67
+ typography: {
68
+ sansFamily: 'Inter, "SF Pro Text", "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
69
+ monoFamily: '"SF Mono", "JetBrains Mono", "Cascadia Mono", ui-monospace, monospace',
70
+ },
71
+ spacing: {
72
+ xs: '4px',
73
+ sm: '8px',
74
+ md: '12px',
75
+ lg: '16px',
76
+ xl: '24px',
77
+ },
78
+ radius: {
79
+ sm: '6px',
80
+ md: '9px',
81
+ lg: '12px',
82
+ panel: '22px',
83
+ },
84
+ focus: {
85
+ ring: '#9aa3b2',
86
+ shadow: '0 0 0 1px color-mix(in srgb, #9aa3b2 76%, transparent), 0 0 0 3px color-mix(in srgb, #9aa3b2 15%, transparent)',
87
+ },
88
+ elevation: {
89
+ card: 'inset 0 1px 0 rgba(255, 255, 255, 0.02)',
90
+ overlay: '0 24px 80px rgba(0, 0, 0, 0.45)',
91
+ },
92
+ };
93
+ export const SOURCE_EXTENSION_THEME_CSS_VARIABLES = {
94
+ color: {
95
+ background: '--color-bg',
96
+ surface: '--color-bg-secondary',
97
+ surfaceRaised: '--color-bg-tertiary',
98
+ surfaceHover: '--color-bg-hover',
99
+ surfaceActive: '--color-bg-active',
100
+ border: '--color-border',
101
+ borderStrong: '--color-border-light',
102
+ text: '--color-text-primary',
103
+ textSubtle: '--color-text-secondary',
104
+ textMuted: '--color-text-tertiary',
105
+ textDim: '--color-text-muted',
106
+ accent: '--color-accent',
107
+ accentDim: '--color-accent-dim',
108
+ success: '--color-success',
109
+ danger: '--color-error',
110
+ warning: '--color-warning',
111
+ info: '--color-info',
112
+ },
113
+ typography: {
114
+ sansFamily: '--font-sans',
115
+ monoFamily: '--font-mono',
116
+ },
117
+ radius: {
118
+ panel: '--radius-panel',
119
+ },
120
+ };
121
+ export const EXTENSION_THEME_COLOR_KEYS = [
122
+ 'background',
123
+ 'surface',
124
+ 'surfaceRaised',
125
+ 'surfaceHover',
126
+ 'surfaceActive',
127
+ 'border',
128
+ 'borderStrong',
129
+ 'text',
130
+ 'textSubtle',
131
+ 'textMuted',
132
+ 'textDim',
133
+ 'accent',
134
+ 'accentDim',
135
+ 'success',
136
+ 'danger',
137
+ 'warning',
138
+ 'info',
139
+ ];
140
+ export const EXTENSION_THEME_TYPOGRAPHY_KEYS = ['sansFamily', 'monoFamily'];
141
+ export const EXTENSION_THEME_SPACING_KEYS = ['xs', 'sm', 'md', 'lg', 'xl'];
142
+ export const EXTENSION_THEME_RADIUS_KEYS = ['sm', 'md', 'lg', 'panel'];
143
+ export const EXTENSION_THEME_FOCUS_KEYS = ['ring', 'shadow'];
144
+ export const EXTENSION_THEME_ELEVATION_KEYS = ['card', 'overlay'];
@@ -0,0 +1,61 @@
1
+ export type OpenWaggleExtensionColorScheme = 'dark';
2
+ export interface OpenWaggleExtensionThemeTokens {
3
+ readonly color: {
4
+ readonly background: string;
5
+ readonly surface: string;
6
+ readonly surfaceRaised: string;
7
+ readonly surfaceHover: string;
8
+ readonly surfaceActive: string;
9
+ readonly border: string;
10
+ readonly borderStrong: string;
11
+ readonly text: string;
12
+ readonly textSubtle: string;
13
+ readonly textMuted: string;
14
+ readonly textDim: string;
15
+ readonly accent: string;
16
+ readonly accentDim: string;
17
+ readonly success: string;
18
+ readonly danger: string;
19
+ readonly warning: string;
20
+ readonly info: string;
21
+ };
22
+ readonly typography: {
23
+ readonly sansFamily: string;
24
+ readonly monoFamily: string;
25
+ };
26
+ readonly spacing: {
27
+ readonly xs: string;
28
+ readonly sm: string;
29
+ readonly md: string;
30
+ readonly lg: string;
31
+ readonly xl: string;
32
+ };
33
+ readonly radius: {
34
+ readonly sm: string;
35
+ readonly md: string;
36
+ readonly lg: string;
37
+ readonly panel: string;
38
+ };
39
+ readonly focus: {
40
+ readonly ring: string;
41
+ readonly shadow: string;
42
+ };
43
+ readonly elevation: {
44
+ readonly card: string;
45
+ readonly overlay: string;
46
+ };
47
+ }
48
+ export type OpenWaggleExtensionThemeCssVariables = OpenWaggleExtensionThemeTokens;
49
+ export interface OpenWaggleExtensionTheme {
50
+ readonly colorScheme: OpenWaggleExtensionColorScheme;
51
+ readonly tokens: OpenWaggleExtensionThemeTokens;
52
+ readonly cssVariables: OpenWaggleExtensionThemeCssVariables;
53
+ }
54
+ export interface OpenWaggleExtensionThemeCssVariableEntry {
55
+ readonly name: string;
56
+ readonly value: string;
57
+ }
58
+ export type ExtensionThemeCssVariableResolver = (cssVariable: string, fallback: string) => string;
59
+ export interface CreateOpenWaggleExtensionThemeOptions {
60
+ readonly resolveCssVariable?: ExtensionThemeCssVariableResolver;
61
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { CreateOpenWaggleExtensionThemeOptions, OpenWaggleExtensionTheme, OpenWaggleExtensionThemeCssVariableEntry } from './theme-types.js';
2
+ export { OPENWAGGLE_EXTENSION_THEME_CSS_VARIABLES } from './theme-data.js';
3
+ export type { CreateOpenWaggleExtensionThemeOptions, ExtensionThemeCssVariableResolver, OpenWaggleExtensionColorScheme, OpenWaggleExtensionTheme, OpenWaggleExtensionThemeCssVariableEntry, OpenWaggleExtensionThemeCssVariables, OpenWaggleExtensionThemeTokens, } from './theme-types.js';
4
+ export declare function createOpenWaggleExtensionTheme(options?: CreateOpenWaggleExtensionThemeOptions): OpenWaggleExtensionTheme;
5
+ export declare function extensionThemeCssVariableEntries(theme: OpenWaggleExtensionTheme): readonly OpenWaggleExtensionThemeCssVariableEntry[];
6
+ export declare function isOpenWaggleExtensionTheme(value: unknown): value is OpenWaggleExtensionTheme;
package/dist/theme.js ADDED
@@ -0,0 +1,128 @@
1
+ import { isRecord } from './internal-validation.js';
2
+ import { DEFAULT_EXTENSION_THEME_TOKENS, EXTENSION_THEME_COLOR_KEYS, EXTENSION_THEME_ELEVATION_KEYS, EXTENSION_THEME_FOCUS_KEYS, EXTENSION_THEME_RADIUS_KEYS, EXTENSION_THEME_SPACING_KEYS, EXTENSION_THEME_TYPOGRAPHY_KEYS, OPENWAGGLE_EXTENSION_THEME_CSS_VARIABLES, SOURCE_EXTENSION_THEME_CSS_VARIABLES, } from './theme-data.js';
3
+ export { OPENWAGGLE_EXTENSION_THEME_CSS_VARIABLES } from './theme-data.js';
4
+ const EMPTY_LENGTH = 0;
5
+ function resolvedCssValue(resolver, cssVariable, fallback) {
6
+ if (resolver === undefined || cssVariable === undefined) {
7
+ return fallback;
8
+ }
9
+ const resolved = resolver(cssVariable, fallback).trim();
10
+ return resolved.length > EMPTY_LENGTH ? resolved : fallback;
11
+ }
12
+ function colorTokens(resolve) {
13
+ const source = SOURCE_EXTENSION_THEME_CSS_VARIABLES.color;
14
+ const fallback = DEFAULT_EXTENSION_THEME_TOKENS.color;
15
+ return {
16
+ background: resolvedCssValue(resolve, source.background, fallback.background),
17
+ surface: resolvedCssValue(resolve, source.surface, fallback.surface),
18
+ surfaceRaised: resolvedCssValue(resolve, source.surfaceRaised, fallback.surfaceRaised),
19
+ surfaceHover: resolvedCssValue(resolve, source.surfaceHover, fallback.surfaceHover),
20
+ surfaceActive: resolvedCssValue(resolve, source.surfaceActive, fallback.surfaceActive),
21
+ border: resolvedCssValue(resolve, source.border, fallback.border),
22
+ borderStrong: resolvedCssValue(resolve, source.borderStrong, fallback.borderStrong),
23
+ text: resolvedCssValue(resolve, source.text, fallback.text),
24
+ textSubtle: resolvedCssValue(resolve, source.textSubtle, fallback.textSubtle),
25
+ textMuted: resolvedCssValue(resolve, source.textMuted, fallback.textMuted),
26
+ textDim: resolvedCssValue(resolve, source.textDim, fallback.textDim),
27
+ accent: resolvedCssValue(resolve, source.accent, fallback.accent),
28
+ accentDim: resolvedCssValue(resolve, source.accentDim, fallback.accentDim),
29
+ success: resolvedCssValue(resolve, source.success, fallback.success),
30
+ danger: resolvedCssValue(resolve, source.danger, fallback.danger),
31
+ warning: resolvedCssValue(resolve, source.warning, fallback.warning),
32
+ info: resolvedCssValue(resolve, source.info, fallback.info),
33
+ };
34
+ }
35
+ function typographyTokens(resolve) {
36
+ const source = SOURCE_EXTENSION_THEME_CSS_VARIABLES.typography;
37
+ const fallback = DEFAULT_EXTENSION_THEME_TOKENS.typography;
38
+ return {
39
+ sansFamily: resolvedCssValue(resolve, source.sansFamily, fallback.sansFamily),
40
+ monoFamily: resolvedCssValue(resolve, source.monoFamily, fallback.monoFamily),
41
+ };
42
+ }
43
+ function radiusTokens(resolve) {
44
+ const fallback = DEFAULT_EXTENSION_THEME_TOKENS.radius;
45
+ return {
46
+ sm: fallback.sm,
47
+ md: fallback.md,
48
+ lg: fallback.lg,
49
+ panel: resolvedCssValue(resolve, SOURCE_EXTENSION_THEME_CSS_VARIABLES.radius.panel, fallback.panel),
50
+ };
51
+ }
52
+ function hasStringKeys(value, keys) {
53
+ if (!isRecord(value)) {
54
+ return false;
55
+ }
56
+ for (const key of keys) {
57
+ if (typeof value[key] !== 'string') {
58
+ return false;
59
+ }
60
+ }
61
+ return true;
62
+ }
63
+ function hasThemeTokenGroups(value) {
64
+ return (isRecord(value) &&
65
+ hasStringKeys(value.color, EXTENSION_THEME_COLOR_KEYS) &&
66
+ hasStringKeys(value.typography, EXTENSION_THEME_TYPOGRAPHY_KEYS) &&
67
+ hasStringKeys(value.spacing, EXTENSION_THEME_SPACING_KEYS) &&
68
+ hasStringKeys(value.radius, EXTENSION_THEME_RADIUS_KEYS) &&
69
+ hasStringKeys(value.focus, EXTENSION_THEME_FOCUS_KEYS) &&
70
+ hasStringKeys(value.elevation, EXTENSION_THEME_ELEVATION_KEYS));
71
+ }
72
+ export function createOpenWaggleExtensionTheme(options = {}) {
73
+ const resolve = options.resolveCssVariable;
74
+ return {
75
+ colorScheme: 'dark',
76
+ tokens: {
77
+ color: colorTokens(resolve),
78
+ typography: typographyTokens(resolve),
79
+ spacing: DEFAULT_EXTENSION_THEME_TOKENS.spacing,
80
+ radius: radiusTokens(resolve),
81
+ focus: DEFAULT_EXTENSION_THEME_TOKENS.focus,
82
+ elevation: DEFAULT_EXTENSION_THEME_TOKENS.elevation,
83
+ },
84
+ cssVariables: OPENWAGGLE_EXTENSION_THEME_CSS_VARIABLES,
85
+ };
86
+ }
87
+ export function extensionThemeCssVariableEntries(theme) {
88
+ return [
89
+ { name: theme.cssVariables.color.background, value: theme.tokens.color.background },
90
+ { name: theme.cssVariables.color.surface, value: theme.tokens.color.surface },
91
+ { name: theme.cssVariables.color.surfaceRaised, value: theme.tokens.color.surfaceRaised },
92
+ { name: theme.cssVariables.color.surfaceHover, value: theme.tokens.color.surfaceHover },
93
+ { name: theme.cssVariables.color.surfaceActive, value: theme.tokens.color.surfaceActive },
94
+ { name: theme.cssVariables.color.border, value: theme.tokens.color.border },
95
+ { name: theme.cssVariables.color.borderStrong, value: theme.tokens.color.borderStrong },
96
+ { name: theme.cssVariables.color.text, value: theme.tokens.color.text },
97
+ { name: theme.cssVariables.color.textSubtle, value: theme.tokens.color.textSubtle },
98
+ { name: theme.cssVariables.color.textMuted, value: theme.tokens.color.textMuted },
99
+ { name: theme.cssVariables.color.textDim, value: theme.tokens.color.textDim },
100
+ { name: theme.cssVariables.color.accent, value: theme.tokens.color.accent },
101
+ { name: theme.cssVariables.color.accentDim, value: theme.tokens.color.accentDim },
102
+ { name: theme.cssVariables.color.success, value: theme.tokens.color.success },
103
+ { name: theme.cssVariables.color.danger, value: theme.tokens.color.danger },
104
+ { name: theme.cssVariables.color.warning, value: theme.tokens.color.warning },
105
+ { name: theme.cssVariables.color.info, value: theme.tokens.color.info },
106
+ { name: theme.cssVariables.typography.sansFamily, value: theme.tokens.typography.sansFamily },
107
+ { name: theme.cssVariables.typography.monoFamily, value: theme.tokens.typography.monoFamily },
108
+ { name: theme.cssVariables.spacing.xs, value: theme.tokens.spacing.xs },
109
+ { name: theme.cssVariables.spacing.sm, value: theme.tokens.spacing.sm },
110
+ { name: theme.cssVariables.spacing.md, value: theme.tokens.spacing.md },
111
+ { name: theme.cssVariables.spacing.lg, value: theme.tokens.spacing.lg },
112
+ { name: theme.cssVariables.spacing.xl, value: theme.tokens.spacing.xl },
113
+ { name: theme.cssVariables.radius.sm, value: theme.tokens.radius.sm },
114
+ { name: theme.cssVariables.radius.md, value: theme.tokens.radius.md },
115
+ { name: theme.cssVariables.radius.lg, value: theme.tokens.radius.lg },
116
+ { name: theme.cssVariables.radius.panel, value: theme.tokens.radius.panel },
117
+ { name: theme.cssVariables.focus.ring, value: theme.tokens.focus.ring },
118
+ { name: theme.cssVariables.focus.shadow, value: theme.tokens.focus.shadow },
119
+ { name: theme.cssVariables.elevation.card, value: theme.tokens.elevation.card },
120
+ { name: theme.cssVariables.elevation.overlay, value: theme.tokens.elevation.overlay },
121
+ ];
122
+ }
123
+ export function isOpenWaggleExtensionTheme(value) {
124
+ return (isRecord(value) &&
125
+ value.colorScheme === 'dark' &&
126
+ hasThemeTokenGroups(value.tokens) &&
127
+ hasThemeTokenGroups(value.cssVariables));
128
+ }
@@ -0,0 +1,6 @@
1
+ export type * from './contribution-types.js';
2
+ export type * from './core-types.js';
3
+ export type * from './openwaggle-types.js';
4
+ export type * from './registry-types.js';
5
+ export type * from './runtime-types.js';
6
+ export type * from './storage-types.js';
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ export declare const OPENWAGGLE_EXTENSION_UI_CLASS_NAMES: {
2
+ readonly root: "ow-extension-root";
3
+ readonly panel: "ow-extension-panel";
4
+ readonly stack: "ow-extension-stack";
5
+ readonly row: "ow-extension-row";
6
+ readonly heading: "ow-extension-heading";
7
+ readonly text: "ow-extension-text";
8
+ readonly muted: "ow-extension-muted";
9
+ readonly divider: "ow-extension-divider";
10
+ readonly button: "ow-extension-button";
11
+ readonly input: "ow-extension-input";
12
+ readonly textarea: "ow-extension-textarea";
13
+ readonly select: "ow-extension-select";
14
+ readonly checkbox: "ow-extension-checkbox";
15
+ readonly badge: "ow-extension-badge";
16
+ readonly field: "ow-extension-field";
17
+ readonly alert: "ow-extension-alert";
18
+ };
19
+ export declare const OPENWAGGLE_EXTENSION_UI_ATTRIBUTES: {
20
+ readonly tone: "data-ow-tone";
21
+ readonly variant: "data-ow-variant";
22
+ };
23
+ export type OpenWaggleExtensionUiTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';
24
+ export type OpenWaggleExtensionUiButtonVariant = 'primary' | 'secondary' | 'ghost';
@@ -0,0 +1,22 @@
1
+ export const OPENWAGGLE_EXTENSION_UI_CLASS_NAMES = {
2
+ root: 'ow-extension-root',
3
+ panel: 'ow-extension-panel',
4
+ stack: 'ow-extension-stack',
5
+ row: 'ow-extension-row',
6
+ heading: 'ow-extension-heading',
7
+ text: 'ow-extension-text',
8
+ muted: 'ow-extension-muted',
9
+ divider: 'ow-extension-divider',
10
+ button: 'ow-extension-button',
11
+ input: 'ow-extension-input',
12
+ textarea: 'ow-extension-textarea',
13
+ select: 'ow-extension-select',
14
+ checkbox: 'ow-extension-checkbox',
15
+ badge: 'ow-extension-badge',
16
+ field: 'ow-extension-field',
17
+ alert: 'ow-extension-alert',
18
+ };
19
+ export const OPENWAGGLE_EXTENSION_UI_ATTRIBUTES = {
20
+ tone: 'data-ow-tone',
21
+ variant: 'data-ow-variant',
22
+ };
@@ -0,0 +1,8 @@
1
+ import type { OpenWaggleExtensionTheme } from './theme-types.js';
2
+ export interface CreateOpenWaggleExtensionUiStylesheetOptions {
3
+ readonly theme?: OpenWaggleExtensionTheme;
4
+ readonly scopeSelector?: string;
5
+ readonly includeThemeVariables?: boolean;
6
+ }
7
+ export declare function extensionThemeCssVariableDeclarations(theme?: OpenWaggleExtensionTheme): string;
8
+ export declare function createOpenWaggleExtensionUiStylesheet(options?: CreateOpenWaggleExtensionUiStylesheetOptions): string;
@@ -0,0 +1,223 @@
1
+ import { createOpenWaggleExtensionTheme, extensionThemeCssVariableEntries } from './theme.js';
2
+ import { OPENWAGGLE_EXTENSION_UI_ATTRIBUTES, OPENWAGGLE_EXTENSION_UI_CLASS_NAMES, } from './ui-constants.js';
3
+ const DEFAULT_UI_SCOPE_SELECTOR = `.${OPENWAGGLE_EXTENSION_UI_CLASS_NAMES.root}`;
4
+ export function extensionThemeCssVariableDeclarations(theme = createOpenWaggleExtensionTheme()) {
5
+ const declarations = [];
6
+ for (const entry of extensionThemeCssVariableEntries(theme)) {
7
+ declarations.push(` ${entry.name}: ${entry.value};`);
8
+ }
9
+ return declarations.join('\n');
10
+ }
11
+ function themeVariableRule(theme, selector) {
12
+ return `${selector} {
13
+ ${extensionThemeCssVariableDeclarations(theme)}
14
+ }`;
15
+ }
16
+ function baseUiRules(selector) {
17
+ const classes = OPENWAGGLE_EXTENSION_UI_CLASS_NAMES;
18
+ return `${selector} {
19
+ color: var(--ow-color-text);
20
+ font-family: var(--ow-font-family-sans);
21
+ font-size: 13px;
22
+ line-height: 1.45;
23
+ box-sizing: border-box;
24
+ }
25
+
26
+ ${selector} *,
27
+ ${selector} *::before,
28
+ ${selector} *::after {
29
+ box-sizing: inherit;
30
+ }
31
+
32
+ ${selector} .${classes.panel} {
33
+ background: var(--ow-color-surface);
34
+ border: 1px solid var(--ow-color-border);
35
+ border-radius: var(--ow-radius-panel);
36
+ box-shadow: var(--ow-elevation-card);
37
+ padding: var(--ow-space-lg);
38
+ }
39
+
40
+ ${selector} .${classes.stack} {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: var(--ow-space-md);
44
+ }
45
+
46
+ ${selector} .${classes.row} {
47
+ align-items: center;
48
+ display: flex;
49
+ gap: var(--ow-space-sm);
50
+ }
51
+
52
+ ${selector} .${classes.heading} {
53
+ color: var(--ow-color-text);
54
+ font-size: 14px;
55
+ font-weight: 650;
56
+ line-height: 1.25;
57
+ margin: 0;
58
+ }
59
+
60
+ ${selector} .${classes.text} {
61
+ color: var(--ow-color-text-subtle);
62
+ margin: 0;
63
+ }
64
+
65
+ ${selector} .${classes.muted} {
66
+ color: var(--ow-color-text-muted);
67
+ }
68
+
69
+ ${selector} .${classes.divider} {
70
+ background: var(--ow-color-border);
71
+ border: 0;
72
+ height: 1px;
73
+ margin: var(--ow-space-xs) 0;
74
+ }`;
75
+ }
76
+ function controlUiRules(selector) {
77
+ const classes = OPENWAGGLE_EXTENSION_UI_CLASS_NAMES;
78
+ const attributes = OPENWAGGLE_EXTENSION_UI_ATTRIBUTES;
79
+ return `${selector} .${classes.button} {
80
+ align-items: center;
81
+ background: var(--ow-color-surface-raised);
82
+ border: 1px solid var(--ow-color-border-strong);
83
+ border-radius: var(--ow-radius-md);
84
+ color: var(--ow-color-text);
85
+ cursor: pointer;
86
+ display: inline-flex;
87
+ font: inherit;
88
+ font-weight: 600;
89
+ gap: var(--ow-space-sm);
90
+ justify-content: center;
91
+ min-height: 32px;
92
+ padding: 0 var(--ow-space-md);
93
+ }
94
+
95
+ ${selector} .${classes.button}:focus-visible,
96
+ ${selector} .${classes.input}:focus-visible,
97
+ ${selector} .${classes.textarea}:focus-visible,
98
+ ${selector} .${classes.select}:focus-visible,
99
+ ${selector} .${classes.checkbox}:focus-visible {
100
+ box-shadow: var(--ow-focus-shadow);
101
+ outline: 1px solid var(--ow-focus-ring);
102
+ }
103
+
104
+ ${selector} .${classes.button}[${attributes.variant}="primary"] {
105
+ background: var(--ow-color-accent);
106
+ border-color: var(--ow-color-accent);
107
+ color: var(--ow-color-background);
108
+ }
109
+
110
+ ${selector} .${classes.button}[${attributes.variant}="ghost"] {
111
+ background: transparent;
112
+ border-color: transparent;
113
+ }
114
+
115
+ ${selector} .${classes.input},
116
+ ${selector} .${classes.textarea},
117
+ ${selector} .${classes.select} {
118
+ background: var(--ow-color-surface-raised);
119
+ border: 1px solid var(--ow-color-border-strong);
120
+ border-radius: var(--ow-radius-md);
121
+ color: var(--ow-color-text);
122
+ font: inherit;
123
+ min-height: 32px;
124
+ padding: 0 var(--ow-space-md);
125
+ }
126
+
127
+ ${selector} .${classes.textarea} {
128
+ min-height: 88px;
129
+ padding-bottom: var(--ow-space-sm);
130
+ padding-top: var(--ow-space-sm);
131
+ resize: vertical;
132
+ }
133
+
134
+ ${selector} .${classes.input}::placeholder,
135
+ ${selector} .${classes.textarea}::placeholder {
136
+ color: var(--ow-color-text-dim);
137
+ }
138
+
139
+ ${selector} .${classes.checkbox} {
140
+ accent-color: var(--ow-color-accent);
141
+ min-height: 16px;
142
+ min-width: 16px;
143
+ }`;
144
+ }
145
+ function badgeUiRules(selector) {
146
+ const classes = OPENWAGGLE_EXTENSION_UI_CLASS_NAMES;
147
+ const attributes = OPENWAGGLE_EXTENSION_UI_ATTRIBUTES;
148
+ return `${selector} .${classes.badge},
149
+ ${selector} .${classes.alert} {
150
+ align-items: center;
151
+ background: var(--ow-color-surface-raised);
152
+ border: 1px solid var(--ow-color-border);
153
+ border-radius: var(--ow-radius-sm);
154
+ color: var(--ow-color-text-muted);
155
+ display: inline-flex;
156
+ font-size: 12px;
157
+ font-weight: 600;
158
+ gap: var(--ow-space-xs);
159
+ line-height: 1;
160
+ padding: var(--ow-space-xs) var(--ow-space-sm);
161
+ }
162
+
163
+ ${selector} .${classes.alert} {
164
+ align-items: flex-start;
165
+ border-radius: var(--ow-radius-md);
166
+ line-height: 1.4;
167
+ padding: var(--ow-space-md);
168
+ }
169
+
170
+ ${selector} .${classes.badge}[${attributes.tone}="accent"],
171
+ ${selector} .${classes.alert}[${attributes.tone}="accent"] {
172
+ border-color: var(--ow-color-accent-dim);
173
+ color: var(--ow-color-accent);
174
+ }
175
+
176
+ ${selector} .${classes.badge}[${attributes.tone}="success"],
177
+ ${selector} .${classes.alert}[${attributes.tone}="success"] {
178
+ color: var(--ow-color-success);
179
+ }
180
+
181
+ ${selector} .${classes.badge}[${attributes.tone}="warning"],
182
+ ${selector} .${classes.alert}[${attributes.tone}="warning"] {
183
+ color: var(--ow-color-warning);
184
+ }
185
+
186
+ ${selector} .${classes.badge}[${attributes.tone}="danger"],
187
+ ${selector} .${classes.alert}[${attributes.tone}="danger"] {
188
+ color: var(--ow-color-danger);
189
+ }
190
+
191
+ ${selector} .${classes.badge}[${attributes.tone}="info"],
192
+ ${selector} .${classes.alert}[${attributes.tone}="info"] {
193
+ color: var(--ow-color-info);
194
+ }`;
195
+ }
196
+ function formUiRules(selector) {
197
+ const classes = OPENWAGGLE_EXTENSION_UI_CLASS_NAMES;
198
+ return `${selector} .${classes.field} {
199
+ display: flex;
200
+ flex-direction: column;
201
+ gap: var(--ow-space-xs);
202
+ }`;
203
+ }
204
+ function extensionUiRules(selector) {
205
+ return `${baseUiRules(selector)}
206
+
207
+ ${controlUiRules(selector)}
208
+
209
+ ${badgeUiRules(selector)}
210
+
211
+ ${formUiRules(selector)}`;
212
+ }
213
+ export function createOpenWaggleExtensionUiStylesheet(options = {}) {
214
+ const theme = options.theme ?? createOpenWaggleExtensionTheme();
215
+ const selector = options.scopeSelector ?? DEFAULT_UI_SCOPE_SELECTOR;
216
+ const rules = extensionUiRules(selector);
217
+ if (options.includeThemeVariables === false) {
218
+ return rules;
219
+ }
220
+ return `${themeVariableRule(theme, selector)}
221
+
222
+ ${rules}`;
223
+ }
package/dist/ui.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export type { OpenWaggleExtensionUiButtonVariant, OpenWaggleExtensionUiTone, } from './ui-constants.js';
2
+ export { OPENWAGGLE_EXTENSION_UI_ATTRIBUTES, OPENWAGGLE_EXTENSION_UI_CLASS_NAMES, } from './ui-constants.js';
3
+ export type OpenWaggleExtensionClassNamePart = string | false | null | undefined;
4
+ export declare function openWaggleExtensionClassName(...parts: readonly OpenWaggleExtensionClassNamePart[]): string;
5
+ export type { CreateOpenWaggleExtensionUiStylesheetOptions } from './ui-stylesheet.js';
6
+ export { createOpenWaggleExtensionUiStylesheet, extensionThemeCssVariableDeclarations, } from './ui-stylesheet.js';
package/dist/ui.js ADDED
@@ -0,0 +1,16 @@
1
+ export { OPENWAGGLE_EXTENSION_UI_ATTRIBUTES, OPENWAGGLE_EXTENSION_UI_CLASS_NAMES, } from './ui-constants.js';
2
+ const EMPTY_LENGTH = 0;
3
+ export function openWaggleExtensionClassName(...parts) {
4
+ const classNames = [];
5
+ for (const part of parts) {
6
+ if (typeof part !== 'string') {
7
+ continue;
8
+ }
9
+ const className = part.trim();
10
+ if (className.length > EMPTY_LENGTH) {
11
+ classNames.push(className);
12
+ }
13
+ }
14
+ return classNames.join(' ');
15
+ }
16
+ export { createOpenWaggleExtensionUiStylesheet, extensionThemeCssVariableDeclarations, } from './ui-stylesheet.js';