@amaster.ai/pi-lark 0.1.6 → 0.1.7
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 +5 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/skills/lark-apps/SKILL.md +24 -12
- package/skills/lark-apps/creative-design/agents/assets/vision-probe.png +0 -0
- package/skills/lark-apps/creative-design/agents/fork-verifier-agent.md +71 -0
- package/skills/lark-apps/creative-design/agents/vision-probe-agent.md +41 -0
- package/skills/lark-apps/creative-design/assets/index.html +27 -0
- package/skills/lark-apps/creative-design/creative-design.md +239 -0
- package/skills/lark-apps/creative-design/references/aily.md +39 -0
- package/skills/lark-apps/creative-design/references/animated-video.md +34 -0
- package/skills/lark-apps/creative-design/references/charts.md +165 -0
- package/skills/lark-apps/creative-design/references/claude.md +36 -0
- package/skills/lark-apps/creative-design/references/codex.md +32 -0
- package/skills/lark-apps/creative-design/references/data-report.md +108 -0
- package/skills/lark-apps/creative-design/references/frontend-design.md +71 -0
- package/skills/lark-apps/creative-design/references/hi-fi-design.md +32 -0
- package/skills/lark-apps/creative-design/references/interactive-prototype.md +24 -0
- package/skills/lark-apps/creative-design/references/make-a-deck.md +133 -0
- package/skills/lark-apps/creative-design/references/visual-exposure.md +82 -0
- package/skills/lark-apps/creative-design/references/wireframe.md +14 -0
- package/skills/lark-apps/creative-design/starter-components/android-frame.jsx +188 -0
- package/skills/lark-apps/creative-design/starter-components/animations.jsx +773 -0
- package/skills/lark-apps/creative-design/starter-components/browser-window.jsx +122 -0
- package/skills/lark-apps/creative-design/starter-components/deck-stage.js +2483 -0
- package/skills/lark-apps/creative-design/starter-components/design-canvas.jsx +1432 -0
- package/skills/lark-apps/creative-design/starter-components/ios-frame.jsx +270 -0
- package/skills/lark-apps/creative-design/starter-components/macos-window.jsx +197 -0
- package/skills/lark-apps/creative-design/starter-components/tweaks-panel.jsx +752 -0
- package/skills/lark-apps/references/lark-apps-automation.md +80 -2
- package/skills/lark-apps/references/lark-apps-cache.md +61 -0
- package/skills/lark-apps/references/lark-apps-cloud-dev.md +0 -1
- package/skills/lark-apps/references/lark-apps-create.md +1 -2
- package/skills/lark-apps/references/lark-apps-db.md +1 -1
- package/skills/lark-apps/references/lark-apps-env-pull.md +1 -1
- package/skills/lark-apps/references/lark-apps-file.md +2 -2
- package/skills/lark-apps/references/lark-apps-git-credential.md +1 -1
- package/skills/lark-apps/references/lark-apps-html-publish.md +4 -8
- package/skills/lark-apps/references/lark-apps-init.md +1 -1
- package/skills/lark-apps/references/lark-apps-list.md +1 -1
- package/skills/lark-apps/references/lark-apps-local-dev.md +54 -11
- package/skills/lark-apps/references/lark-apps-openapi-key.md +1 -1
- package/skills/lark-apps/references/lark-apps-release-create.md +2 -2
- package/skills/lark-apps/references/lark-apps-release-get.md +3 -3
- package/skills/lark-base/SKILL.md +20 -13
- package/skills/lark-base/references/lark-base-cell-value.md +3 -3
- package/skills/lark-base/references/lark-base-data-query.md +11 -4
- package/skills/lark-base/references/lark-base-field-create.md +4 -0
- package/skills/lark-base/references/lark-base-field-json.md +4 -4
- package/skills/lark-base/references/lark-base-field-update.md +17 -1
- package/skills/lark-base/references/lark-base-filter-condition.md +179 -0
- package/skills/lark-base/references/lark-base-form-questions-create.md +40 -7
- package/skills/lark-base/references/lark-base-form-questions-update.md +73 -20
- package/skills/lark-base/references/lark-base-form-submit.md +16 -7
- package/skills/lark-base/references/lark-base-record-batch-create.md +12 -10
- package/skills/lark-base/references/lark-base-record-batch-update.md +11 -9
- package/skills/lark-base/references/lark-base-record-upsert.md +1 -1
- package/skills/lark-base/references/lark-base-role-guide.md +11 -0
- package/skills/lark-base/references/lark-base-view-set-filter.md +11 -137
- package/skills/lark-base/references/role-config.md +31 -5
- package/skills/lark-calendar/SKILL.md +14 -8
- package/skills/lark-calendar/references/lark-calendar-create.md +6 -5
- package/skills/lark-calendar/references/lark-calendar-recurring.md +1 -0
- package/skills/lark-calendar/references/lark-calendar-room-find.md +2 -1
- package/skills/lark-calendar/references/lark-calendar-schedule-clear-time.md +1 -0
- package/skills/lark-calendar/references/lark-calendar-suggestion.md +1 -1
- package/skills/lark-calendar/references/lark-calendar-update.md +10 -4
- package/skills/lark-contact/SKILL.md +19 -3
- package/skills/lark-contact/references/lark-contact-search-bot.md +60 -0
- package/skills/lark-doc/references/lark-doc-fetch.md +10 -2
- package/skills/lark-doc/references/lark-doc-whiteboard.md +9 -8
- package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +41 -0
- package/skills/lark-doc/references/lark-doc-xml.md +4 -3
- package/skills/lark-drive/SKILL.md +25 -45
- package/skills/lark-drive/references/lark-drive-add-comment.md +2 -4
- package/skills/lark-drive/references/lark-drive-add-reply.md +47 -0
- package/skills/lark-drive/references/lark-drive-apply-permission.md +2 -2
- package/skills/lark-drive/references/lark-drive-batch-query-comments.md +46 -0
- package/skills/lark-drive/references/lark-drive-comment-content.md +50 -0
- package/skills/lark-drive/references/lark-drive-comment-location.md +9 -15
- package/skills/lark-drive/references/lark-drive-delete-reply.md +48 -0
- package/skills/lark-drive/references/lark-drive-download.md +5 -1
- package/skills/lark-drive/references/lark-drive-list-comments.md +25 -68
- package/skills/lark-drive/references/lark-drive-list-replies.md +54 -0
- package/skills/lark-drive/references/lark-drive-member-add.md +2 -2
- package/skills/lark-drive/references/lark-drive-member-list.md +65 -0
- package/skills/lark-drive/references/lark-drive-permission-get-setting.md +48 -0
- package/skills/lark-drive/references/lark-drive-preview.md +11 -1
- package/skills/lark-drive/references/lark-drive-react-reply.md +51 -0
- package/skills/lark-drive/references/lark-drive-reactions.md +27 -25
- package/skills/lark-drive/references/lark-drive-resolve-comment.md +45 -0
- package/skills/lark-drive/references/lark-drive-restore-comment.md +46 -0
- package/skills/lark-drive/references/lark-drive-search.md +7 -1
- package/skills/lark-drive/references/lark-drive-secure-label.md +1 -1
- package/skills/lark-drive/references/lark-drive-update-reply.md +46 -0
- package/skills/lark-drive/references/lark-drive-upload.md +1 -0
- package/skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md +38 -8
- package/skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md +10 -10
- package/skills/lark-drive/references/lark-drive-workflow-permission-governance.md +22 -20
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md +273 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md +202 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md +231 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md +248 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md +174 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md +202 -0
- package/skills/lark-drive/references/lark-drive-workflow.md +5 -4
- package/skills/lark-event/SKILL.md +1 -0
- package/skills/lark-event/references/lark-event-application.md +38 -0
- package/skills/lark-im/SKILL.md +1 -1
- package/skills/lark-im/references/card/card-2.0-schema.md +1 -1
- package/skills/lark-im/references/card/lark-im-card-style.md +4 -4
- package/skills/lark-im/references/card/resource/icons.md +14 -0
- package/skills/lark-im/references/lark-im-flag-list.md +8 -7
- package/skills/lark-okr/SKILL.md +71 -26
- package/skills/lark-okr/references/lark-okr-batch-create.md +19 -18
- package/skills/lark-okr/references/lark-okr-create.md +173 -0
- package/skills/lark-okr/references/lark-okr-cycle-list.md +17 -7
- package/skills/lark-okr/references/lark-okr-entities.md +1 -0
- package/skills/lark-okr/references/lark-okr-indicator-update.md +3 -1
- package/skills/lark-okr/references/lark-okr-indicators.md +61 -12
- package/skills/lark-okr/references/lark-okr-progress-list.md +21 -9
- package/skills/lark-slides/SKILL.md +115 -68
- package/skills/lark-slides/references/asset-planning.md +6 -4
- package/skills/lark-slides/references/iconpark.md +2 -2
- package/skills/lark-slides/references/lark-slides-create.md +16 -8
- package/skills/lark-slides/references/lark-slides-history.md +132 -0
- package/skills/lark-slides/references/lark-slides-media-upload.md +2 -3
- package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +7 -11
- package/skills/lark-slides/references/lark-slides-replace-slide.md +0 -3
- package/skills/lark-slides/references/lark-slides-screenshot.md +4 -4
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +219 -0
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +6 -5
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +2 -2
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +2 -3
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +65 -30
- package/skills/lark-slides/references/planning-layer.md +11 -10
- package/skills/lark-slides/references/slides_chart_demo.xml +1416 -1
- package/skills/lark-slides/references/slides_xml_schema_definition.xml +492 -76
- package/skills/lark-slides/references/troubleshooting.md +25 -7
- package/skills/lark-slides/references/validation-checklist.md +53 -16
- package/skills/lark-slides/references/visual-planning.md +25 -22
- package/skills/lark-slides/references/xml-schema-quick-ref.md +281 -45
- package/skills/lark-slides/scripts/sxsd_validator.py +908 -0
- package/skills/lark-slides/scripts/xml_text_overlap_lint.py +1650 -165
- package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +3139 -513
- package/skills/lark-task/SKILL.md +7 -0
- package/skills/lark-task/references/lark-task-complete.md +6 -2
- package/skills/lark-task/references/lark-task-create.md +9 -0
- package/skills/lark-task/references/lark-task-update.md +6 -2
- package/skills/lark-whiteboard/SKILL.md +13 -12
- package/skills/lark-whiteboard/elements/layout.md +1 -1
- package/skills/lark-whiteboard/elements/schema.md +2 -2
- package/skills/lark-whiteboard/references/{lark-whiteboard-query.md → lark-whiteboard-export.md} +15 -15
- package/skills/lark-whiteboard/references/lark-whiteboard-update.md +3 -3
- package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +7 -17
- package/skills/lark-whiteboard/routes/dsl.md +3 -3
- package/skills/lark-whiteboard/routes/mermaid.md +2 -2
- package/skills/lark-whiteboard/routes/svg-edit.md +4 -4
- package/skills/lark-whiteboard/routes/svg.md +11 -6
- package/skills/lark-whiteboard/scenes/bar-chart.md +1 -1
- package/skills/lark-whiteboard/scenes/fishbone.md +1 -1
- package/skills/lark-whiteboard/scenes/flywheel.md +1 -1
- package/skills/lark-whiteboard/scenes/line-chart.md +1 -1
- package/skills/lark-whiteboard/scenes/treemap.md +1 -1
- package/skills/lark-wiki/SKILL.md +1 -0
- package/skills/lark-drive/references/lark-drive-comments-guide.md +0 -80
- package/skills/lark-slides/references/examples.md +0 -91
- package/skills/lark-slides/references/lark-slides-whiteboard.md +0 -331
- package/skills/lark-slides/references/lark-slides-xml-get.md +0 -100
- package/skills/lark-slides/references/slide-templates.md +0 -201
- package/skills/lark-slides/references/slides_demo.xml +0 -226
- package/skills/lark-slides/references/xml-format-guide.md +0 -433
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/* BEGIN USAGE */
|
|
2
|
+
// iOS.jsx — Simplified iOS 26 (Liquid Glass) device frame
|
|
3
|
+
// Based on the iOS 26 UI Kit + Figma status bar spec. No assets, no deps.
|
|
4
|
+
// Exports (to window): IOSDevice, IOSStatusBar, IOSList, IOSListRow, IOSKeyboard
|
|
5
|
+
//
|
|
6
|
+
// Usage — wrap your screen content in <IOSDevice> to get the bezel, status bar
|
|
7
|
+
// and home indicator (props: width=402, height=874, dark, keyboard):
|
|
8
|
+
//
|
|
9
|
+
// <IOSDevice>
|
|
10
|
+
// ...your screen content...
|
|
11
|
+
// </IOSDevice>
|
|
12
|
+
// <IOSDevice dark keyboard>…</IOSDevice>
|
|
13
|
+
// <IOSDevice width={390} height={844}>…</IOSDevice> // smaller device size
|
|
14
|
+
//
|
|
15
|
+
// Safe areas — REQUIRED on every screen. The status bar (top) and home
|
|
16
|
+
// indicator (bottom) float OVER your content; inset it or it overlaps them.
|
|
17
|
+
// --ios-safe-top top inset (Dynamic Island + status bar)
|
|
18
|
+
// --ios-safe-bottom bottom inset (home indicator)
|
|
19
|
+
/* END USAGE */
|
|
20
|
+
|
|
21
|
+
// ─────────────────────────────────────────────────────────────
|
|
22
|
+
// Status bar
|
|
23
|
+
// ─────────────────────────────────────────────────────────────
|
|
24
|
+
function IOSStatusBar({ dark = false, time = '9:41' }) {
|
|
25
|
+
const c = dark ? '#fff' : '#000';
|
|
26
|
+
return (
|
|
27
|
+
<div style={{
|
|
28
|
+
display: 'flex', gap: 154, alignItems: 'center', justifyContent: 'center',
|
|
29
|
+
padding: '21px 24px 19px', boxSizing: 'border-box',
|
|
30
|
+
position: 'relative', zIndex: 20, width: '100%',
|
|
31
|
+
}}>
|
|
32
|
+
<div style={{ flex: 1, height: 22, display: 'flex', alignItems: 'center', justifyContent: 'center', paddingTop: 1.5 }}>
|
|
33
|
+
<span style={{
|
|
34
|
+
fontFamily: '-apple-system, "SF Pro", system-ui', fontWeight: 590,
|
|
35
|
+
fontSize: 17, lineHeight: '22px', color: c,
|
|
36
|
+
}}>{time}</span>
|
|
37
|
+
</div>
|
|
38
|
+
<div style={{ flex: 1, height: 22, display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 7, paddingTop: 1, paddingRight: 1 }}>
|
|
39
|
+
<svg width="19" height="12" viewBox="0 0 19 12">
|
|
40
|
+
<rect x="0" y="7.5" width="3.2" height="4.5" rx="0.7" fill={c}/>
|
|
41
|
+
<rect x="4.8" y="5" width="3.2" height="7" rx="0.7" fill={c}/>
|
|
42
|
+
<rect x="9.6" y="2.5" width="3.2" height="9.5" rx="0.7" fill={c}/>
|
|
43
|
+
<rect x="14.4" y="0" width="3.2" height="12" rx="0.7" fill={c}/>
|
|
44
|
+
</svg>
|
|
45
|
+
<svg width="17" height="12" viewBox="0 0 17 12">
|
|
46
|
+
<path d="M8.5 3.2C10.8 3.2 12.9 4.1 14.4 5.6L15.5 4.5C13.7 2.7 11.2 1.5 8.5 1.5C5.8 1.5 3.3 2.7 1.5 4.5L2.6 5.6C4.1 4.1 6.2 3.2 8.5 3.2Z" fill={c}/>
|
|
47
|
+
<path d="M8.5 6.8C9.9 6.8 11.1 7.3 12 8.2L13.1 7.1C11.8 5.9 10.2 5.1 8.5 5.1C6.8 5.1 5.2 5.9 3.9 7.1L5 8.2C5.9 7.3 7.1 6.8 8.5 6.8Z" fill={c}/>
|
|
48
|
+
<circle cx="8.5" cy="10.5" r="1.5" fill={c}/>
|
|
49
|
+
</svg>
|
|
50
|
+
<svg width="27" height="13" viewBox="0 0 27 13">
|
|
51
|
+
<rect x="0.5" y="0.5" width="23" height="12" rx="3.5" stroke={c} strokeOpacity="0.35" fill="none"/>
|
|
52
|
+
<rect x="2" y="2" width="20" height="9" rx="2" fill={c}/>
|
|
53
|
+
<path d="M25 4.5V8.5C25.8 8.2 26.5 7.2 26.5 6.5C26.5 5.8 25.8 4.8 25 4.5Z" fill={c} fillOpacity="0.4"/>
|
|
54
|
+
</svg>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ─────────────────────────────────────────────────────────────
|
|
61
|
+
// Grouped list (inset card, r:26) + row (52px)
|
|
62
|
+
// ─────────────────────────────────────────────────────────────
|
|
63
|
+
function IOSListRow({ title, detail, icon, chevron = true, isLast = false, dark = false }) {
|
|
64
|
+
const text = dark ? '#fff' : '#000';
|
|
65
|
+
const sec = dark ? 'rgba(235,235,245,0.6)' : 'rgba(60,60,67,0.6)';
|
|
66
|
+
const ter = dark ? 'rgba(235,235,245,0.3)' : 'rgba(60,60,67,0.3)';
|
|
67
|
+
const sep = dark ? 'rgba(84,84,88,0.65)' : 'rgba(60,60,67,0.12)';
|
|
68
|
+
return (
|
|
69
|
+
<div style={{
|
|
70
|
+
display: 'flex', alignItems: 'center', minHeight: 52,
|
|
71
|
+
padding: '0 16px', position: 'relative',
|
|
72
|
+
fontFamily: '-apple-system, system-ui', fontSize: 17,
|
|
73
|
+
letterSpacing: -0.43,
|
|
74
|
+
}}>
|
|
75
|
+
{icon && (
|
|
76
|
+
<div style={{
|
|
77
|
+
width: 30, height: 30, borderRadius: 7, background: icon,
|
|
78
|
+
marginRight: 12, flexShrink: 0,
|
|
79
|
+
}} />
|
|
80
|
+
)}
|
|
81
|
+
<div style={{ flex: 1, color: text }}>{title}</div>
|
|
82
|
+
{detail && <span style={{ color: sec, marginRight: 6 }}>{detail}</span>}
|
|
83
|
+
{chevron && (
|
|
84
|
+
<svg width="8" height="14" viewBox="0 0 8 14" style={{ flexShrink: 0 }}>
|
|
85
|
+
<path d="M1 1l6 6-6 6" stroke={ter} strokeWidth="2" fill="none" strokeLinecap="round" strokeLinejoin="round"/>
|
|
86
|
+
</svg>
|
|
87
|
+
)}
|
|
88
|
+
{!isLast && (
|
|
89
|
+
<div style={{
|
|
90
|
+
position: 'absolute', bottom: 0, right: 0,
|
|
91
|
+
left: icon ? 58 : 16, height: 0.5, background: sep,
|
|
92
|
+
}} />
|
|
93
|
+
)}
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function IOSList({ header, children, dark = false }) {
|
|
99
|
+
const hc = dark ? 'rgba(235,235,245,0.6)' : 'rgba(60,60,67,0.6)';
|
|
100
|
+
const bg = dark ? '#1C1C1E' : '#fff';
|
|
101
|
+
return (
|
|
102
|
+
<div>
|
|
103
|
+
{header && (
|
|
104
|
+
<div style={{
|
|
105
|
+
fontFamily: '-apple-system, system-ui', fontSize: 13,
|
|
106
|
+
color: hc, textTransform: 'uppercase',
|
|
107
|
+
padding: '8px 36px 6px', letterSpacing: -0.08,
|
|
108
|
+
}}>{header}</div>
|
|
109
|
+
)}
|
|
110
|
+
<div style={{
|
|
111
|
+
background: bg, borderRadius: 26,
|
|
112
|
+
margin: '0 16px', overflow: 'hidden',
|
|
113
|
+
}}>{children}</div>
|
|
114
|
+
</div>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// ─────────────────────────────────────────────────────────────
|
|
119
|
+
// Device frame
|
|
120
|
+
// ─────────────────────────────────────────────────────────────
|
|
121
|
+
function IOSDevice({
|
|
122
|
+
children, width = 402, height = 874, dark = false,
|
|
123
|
+
keyboard = false,
|
|
124
|
+
}) {
|
|
125
|
+
return (
|
|
126
|
+
<div style={{
|
|
127
|
+
width, height, borderRadius: 48, overflow: 'hidden',
|
|
128
|
+
position: 'relative', background: dark ? '#000' : '#F2F2F7',
|
|
129
|
+
border: '1px solid #DEE0E3',
|
|
130
|
+
fontFamily: '-apple-system, system-ui, sans-serif',
|
|
131
|
+
WebkitFontSmoothing: 'antialiased',
|
|
132
|
+
'--ios-safe-top': '62px',
|
|
133
|
+
'--ios-safe-bottom': '34px',
|
|
134
|
+
}}>
|
|
135
|
+
{/* dynamic island */}
|
|
136
|
+
<div style={{
|
|
137
|
+
position: 'absolute', top: 11, left: '50%', transform: 'translateX(-50%)',
|
|
138
|
+
width: 126, height: 37, borderRadius: 24, background: '#000', zIndex: 50,
|
|
139
|
+
}} />
|
|
140
|
+
{/* status bar (absolute) */}
|
|
141
|
+
<div style={{ position: 'absolute', top: 0, left: 0, right: 0, zIndex: 10 }}>
|
|
142
|
+
<IOSStatusBar dark={dark} />
|
|
143
|
+
</div>
|
|
144
|
+
{/* content */}
|
|
145
|
+
<div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
|
|
146
|
+
<div style={{ flex: 1, overflow: 'auto' }}>{children}</div>
|
|
147
|
+
{keyboard && <IOSKeyboard dark={dark} />}
|
|
148
|
+
</div>
|
|
149
|
+
{/* home indicator — always on top */}
|
|
150
|
+
<div style={{
|
|
151
|
+
position: 'absolute', bottom: 0, left: 0, right: 0, zIndex: 60,
|
|
152
|
+
height: 34, display: 'flex', justifyContent: 'center', alignItems: 'flex-end',
|
|
153
|
+
paddingBottom: 8, pointerEvents: 'none',
|
|
154
|
+
}}>
|
|
155
|
+
<div style={{
|
|
156
|
+
width: 139, height: 5, borderRadius: 100,
|
|
157
|
+
background: dark ? 'rgba(255,255,255,0.7)' : 'rgba(0,0,0,0.25)',
|
|
158
|
+
}} />
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ─────────────────────────────────────────────────────────────
|
|
165
|
+
// Keyboard — iOS 26 liquid glass
|
|
166
|
+
// ─────────────────────────────────────────────────────────────
|
|
167
|
+
function IOSKeyboard({ dark = false }) {
|
|
168
|
+
const glyph = dark ? 'rgba(255,255,255,0.7)' : '#595959';
|
|
169
|
+
const sugg = dark ? 'rgba(255,255,255,0.6)' : '#333';
|
|
170
|
+
const keyBg = dark ? 'rgba(255,255,255,0.22)' : 'rgba(255,255,255,0.85)';
|
|
171
|
+
|
|
172
|
+
// special-key icons
|
|
173
|
+
const icons = {
|
|
174
|
+
shift: <svg width="19" height="17" viewBox="0 0 19 17"><path d="M9.5 1L1 9.5h4.5V16h8V9.5H18L9.5 1z" fill={glyph}/></svg>,
|
|
175
|
+
del: <svg width="23" height="17" viewBox="0 0 23 17"><path d="M7 1h13a2 2 0 012 2v11a2 2 0 01-2 2H7l-6-7.5L7 1z" fill="none" stroke={glyph} strokeWidth="1.6" strokeLinejoin="round"/><path d="M10 5l7 7M17 5l-7 7" stroke={glyph} strokeWidth="1.6" strokeLinecap="round"/></svg>,
|
|
176
|
+
ret: <svg width="20" height="14" viewBox="0 0 20 14"><path d="M18 1v6H4m0 0l4-4M4 7l4 4" fill="none" stroke="#fff" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/></svg>,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const key = (content, { w, flex, ret, fs = 25, k } = {}) => (
|
|
180
|
+
<div key={k} style={{
|
|
181
|
+
height: 42, borderRadius: 8.5,
|
|
182
|
+
flex: flex ? 1 : undefined, width: w, minWidth: 0,
|
|
183
|
+
background: ret ? '#08f' : keyBg,
|
|
184
|
+
boxShadow: '0 1px 0 rgba(0,0,0,0.075)',
|
|
185
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
186
|
+
fontFamily: '-apple-system, "SF Compact", system-ui',
|
|
187
|
+
fontSize: fs, fontWeight: 458, color: ret ? '#fff' : glyph,
|
|
188
|
+
}}>{content}</div>
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
const row = (keys, pad = 0) => (
|
|
192
|
+
<div style={{ display: 'flex', gap: 6.5, justifyContent: 'center', padding: `0 ${pad}px` }}>
|
|
193
|
+
{keys.map(l => key(l, { flex: true, k: l }))}
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
return (
|
|
198
|
+
<div style={{
|
|
199
|
+
position: 'relative', zIndex: 15, borderRadius: 27, overflow: 'hidden',
|
|
200
|
+
padding: '11px 0 2px',
|
|
201
|
+
display: 'flex', flexDirection: 'column', alignItems: 'center',
|
|
202
|
+
boxShadow: dark
|
|
203
|
+
? '0 -2px 20px rgba(0,0,0,0.09)'
|
|
204
|
+
: '0 -1px 6px rgba(0,0,0,0.018), 0 -3px 20px rgba(0,0,0,0.012)',
|
|
205
|
+
}}>
|
|
206
|
+
{/* liquid glass bg — same recipe as nav pills */}
|
|
207
|
+
<div style={{
|
|
208
|
+
position: 'absolute', inset: 0, borderRadius: 27,
|
|
209
|
+
backdropFilter: 'blur(12px) saturate(180%)',
|
|
210
|
+
WebkitBackdropFilter: 'blur(12px) saturate(180%)',
|
|
211
|
+
background: dark ? 'rgba(120,120,128,0.14)' : 'rgba(255,255,255,0.25)',
|
|
212
|
+
}} />
|
|
213
|
+
<div style={{
|
|
214
|
+
position: 'absolute', inset: 0, borderRadius: 27,
|
|
215
|
+
boxShadow: dark
|
|
216
|
+
? 'inset 1.5px 1.5px 1px rgba(255,255,255,0.15)'
|
|
217
|
+
: 'inset 1.5px 1.5px 1px rgba(255,255,255,0.7), inset -1px -1px 1px rgba(255,255,255,0.4)',
|
|
218
|
+
border: dark ? '0.5px solid rgba(255,255,255,0.15)' : '0.5px solid rgba(0,0,0,0.06)',
|
|
219
|
+
pointerEvents: 'none',
|
|
220
|
+
}} />
|
|
221
|
+
|
|
222
|
+
{/* autocorrect bar */}
|
|
223
|
+
<div style={{
|
|
224
|
+
display: 'flex', gap: 20, alignItems: 'center',
|
|
225
|
+
padding: '8px 22px 13px', width: '100%', boxSizing: 'border-box',
|
|
226
|
+
position: 'relative',
|
|
227
|
+
}}>
|
|
228
|
+
{['"The"', 'the', 'to'].map((w, i) => (
|
|
229
|
+
<React.Fragment key={i}>
|
|
230
|
+
{i > 0 && <div style={{ width: 1, height: 25, background: '#ccc', opacity: 0.3 }} />}
|
|
231
|
+
<div style={{
|
|
232
|
+
flex: 1, textAlign: 'center',
|
|
233
|
+
fontFamily: '-apple-system, system-ui', fontSize: 17,
|
|
234
|
+
color: sugg, letterSpacing: -0.43, lineHeight: '22px',
|
|
235
|
+
}}>{w}</div>
|
|
236
|
+
</React.Fragment>
|
|
237
|
+
))}
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
{/* key layout */}
|
|
241
|
+
<div style={{
|
|
242
|
+
display: 'flex', flexDirection: 'column', gap: 13,
|
|
243
|
+
padding: '0 6.5px', width: '100%', boxSizing: 'border-box',
|
|
244
|
+
position: 'relative',
|
|
245
|
+
}}>
|
|
246
|
+
{row(['q','w','e','r','t','y','u','i','o','p'])}
|
|
247
|
+
{row(['a','s','d','f','g','h','j','k','l'], 20)}
|
|
248
|
+
<div style={{ display: 'flex', gap: 14.25, alignItems: 'center' }}>
|
|
249
|
+
{key(icons.shift, { w: 45, k: 'shift' })}
|
|
250
|
+
<div style={{ display: 'flex', gap: 6.5, flex: 1 }}>
|
|
251
|
+
{['z','x','c','v','b','n','m'].map(l => key(l, { flex: true, k: l }))}
|
|
252
|
+
</div>
|
|
253
|
+
{key(icons.del, { w: 45, k: 'del' })}
|
|
254
|
+
</div>
|
|
255
|
+
<div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
|
|
256
|
+
{key('ABC', { w: 92.25, fs: 18, k: 'abc' })}
|
|
257
|
+
{key('', { flex: true, k: 'space' })}
|
|
258
|
+
{key(icons.ret, { w: 92.25, ret: true, k: 'ret' })}
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
|
|
262
|
+
{/* bottom spacer (emoji+mic area, icons omitted) */}
|
|
263
|
+
<div style={{ height: 56, width: '100%', position: 'relative' }} />
|
|
264
|
+
</div>
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
Object.assign(window, {
|
|
269
|
+
IOSDevice, IOSStatusBar, IOSList, IOSListRow, IOSKeyboard,
|
|
270
|
+
});
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/* BEGIN USAGE */
|
|
2
|
+
// MacOS.jsx — Simplified macOS Tahoe (Liquid Glass) window
|
|
3
|
+
// Based on the macOS Tahoe UI Kit. No image assets, no dependencies.
|
|
4
|
+
// Exports (to window): MacWindow, MacSidebar, MacSidebarItem, MacSidebarHeader, MacToolbar, MacGlass, MacTrafficLights
|
|
5
|
+
//
|
|
6
|
+
// Usage — wrap your app content in <MacWindow> to get the window chrome
|
|
7
|
+
// (traffic lights + titlebar). Props: width, height, title, sidebar (pass a
|
|
8
|
+
// <MacSidebar> element); compose MacToolbar/MacGlass inside as needed:
|
|
9
|
+
//
|
|
10
|
+
// <MacWindow width={980} height={620} title="Documents"
|
|
11
|
+
// sidebar={<MacSidebar>…</MacSidebar>}>
|
|
12
|
+
// ...your app content...
|
|
13
|
+
// </MacWindow>
|
|
14
|
+
/* END USAGE */
|
|
15
|
+
|
|
16
|
+
const MAC_FONT = '-apple-system, BlinkMacSystemFont, "SF Pro", "Helvetica Neue", sans-serif';
|
|
17
|
+
|
|
18
|
+
// ─────────────────────────────────────────────────────────────
|
|
19
|
+
// Liquid glass primitive — blur + white tint + inset highlight
|
|
20
|
+
// ─────────────────────────────────────────────────────────────
|
|
21
|
+
function MacGlass({ children, radius = 296, dark = false, style = {} }) {
|
|
22
|
+
return (
|
|
23
|
+
<div style={{ position: 'relative', borderRadius: radius, ...style }}>
|
|
24
|
+
<div style={{
|
|
25
|
+
position: 'absolute', inset: 0, borderRadius: radius,
|
|
26
|
+
background: dark ? 'rgba(255,255,255,0.08)' : 'rgba(255,255,255,0.35)',
|
|
27
|
+
backdropFilter: 'blur(40px) saturate(180%)',
|
|
28
|
+
WebkitBackdropFilter: 'blur(40px) saturate(180%)',
|
|
29
|
+
border: dark ? '0.5px solid rgba(255,255,255,0.12)' : '0.5px solid rgba(255,255,255,0.6)',
|
|
30
|
+
boxShadow: dark
|
|
31
|
+
? '0 8px 40px rgba(0,0,0,0.2)'
|
|
32
|
+
: '0 8px 40px rgba(0,0,0,0.08), inset 0 1px 0 rgba(255,255,255,0.4)',
|
|
33
|
+
}} />
|
|
34
|
+
<div style={{ position: 'relative', zIndex: 1 }}>{children}</div>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ─────────────────────────────────────────────────────────────
|
|
40
|
+
// Traffic lights (14px, Tahoe colors)
|
|
41
|
+
// ─────────────────────────────────────────────────────────────
|
|
42
|
+
function MacTrafficLights({ style = {} }) {
|
|
43
|
+
const dot = (bg) => (
|
|
44
|
+
<div style={{
|
|
45
|
+
width: 14, height: 14, borderRadius: '50%', background: bg,
|
|
46
|
+
border: '0.5px solid rgba(0,0,0,0.1)',
|
|
47
|
+
}} />
|
|
48
|
+
);
|
|
49
|
+
return (
|
|
50
|
+
<div style={{ display: 'flex', gap: 9, alignItems: 'center', padding: 1, ...style }}>
|
|
51
|
+
{dot('#ff736a')}{dot('#febc2e')}{dot('#19c332')}
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ─────────────────────────────────────────────────────────────
|
|
57
|
+
// Toolbar — title + single glass pill icon
|
|
58
|
+
// ─────────────────────────────────────────────────────────────
|
|
59
|
+
function MacToolbar({ title = 'Folder' }) {
|
|
60
|
+
return (
|
|
61
|
+
<div style={{
|
|
62
|
+
display: 'flex', gap: 8, alignItems: 'center', padding: 8, flexShrink: 0,
|
|
63
|
+
}}>
|
|
64
|
+
{/* title */}
|
|
65
|
+
<div style={{
|
|
66
|
+
fontFamily: MAC_FONT, fontSize: 15, fontWeight: 700,
|
|
67
|
+
color: 'rgba(0,0,0,0.85)', whiteSpace: 'nowrap', paddingLeft: 8,
|
|
68
|
+
}}>{title}</div>
|
|
69
|
+
<div style={{ flex: 1 }} />
|
|
70
|
+
{/* single action */}
|
|
71
|
+
<MacGlass>
|
|
72
|
+
<div style={{
|
|
73
|
+
width: 36, height: 36, display: 'flex',
|
|
74
|
+
alignItems: 'center', justifyContent: 'center',
|
|
75
|
+
}}>
|
|
76
|
+
<div style={{ width: 14, height: 14, borderRadius: '50%', background: '#4c4c4c', opacity: 0.4 }} />
|
|
77
|
+
</div>
|
|
78
|
+
</MacGlass>
|
|
79
|
+
{/* search */}
|
|
80
|
+
<MacGlass>
|
|
81
|
+
<div style={{
|
|
82
|
+
width: 140, height: 36, display: 'flex', alignItems: 'center',
|
|
83
|
+
gap: 6, padding: '0 12px',
|
|
84
|
+
}}>
|
|
85
|
+
<svg width="13" height="13" viewBox="0 0 13 13" fill="none">
|
|
86
|
+
<circle cx="5.5" cy="5.5" r="4" stroke="#727272" strokeWidth="1.5"/>
|
|
87
|
+
<path d="M8.5 8.5l3 3" stroke="#727272" strokeWidth="1.5" strokeLinecap="round"/>
|
|
88
|
+
</svg>
|
|
89
|
+
<span style={{
|
|
90
|
+
fontFamily: MAC_FONT, fontSize: 13, fontWeight: 500, color: '#727272',
|
|
91
|
+
}}>Search</span>
|
|
92
|
+
</div>
|
|
93
|
+
</MacGlass>
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ─────────────────────────────────────────────────────────────
|
|
99
|
+
// Sidebar — frosted glass panel floating inside the window
|
|
100
|
+
// ─────────────────────────────────────────────────────────────
|
|
101
|
+
function MacSidebarItem({ label, selected = false }) {
|
|
102
|
+
return (
|
|
103
|
+
<div style={{
|
|
104
|
+
display: 'flex', alignItems: 'center', gap: 6,
|
|
105
|
+
height: 24, padding: '4px 10px 4px 6px', margin: '0 10px',
|
|
106
|
+
borderRadius: 8, position: 'relative',
|
|
107
|
+
fontFamily: MAC_FONT, fontSize: 11, fontWeight: 500,
|
|
108
|
+
}}>
|
|
109
|
+
{selected && (
|
|
110
|
+
<div style={{
|
|
111
|
+
position: 'absolute', inset: 0, borderRadius: 8,
|
|
112
|
+
background: 'rgba(0,0,0,0.11)', mixBlendMode: 'multiply',
|
|
113
|
+
}} />
|
|
114
|
+
)}
|
|
115
|
+
<div style={{
|
|
116
|
+
width: 14, height: 14, borderRadius: '50%',
|
|
117
|
+
background: selected ? '#007aff' : 'rgba(0,0,0,0.4)',
|
|
118
|
+
opacity: selected ? 1 : 0.5, flexShrink: 0, position: 'relative',
|
|
119
|
+
}} />
|
|
120
|
+
<span style={{ color: 'rgba(0,0,0,0.85)', position: 'relative' }}>{label}</span>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function MacSidebar({ children }) {
|
|
126
|
+
return (
|
|
127
|
+
<div style={{
|
|
128
|
+
width: 220, height: '100%', padding: 8, flexShrink: 0,
|
|
129
|
+
position: 'relative', display: 'flex', flexDirection: 'column',
|
|
130
|
+
}}>
|
|
131
|
+
{/* glass panel */}
|
|
132
|
+
<div style={{
|
|
133
|
+
position: 'absolute', inset: 8, borderRadius: 18,
|
|
134
|
+
background: 'rgba(210,225,245,0.45)',
|
|
135
|
+
backdropFilter: 'blur(50px) saturate(200%)',
|
|
136
|
+
WebkitBackdropFilter: 'blur(50px) saturate(200%)',
|
|
137
|
+
border: '0.5px solid rgba(255,255,255,0.5)',
|
|
138
|
+
boxShadow: '0 8px 40px rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.35)',
|
|
139
|
+
}} />
|
|
140
|
+
{/* content */}
|
|
141
|
+
<div style={{
|
|
142
|
+
position: 'relative', zIndex: 1, padding: '10px 0',
|
|
143
|
+
display: 'flex', flexDirection: 'column', gap: 2,
|
|
144
|
+
}}>
|
|
145
|
+
{/* window controls + sidebar toggle */}
|
|
146
|
+
<div style={{
|
|
147
|
+
height: 32, display: 'flex', alignItems: 'center',
|
|
148
|
+
justifyContent: 'space-between', padding: '0 10px', marginBottom: 4,
|
|
149
|
+
}}>
|
|
150
|
+
<MacTrafficLights />
|
|
151
|
+
</div>
|
|
152
|
+
{children}
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function MacSidebarHeader({ title }) {
|
|
159
|
+
return (
|
|
160
|
+
<div style={{
|
|
161
|
+
padding: '14px 18px 5px',
|
|
162
|
+
fontFamily: MAC_FONT, fontSize: 11, fontWeight: 700,
|
|
163
|
+
color: 'rgba(0,0,0,0.5)',
|
|
164
|
+
}}>{title}</div>
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ─────────────────────────────────────────────────────────────
|
|
169
|
+
// Window — r:26, big shadow, sidebar + toolbar + content
|
|
170
|
+
// ─────────────────────────────────────────────────────────────
|
|
171
|
+
function MacWindow({
|
|
172
|
+
width = 900, height = 600, title = 'Folder',
|
|
173
|
+
sidebar, children,
|
|
174
|
+
}) {
|
|
175
|
+
return (
|
|
176
|
+
<div style={{
|
|
177
|
+
width, height, borderRadius: 26, overflow: 'hidden',
|
|
178
|
+
background: '#fff',
|
|
179
|
+
border: '1px solid #DEE0E3',
|
|
180
|
+
display: 'flex', position: 'relative',
|
|
181
|
+
fontFamily: MAC_FONT,
|
|
182
|
+
}}>
|
|
183
|
+
<MacSidebar>{sidebar}</MacSidebar>
|
|
184
|
+
<div style={{ flex: 1, display: 'flex', flexDirection: 'column' }}>
|
|
185
|
+
<MacToolbar title={title} />
|
|
186
|
+
<div style={{ flex: 1, overflow: 'auto', padding: '4px 8px' }}>
|
|
187
|
+
{children}
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
Object.assign(window, {
|
|
195
|
+
MacWindow, MacSidebar, MacSidebarItem, MacSidebarHeader,
|
|
196
|
+
MacToolbar, MacGlass, MacTrafficLights,
|
|
197
|
+
});
|