@oneli8/core 1.0.0-beta.10
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/AGENTS.md +16 -0
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/PRINCIPLES.md +48 -0
- package/README.md +130 -0
- package/ai-context.json +348 -0
- package/package.json +100 -0
- package/skills/oneli8-figma-to-code/SKILL.md +25 -0
- package/skills/oneli8-icons/SKILL.md +36 -0
- package/skills/oneli8-ui/SKILL.md +52 -0
- package/src/atoms/icon/icon.css +54 -0
- package/src/atoms/icon/icon.d.ts +19 -0
- package/src/atoms/icon/icon.js +81 -0
- package/src/atoms/icon/icons.generated.d.ts +48 -0
- package/src/atoms/icon/icons.generated.js +562 -0
- package/src/atoms/icon/index.d.ts +2 -0
- package/src/atoms/icon/index.js +2 -0
- package/src/atoms/index.d.ts +3 -0
- package/src/atoms/index.js +3 -0
- package/src/atoms/navigation-badge/index.d.ts +1 -0
- package/src/atoms/navigation-badge/index.js +1 -0
- package/src/atoms/navigation-badge/navigation-badge.css +35 -0
- package/src/atoms/navigation-badge/navigation-badge.d.ts +5 -0
- package/src/atoms/navigation-badge/navigation-badge.js +21 -0
- package/src/atoms/selection-indicator/index.d.ts +1 -0
- package/src/atoms/selection-indicator/index.js +1 -0
- package/src/atoms/selection-indicator/selection-indicator.css +160 -0
- package/src/atoms/selection-indicator/selection-indicator.d.ts +36 -0
- package/src/atoms/selection-indicator/selection-indicator.js +61 -0
- package/src/index.d.ts +3 -0
- package/src/index.js +3 -0
- package/src/materials/gem/gem.css +374 -0
- package/src/molecules/button/button.css +193 -0
- package/src/molecules/button/button.d.ts +51 -0
- package/src/molecules/button/button.js +134 -0
- package/src/molecules/button/index.d.ts +1 -0
- package/src/molecules/button/index.js +1 -0
- package/src/molecules/choice-chip/choice-chip.css +214 -0
- package/src/molecules/choice-chip/choice-chip.d.ts +27 -0
- package/src/molecules/choice-chip/choice-chip.js +170 -0
- package/src/molecules/choice-chip/index.d.ts +2 -0
- package/src/molecules/choice-chip/index.js +10 -0
- package/src/molecules/choice-item/choice-item.css +265 -0
- package/src/molecules/choice-item/choice-item.d.ts +54 -0
- package/src/molecules/choice-item/choice-item.js +153 -0
- package/src/molecules/choice-item/index.d.ts +1 -0
- package/src/molecules/choice-item/index.js +1 -0
- package/src/molecules/form-message/form-message.css +46 -0
- package/src/molecules/form-message/form-message.d.ts +23 -0
- package/src/molecules/form-message/form-message.js +73 -0
- package/src/molecules/form-message/index.d.ts +1 -0
- package/src/molecules/form-message/index.js +1 -0
- package/src/molecules/icon-button/icon-button.css +222 -0
- package/src/molecules/icon-button/icon-button.d.ts +40 -0
- package/src/molecules/icon-button/icon-button.js +121 -0
- package/src/molecules/icon-button/index.d.ts +1 -0
- package/src/molecules/icon-button/index.js +1 -0
- package/src/molecules/index.d.ts +10 -0
- package/src/molecules/index.js +10 -0
- package/src/molecules/link/index.d.ts +1 -0
- package/src/molecules/link/index.js +1 -0
- package/src/molecules/link/link.css +114 -0
- package/src/molecules/link/link.d.ts +27 -0
- package/src/molecules/link/link.js +76 -0
- package/src/molecules/navigation-item/index.js +1 -0
- package/src/molecules/navigation-item/navigation-item.css +153 -0
- package/src/molecules/navigation-item/navigation-item.js +95 -0
- package/src/molecules/select/index.js +1 -0
- package/src/molecules/select/select.css +31 -0
- package/src/molecules/select/select.js +127 -0
- package/src/molecules/selection-option/index.d.ts +1 -0
- package/src/molecules/selection-option/index.js +1 -0
- package/src/molecules/selection-option/selection-option.css +121 -0
- package/src/molecules/selection-option/selection-option.d.ts +42 -0
- package/src/molecules/selection-option/selection-option.js +97 -0
- package/src/molecules/text-field/index.d.ts +1 -0
- package/src/molecules/text-field/index.js +5 -0
- package/src/molecules/text-field/text-field.css +266 -0
- package/src/molecules/text-field/text-field.d.ts +69 -0
- package/src/molecules/text-field/text-field.js +234 -0
- package/src/molecules/token/index.d.ts +2 -0
- package/src/molecules/token/index.js +1 -0
- package/src/molecules/token/token.css +63 -0
- package/src/molecules/token/token.d.ts +35 -0
- package/src/molecules/token/token.js +83 -0
- package/src/organisms/choice-group/choice-group.css +93 -0
- package/src/organisms/choice-group/choice-group.d.ts +80 -0
- package/src/organisms/choice-group/choice-group.js +159 -0
- package/src/organisms/choice-group/index.d.ts +1 -0
- package/src/organisms/choice-group/index.js +1 -0
- package/src/organisms/choice-picker/choice-picker.css +98 -0
- package/src/organisms/choice-picker/choice-picker.d.ts +62 -0
- package/src/organisms/choice-picker/choice-picker.js +201 -0
- package/src/organisms/choice-picker/index.d.ts +1 -0
- package/src/organisms/choice-picker/index.js +1 -0
- package/src/organisms/combobox/combobox.css +40 -0
- package/src/organisms/combobox/combobox.js +309 -0
- package/src/organisms/combobox/index.js +5 -0
- package/src/organisms/index.d.ts +8 -0
- package/src/organisms/index.js +8 -0
- package/src/organisms/multi-select-field/index.d.ts +1 -0
- package/src/organisms/multi-select-field/index.js +1 -0
- package/src/organisms/multi-select-field/multi-select-field.css +76 -0
- package/src/organisms/multi-select-field/multi-select-field.d.ts +64 -0
- package/src/organisms/multi-select-field/multi-select-field.js +317 -0
- package/src/organisms/navigation-keys.js +58 -0
- package/src/organisms/segmented-control/index.d.ts +1 -0
- package/src/organisms/segmented-control/index.js +1 -0
- package/src/organisms/segmented-control/segmented-control.css +113 -0
- package/src/organisms/segmented-control/segmented-control.d.ts +43 -0
- package/src/organisms/segmented-control/segmented-control.js +163 -0
- package/src/organisms/selection-popup/index.js +1 -0
- package/src/organisms/selection-popup/selection-popup.css +90 -0
- package/src/organisms/selection-popup/selection-popup.js +100 -0
- package/src/organisms/tab-bar/index.d.ts +1 -0
- package/src/organisms/tab-bar/index.js +1 -0
- package/src/organisms/tab-bar/tab-bar.css +45 -0
- package/src/organisms/tab-bar/tab-bar.d.ts +37 -0
- package/src/organisms/tab-bar/tab-bar.js +104 -0
- package/src/organisms/tabs/index.d.ts +1 -0
- package/src/organisms/tabs/index.js +1 -0
- package/src/organisms/tabs/tabs.css +53 -0
- package/src/organisms/tabs/tabs.d.ts +48 -0
- package/src/organisms/tabs/tabs.js +152 -0
- package/styles.css +29 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oneli8 · Icon atom — headless behavior.
|
|
3
|
+
*
|
|
4
|
+
* Two entry points, one output:
|
|
5
|
+
* renderIcon(name, opts) -> markup string (build time / SSR)
|
|
6
|
+
* hydrateIcons(root) -> fills in [data-ol8-icon] placeholders (runtime)
|
|
7
|
+
*
|
|
8
|
+
* Icons render INLINE (never <img>) because the Figma contract says the consumer
|
|
9
|
+
* supplies semantic color — that needs `currentColor`, which <img> cannot inherit.
|
|
10
|
+
*/
|
|
11
|
+
import { OL8_ICONS, OL8_ICON_VIEWBOX } from './icons.generated.js';
|
|
12
|
+
|
|
13
|
+
/** Universal sizes from the Figma "Icon Frame" (418:51). */
|
|
14
|
+
export const OL8_ICON_SIZES = [9, 12, 18, 24, 30, 36, 48, 60, 72, 96, 108];
|
|
15
|
+
|
|
16
|
+
/** @param {string} name */
|
|
17
|
+
export function isOl8IconName(name) {
|
|
18
|
+
return Object.hasOwn(OL8_ICONS, name);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** The inner leaf only — the <svg>, in canonical 24-unit source space. */
|
|
22
|
+
export function renderIconSvg(name) {
|
|
23
|
+
if (!isOl8IconName(name)) throw new Error(`[ol8] unknown icon "${name}"`);
|
|
24
|
+
return `<svg viewBox="${OL8_ICON_VIEWBOX}" fill="none" focusable="false">${OL8_ICONS[name].body}</svg>`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** The complete atom: outer box + leaf. */
|
|
28
|
+
export function renderIcon(name, options = {}) {
|
|
29
|
+
if (!isOl8IconName(name)) throw new Error(`[ol8] unknown icon "${name}"`);
|
|
30
|
+
const { size = 24, label, className } = options;
|
|
31
|
+
if (!OL8_ICON_SIZES.includes(size)) {
|
|
32
|
+
throw new Error(`[ol8] size ${size} is not an Icon Frame universal size (${OL8_ICON_SIZES.join(', ')})`);
|
|
33
|
+
}
|
|
34
|
+
const entry = OL8_ICONS[name];
|
|
35
|
+
const attrs = [
|
|
36
|
+
`class="ol8-icon${className ? ` ${className}` : ''}"`,
|
|
37
|
+
`data-ol8-icon="${name}"`,
|
|
38
|
+
`data-ol8-icon-size="${size}"`,
|
|
39
|
+
entry.mirrorInRTL ? 'data-ol8-icon-mirror="true"' : '',
|
|
40
|
+
label ? `role="img" aria-label="${escapeAttr(label)}"` : 'aria-hidden="true"',
|
|
41
|
+
].filter(Boolean).join(' ');
|
|
42
|
+
return `<span ${attrs}>${renderIconSvg(name)}</span>`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Upgrades every `[data-ol8-icon]` placeholder under `root` in place. Idempotent.
|
|
47
|
+
* <span data-ol8-icon="add" data-ol8-icon-size="18"></span>
|
|
48
|
+
* <span data-ol8-icon="close" data-ol8-icon-label="Dismiss"></span>
|
|
49
|
+
*/
|
|
50
|
+
export function hydrateIcons(root = document) {
|
|
51
|
+
for (const el of root.querySelectorAll('[data-ol8-icon]')) {
|
|
52
|
+
if (el.dataset.ol8IconHydrated === 'true') continue;
|
|
53
|
+
const name = el.dataset.ol8Icon ?? '';
|
|
54
|
+
if (!isOl8IconName(name)) { console.warn(`[ol8] unknown icon "${name}"`, el); continue; }
|
|
55
|
+
|
|
56
|
+
const entry = OL8_ICONS[name];
|
|
57
|
+
const label = el.dataset.ol8IconLabel;
|
|
58
|
+
|
|
59
|
+
el.classList.add('ol8-icon');
|
|
60
|
+
if (!el.dataset.ol8IconSize) el.dataset.ol8IconSize = '24';
|
|
61
|
+
if (entry.mirrorInRTL) el.dataset.ol8IconMirror = 'true';
|
|
62
|
+
|
|
63
|
+
if (label) {
|
|
64
|
+
el.setAttribute('role', 'img');
|
|
65
|
+
el.setAttribute('aria-label', label);
|
|
66
|
+
el.removeAttribute('aria-hidden');
|
|
67
|
+
} else {
|
|
68
|
+
el.setAttribute('aria-hidden', 'true');
|
|
69
|
+
el.removeAttribute('role');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
el.innerHTML = renderIconSvg(name);
|
|
73
|
+
el.dataset.ol8IconHydrated = 'true';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function escapeAttr(value) {
|
|
78
|
+
return String(value).replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { OL8_ICONS };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// GENERATED by packages/sync/src/build-icons.mjs — do not edit by hand.
|
|
2
|
+
// Source: Figma "Oneli8 Design System — 1.0.0-beta.1", page Iconography,
|
|
3
|
+
// frame "Icon Library / Masters" (426:55). Re-run `npm run sync:icons`.
|
|
4
|
+
|
|
5
|
+
export interface Ol8IconEntry {
|
|
6
|
+
/** Figma category segment: "Icon / <Category> / <Name>". */
|
|
7
|
+
readonly category: 'action' | 'navigation' | 'status' | 'selection'
|
|
8
|
+
| 'transport' | 'vitals' | 'maneuver';
|
|
9
|
+
/** Node id of the 24px master in Figma, or null while it is a candidate. */
|
|
10
|
+
readonly figmaNode: string | null;
|
|
11
|
+
/** True until the master is approved and mapped to a Figma node. */
|
|
12
|
+
readonly candidate?: boolean;
|
|
13
|
+
/** Semantic registry controls RTL mirroring (per Iconography documentation). */
|
|
14
|
+
readonly mirrorInRTL: boolean;
|
|
15
|
+
/** The ink Figma baked into the master, discarded in favour of currentColor. */
|
|
16
|
+
readonly sourceInk: string | null;
|
|
17
|
+
/** Drawing instructions in the canonical 24-unit source space. */
|
|
18
|
+
readonly body: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export declare const OL8_ICON_VIEWBOX: '0 0 24 24';
|
|
22
|
+
export declare const OL8_ICONS: {
|
|
23
|
+
readonly "add": Ol8IconEntry;
|
|
24
|
+
readonly "caution": Ol8IconEntry;
|
|
25
|
+
readonly "check": Ol8IconEntry;
|
|
26
|
+
readonly "chevron-down": Ol8IconEntry;
|
|
27
|
+
readonly "chevron-up": Ol8IconEntry;
|
|
28
|
+
readonly "clear": Ol8IconEntry;
|
|
29
|
+
readonly "close": Ol8IconEntry;
|
|
30
|
+
readonly "copy": Ol8IconEntry;
|
|
31
|
+
readonly "critical": Ol8IconEntry;
|
|
32
|
+
readonly "forward": Ol8IconEntry;
|
|
33
|
+
readonly "heart": Ol8IconEntry;
|
|
34
|
+
readonly "informative": Ol8IconEntry;
|
|
35
|
+
readonly "loading": Ol8IconEntry;
|
|
36
|
+
readonly "maneuver-right": Ol8IconEntry;
|
|
37
|
+
readonly "mixed": Ol8IconEntry;
|
|
38
|
+
readonly "pause": Ol8IconEntry;
|
|
39
|
+
readonly "play": Ol8IconEntry;
|
|
40
|
+
readonly "positive": Ol8IconEntry;
|
|
41
|
+
readonly "search": Ol8IconEntry;
|
|
42
|
+
readonly "selected-dot": Ol8IconEntry;
|
|
43
|
+
readonly "skip-back": Ol8IconEntry;
|
|
44
|
+
readonly "skip-forward": Ol8IconEntry;
|
|
45
|
+
readonly "visibility-closed": Ol8IconEntry;
|
|
46
|
+
readonly "visibility-open": Ol8IconEntry;
|
|
47
|
+
};
|
|
48
|
+
export type Ol8IconName = keyof typeof OL8_ICONS;
|