gitifact 0.8.4 → 0.8.5

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 (77) hide show
  1. package/README.md +1 -0
  2. package/dist/browser/assets/{HgiRefresh-CAJ0Xdvi.js → HgiRefresh-BSPkIVFZ.js} +1 -1
  3. package/dist/browser/assets/{Markdown-ev4hMr67.js → Markdown-B1P3lpA0.js} +1 -1
  4. package/dist/browser/assets/Selector-BG3Gd_OR.js +2 -0
  5. package/dist/browser/assets/{Tab-BwJj0rUr.js → Tab-RKLZrCiK.js} +1 -1
  6. package/dist/browser/assets/{Table-XuC9zK9w.js → Table-DjTkmoR7.js} +2 -2
  7. package/dist/browser/assets/Token-CKcN25HT.css +1 -0
  8. package/dist/browser/assets/Token-D337a1e3.js +2 -0
  9. package/dist/browser/assets/{about-vlKWfG7J.js → about-D06ipt4C.js} +2 -2
  10. package/dist/browser/assets/activity-timeline-Bl6a55GR.js +2 -0
  11. package/dist/browser/assets/changelog-DCvEVceR.js +1 -0
  12. package/dist/browser/assets/commit-Cj7mcn9u.js +4 -0
  13. package/dist/browser/assets/{contributor-Bs3RWHQv.js → contributor-D1TZSDq9.js} +1 -1
  14. package/dist/browser/assets/contributors-lkpVuCXS.js +1 -0
  15. package/dist/browser/assets/{contributors._email-BR9sLgCs.js → contributors._email-B7ATmxN1.js} +1 -1
  16. package/dist/browser/assets/{contributors.index-FoYwG7VE.js → contributors.index-Cc0QRJwQ.js} +1 -1
  17. package/dist/browser/assets/dashboard.index-BNTyn3_V.js +1 -0
  18. package/dist/browser/assets/document-7jVYmB_Z.js +2 -0
  19. package/dist/browser/assets/{document-DPtVyR5y.js → document-kGFspd5u.js} +4 -4
  20. package/dist/browser/assets/features-CBeEOrok.js +2 -0
  21. package/dist/browser/assets/features-FKxsPKab.css +1 -0
  22. package/dist/browser/assets/{features._featureId-xxpihTEs.js → features._featureId-DGUBnzjL.js} +1 -1
  23. package/dist/browser/assets/{features.index-CO7APsrh.js → features.index-Dgw4kiMG.js} +1 -1
  24. package/dist/browser/assets/getting-started-B_LeBSZE.js +1 -0
  25. package/dist/browser/assets/git-DW-pzDOm.js +1 -0
  26. package/dist/browser/assets/index-CswY1wJ4.css +1 -0
  27. package/dist/browser/assets/index-IML0_BCy.js +49 -0
  28. package/dist/browser/assets/instructions-Qhbd8_KG.js +1 -0
  29. package/dist/browser/assets/{instructions._instructionId-Bp9u9xx9.js → instructions._instructionId-CnX6OyFZ.js} +1 -1
  30. package/dist/browser/assets/instructions.agents-0tKcPahQ.js +1 -0
  31. package/dist/browser/assets/instructions.index-B3v6vtEg.js +1 -0
  32. package/dist/browser/assets/{lazyRouteComponent-D4lq6X5s.js → lazyRouteComponent-tJOK5sxC.js} +1 -1
  33. package/dist/browser/assets/load-more-DVsjzCxE.js +1 -0
  34. package/dist/browser/assets/page-header-AS8jZ1ve.js +248 -0
  35. package/dist/browser/assets/records._recordId-C2qxnLKN.js +1 -0
  36. package/dist/browser/assets/records.commits._commit-CSa3sQ8C.js +1 -0
  37. package/dist/browser/assets/records.docs._docId-SIPsGTwH.js +1 -0
  38. package/dist/browser/assets/records.index-DoE_3GrP.js +1 -0
  39. package/dist/browser/assets/records.working-Cp5ualrr.js +1 -0
  40. package/dist/browser/assets/search-CbtiuqNx.js +1 -0
  41. package/dist/browser/assets/{settings-BNIy3TaP.js → settings-tVQIx1Uf.js} +1 -1
  42. package/dist/browser/assets/{useInfiniteQuery-03AIcFvA.js → useInfiniteQuery-C0rB-9Ci.js} +1 -1
  43. package/dist/browser/assets/{useKeyboardHint-DN1hAi8g.js → useKeyboardHint-D5jGavym.js} +1 -1
  44. package/dist/browser/index.html +24 -24
  45. package/dist/i18n/en/changelog.md +15 -0
  46. package/dist/i18n/en/docs/design.md +2 -0
  47. package/dist/i18n/en/docs/spec.md +30 -5
  48. package/dist/i18n/ko/changelog.md +15 -0
  49. package/dist/i18n/ko/docs/design.md +2 -0
  50. package/dist/i18n/ko/docs/spec.md +30 -5
  51. package/dist/main.js +272 -125
  52. package/package.json +3 -3
  53. package/dist/browser/assets/Selector-CGOdL2eo.js +0 -2
  54. package/dist/browser/assets/Token-BV_4bSkY.js +0 -2
  55. package/dist/browser/assets/Token-Bqkc8eyB.css +0 -1
  56. package/dist/browser/assets/activity-timeline-Dmc-97N6.js +0 -2
  57. package/dist/browser/assets/changelog-6QcNKW8u.js +0 -1
  58. package/dist/browser/assets/commit-BcdbBdP4.js +0 -4
  59. package/dist/browser/assets/contributors-B_bVSY4J.js +0 -1
  60. package/dist/browser/assets/dashboard.index-BFp6Hqsf.js +0 -1
  61. package/dist/browser/assets/document-Q3lvgyX8.js +0 -2
  62. package/dist/browser/assets/features-CmvypKgf.js +0 -2
  63. package/dist/browser/assets/features-DUHxz0_L.css +0 -1
  64. package/dist/browser/assets/getting-started-11zYPwlJ.js +0 -1
  65. package/dist/browser/assets/git-CVY8qpaV.js +0 -1
  66. package/dist/browser/assets/index-BeeP8ZFW.js +0 -49
  67. package/dist/browser/assets/index-D1JeDnJc.css +0 -1
  68. package/dist/browser/assets/instructions-D3-EfbZG.js +0 -1
  69. package/dist/browser/assets/instructions.agents-DvFHo8x8.js +0 -1
  70. package/dist/browser/assets/instructions.index-zHzGHq7D.js +0 -1
  71. package/dist/browser/assets/load-more-CymfxLt7.js +0 -1
  72. package/dist/browser/assets/page-header-CVCjLFQo.js +0 -246
  73. package/dist/browser/assets/records._recordId-Be8aM0F-.js +0 -1
  74. package/dist/browser/assets/records.commits._commit-Dm3gX-bQ.js +0 -1
  75. package/dist/browser/assets/records.index-BgfJnGAl.js +0 -1
  76. package/dist/browser/assets/records.working-Eeag2L5N.js +0 -1
  77. package/dist/browser/assets/search-CSSuO-jR.js +0 -1
@@ -0,0 +1 @@
1
+ import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t}from"./commit-Cj7mcn9u.js";import{a as n}from"./index-IML0_BCy.js";var r=e();function i(){let{recordId:e}=n.useParams();return(0,r.jsx)(t,{recordId:e})}export{i as component};
@@ -0,0 +1 @@
1
+ import{l as e}from"./themeProps-CkLe5zXY.js";import{s as t}from"./commit-Cj7mcn9u.js";import{r as n}from"./index-IML0_BCy.js";var r=e();function i(){let{commit:e}=n.useParams(),i=n.useSearch();return(0,r.jsx)(t,{commit:e,search:i})}export{i as component};
@@ -0,0 +1 @@
1
+ import{l as e}from"./themeProps-CkLe5zXY.js";import{n as t,t as n}from"./index-IML0_BCy.js";var r=e();function i(){let{docId:e}=n.useParams();return(0,r.jsx)(t,{docId:e})}export{i as component};
@@ -0,0 +1 @@
1
+ import{l as e}from"./themeProps-CkLe5zXY.js";import{o as t,s as n}from"./index-IML0_BCy.js";var r=e();function i(){let e=t.useSearch(),i=t.useNavigate();return(0,r.jsx)(n,{search:e,change:(e,t)=>{i({search:e,replace:t??!1})}})}export{i as component};
@@ -0,0 +1 @@
1
+ import{l as e}from"./themeProps-CkLe5zXY.js";import{a as t}from"./commit-Cj7mcn9u.js";import{i as n}from"./index-IML0_BCy.js";var r=e();function i(){let e=n.useSearch();return(0,r.jsx)(t,{search:e})}export{i as component};
@@ -0,0 +1 @@
1
+ function e(e){let t={};for(let n of[`tab`,`document`,`q`,`target`,`selected`,`author`,`record`,`view`,`sort`,`design`,`dir`])typeof e[n]==`string`&&e[n].length<=240&&(t[n]=e[n]);return t}export{e as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{K as t,l as n,n as r,q as i}from"./themeProps-CkLe5zXY.js";import{n as a}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{an as o,cn as s,dn as c,fn as l,ht as u,mt as d,on as f,pn as p,rn as m,t as h,vt as g}from"./page-header-CVCjLFQo.js";import{a as _}from"./useMediaQuery-twbHF0pO.js";import{E as v,S as y,W as b,w as x}from"./Icon-DPaLmsmh.js";import{t as S}from"./useKeyboardHint-DN1hAi8g.js";import{a as C,c as w,l as T,n as E,o as D,r as O}from"./appearance-DyJA06C4.js";import{n as k,t as A}from"./Grid-DCCm_m5g.js";var j=e(i(),1),M=(0,j.createContext)(null);M.displayName=`SegmentedControlContext`;function N(){let e=(0,j.use)(M);if(e==null)throw Error(`useSegmentedControlContext must be used within SegmentedControl. Wrap your SegmentedControlItem in <SegmentedControl>.`);return e}var P=n(),F={container:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kOIVth:`x1lsbc85`,"--_segmented-control-padding":`x18jk3ff`,kmVPX3:`xpoxszi`,kWkggS:`x17x4s8c`,$$css:!0},fill:{k1xSpc:`x78zum5`,kzqmXN:`xh8yej3`,$$css:!0},disabled:{kSiTet:`xbyyjgo`,kfzvcC:`x47corl`,$$css:!0},disabledWithMessage:{kSiTet:`xbyyjgo`,$$css:!0}},I={sm:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},md:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},lg:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0}};function L({ref:e,value:n,onChange:i,label:o,size:s,layout:c=`hug`,isDisabled:l=!1,disabledMessage:u,children:d,xstyle:p,className:m,style:h,onKeyDown:b,onFocus:x,onBlur:C,...w}){let T=y(s,`md`),E=l&&!!u,D=a({placement:`above`,focusTrigger:`always`,isEnabled:E}),{listRef:O,handleKeyDown:k,handleFocus:A}=g({itemSelector:`[role="radio"]:not([aria-disabled="true"])`,hasRovingTabIndex:!0,wrap:!0,orientation:`horizontal`}),N=S({orientation:`horizontal`,isEnabled:!l}),L=(0,j.useCallback)(e=>{b?.(e),!e.defaultPrevented&&(N.onKeyDown(e),k(e))},[b,N,k]),R=(0,j.useCallback)(e=>{if(x?.(e),e.defaultPrevented||(N.onFocus(e),A(e),l)||!e.currentTarget.contains(e.relatedTarget))return;let t=e.target?.closest(`[role="radio"][data-value]`);if(!t||t.getAttribute(`aria-disabled`)===`true`)return;let r=t.dataset.value;r!=null&&r!==n&&i(r)},[x,N,A,l,i,n]),z=(0,j.useMemo)(()=>({value:n,onChange:i,size:T,layout:c,isDisabled:l,hasDisabledMessage:E}),[n,i,T,c,l,E]);return(0,P.jsxs)(M,{value:z,children:[(0,P.jsxs)(`div`,{ref:v(e,O,D.ref),...w,role:`radiogroup`,"aria-label":o,"aria-disabled":l||void 0,"aria-describedby":E?D.describedBy:void 0,onKeyDown:L,onFocus:R,onBlur:f(C,N.onBlur),..._(r(`segmented-control`,{size:T}),t(F.container,I[T],c===`fill`&&F.fill,l&&(E?F.disabledWithMessage:F.disabled),p),m,h),children:[d,N.hintElement]}),E&&D.renderTooltip(u)]})}L.displayName=`SegmentedControl`;var R={base:{kVAEAm:`x1n2onr6`,k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kOIVth:`xzye2dw`,kg3NbH:`xrrkdod`,kWkggS:`xjbqb8w`,kMzoRj:`xc342km`,ksu8eU:`xng3xce`,kMv6JI:`xjb2p0i`,kGuDYH:`xcr08ib`,kLWn49:`x1kq96og`,k63SB2:`x1e4wzip`,kMwMTN:`xv1l7n4`,kkrTdU:`x1ypdohk x16khyan`,khDVqt:`xuxw1ft`,k1ekBW:`x1vix5yk`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},hover:{kWkggS:`xoevpu5`,$$css:!0},selected:{kAXs8y:`x1kzknox`,kMwMTN:`x1tgivj0 x1k5gbb1`,k63SB2:`x2mo6ok`,kWkggS:`x10xzikg x1jzqe4`,kGVxlE:`x1i5ehqx`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kMwMTN:`xnbbluu`,$$css:!0},fill:{kUk6DE:`x98rzlu`,k7Eaqz:`xeuugli`,kjj79g:`xl56j7k`,$$css:!0},icon:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kmuXW:`x2lah0s`,$$css:!0}},z={sm:{kZKoxP:`xzj98nu`,kaIpWk:`xc910v0`,kg3NbH:`xf314gf`,kGuDYH:`x141an7d`,$$css:!0},md:{kZKoxP:`x184gfjb`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0},lg:{kZKoxP:`x1uiybsj`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0}},B={sm:{kzqmXN:`x6jxa94`,kZKoxP:`x1v9usgg`,$$css:!0},md:{kzqmXN:`x1kky2od`,kZKoxP:`xlup9mm`,$$css:!0},lg:{kzqmXN:`x1xp8n7a`,kZKoxP:`xmix8c7`,$$css:!0}};function V({ref:e,value:n,label:i,isLabelHidden:a=!1,icon:o,isDisabled:s=!1,onClick:c,xstyle:l,...u}){let d=N(),p=d.value===n,m=s||d.isDisabled,h=p&&(d.hasDisabledMessage??!1)&&!s,g=d.size,v=d.layout===`fill`,y=f(c,()=>{!m&&!p&&d.onChange(n)}),x=o?(0,P.jsx)(`span`,{...t(R.icon,B[g]),children:o}):null;return(0,P.jsxs)(`button`,{ref:e,...u,type:`button`,role:`radio`,"aria-checked":p,"aria-disabled":m||void 0,"aria-label":a?i:void 0,"data-value":n,tabIndex:p&&!m||h?0:-1,onClick:y,..._(r(`segmented-control-item`,{size:g,selected:p?`selected`:null,disabled:m?`disabled`:null}),b.focusVisible(R.base,z[g],v&&R.fill,p&&R.selected,!p&&!m&&R.hover,m&&R.disabled,l)),children:[x,!a&&(0,P.jsx)(`span`,{className:`xb3r6kr xlyipyv xeuugli`,children:i})]})}V.displayName=`SegmentedControlItem`;var H={interactive:{"--selectable-card-ring-color":`x11rj6l1`,kVAEAm:`x1n2onr6`,kkrTdU:`x1ypdohk x16khyan`,k1ekBW:`x16mfhj0`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},overlay:{k5JduY:`x1s928wv`,kwXMNM:`x1j6awrg`,kv0HGH:`xarstr8`,kUfP38:`x1k48kgn`,kloYau:`x2q1x1w`,kRicXK:`x1ywzrc5`,kPNhGg:`x97pup0`,kA8PQs:`x1dlmc9c`,ks3ayO:`xyhc2n1`,kAcZsS:`x1k7wiig`,$$css:!0},hoverOnPointer:{k8t4tK:`x1912f9e`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kSiTet:`xbyyjgo`,$$css:!0},selected:{kVAM5u:`xad5do`,"--_card-ring":`xr9ms2c`,$$css:!0},selectedBlue:{kVAM5u:`xlee4gx`,"--_card-ring":`xgwwt2v`,$$css:!0},selectedCyan:{kVAM5u:`xb1xfl`,"--_card-ring":`xcdi0x3`,$$css:!0},selectedGray:{kVAM5u:`x1w9ec3u`,"--_card-ring":`x1m1zkwp`,$$css:!0},selectedGreen:{kVAM5u:`xy90a9n`,"--_card-ring":`x1485227`,$$css:!0},selectedOrange:{kVAM5u:`xloqurj`,"--_card-ring":`x1cclxpp`,$$css:!0},selectedPink:{kVAM5u:`x1czkbn8`,"--_card-ring":`xzs6dn4`,$$css:!0},selectedPurple:{kVAM5u:`xq98wne`,"--_card-ring":`x9zgi83`,$$css:!0},selectedRed:{kVAM5u:`xjqgoec`,"--_card-ring":`xo8718j`,$$css:!0},selectedTeal:{kVAM5u:`x1r9gxr1`,"--_card-ring":`xp4e5fy`,$$css:!0},selectedYellow:{kVAM5u:`x1kpnwn1`,"--_card-ring":`x1glw7ee`,$$css:!0},selectedUnknown:{"--_card-ring":`x3zsw4j`,$$css:!0}},U=e=>{switch(e){case`default`:case`transparent`:case`muted`:return H.selected;case`blue`:return H.selectedBlue;case`cyan`:return H.selectedCyan;case`gray`:return H.selectedGray;case`green`:return H.selectedGreen;case`orange`:return H.selectedOrange;case`pink`:return H.selectedPink;case`purple`:return H.selectedPurple;case`red`:return H.selectedRed;case`teal`:return H.selectedTeal;case`yellow`:return H.selectedYellow;default:return H.selectedUnknown}};function W({label:e,isSelected:t,onChange:n,onClick:i,onMouseUp:a,isDisabled:s=!1,children:c,padding:l,variant:u=`default`,elevation:d=`none`,width:f,height:p,maxWidth:m,ref:h,xstyle:g,className:y,style:x,...S}){let C=(0,j.useRef)(null),w=(0,j.useRef)(null),T=(0,j.useCallback)(e=>{s||n(!t)},[s,t,n]),E=(0,j.useCallback)(e=>{!s&&e.key===`Enter`&&(e.preventDefault(),n(!t))},[s,t,n]),{onClick:D,onMouseUp:O}=o({containerRef:C,interactiveRef:w,onClick:T,disabled:s}),A=i?e=>{D(e),i(e)}:D,M=a?e=>{O(e),a(e)}:O;return(0,P.jsxs)(k,{ref:v(h,C),width:f,height:p,maxWidth:m,padding:l,variant:u,elevation:d,..._(r(`selectable-card`,{variant:u,selected:t?`true`:`false`}),b.focusWithin(),y,x),xstyle:[H.interactive,t&&U(u),!s&&H.overlay,!s&&H.hoverOnPointer,s&&H.disabled,g],onClick:s?void 0:A,onMouseUp:s?void 0:M,...S,children:[(0,P.jsx)(`input`,{ref:w,type:`checkbox`,checked:t,"aria-label":e,disabled:s,onChange:()=>n(!t),onKeyDown:E,className:`x10l6tqk x1i1rx1s xjm9jq1 x1717udv xkdpibf xb3r6kr xzpqnlu xuxw1ft xc342km`}),c]})}W.displayName=`SelectableCard`;var G={page:`_page_1yxii_2`,column:`_column_1yxii_3`,pageTitle:`_pageTitle_1yxii_4`,sections:`_sections_1yxii_5`,section:`_section_1yxii_5`,swatches:`_swatches_1yxii_8`,sample:`_sample_1yxii_9`,sampleSurface:`_sampleSurface_1yxii_10`,sampleDot:`_sampleDot_1yxii_11`,sampleLine:`_sampleLine_1yxii_12`},K=()=>({system:s(`settings.mode.system`),light:s(`settings.mode.light`),dark:s(`settings.mode.dark`)}),q=()=>({stone:[s(`settings.palette.stone`),s(`settings.palette.stoneHint`)],sage:[s(`settings.palette.sage`),s(`settings.palette.sageHint`)],olive:[s(`settings.palette.olive`),s(`settings.palette.oliveHint`)],slate:[s(`settings.palette.slate`),s(`settings.palette.slateHint`)],clay:[s(`settings.palette.clay`),s(`settings.palette.clayHint`)]}),J=e=>e===`stone`?w:O[e],Y=[0,1];function X(){l();let{mode:e,palette:t}=T(),n=p();return(0,P.jsxs)(u,{gap:0,className:G.page,children:[(0,P.jsx)(h,{trail:[{label:s(`settings.title`)}]}),(0,P.jsxs)(u,{gap:0,className:G.column,children:[(0,P.jsxs)(u,{gap:1,className:G.pageTitle,children:[(0,P.jsx)(m,{level:1,children:s(`settings.title`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:s(`settings.subtitle`)})]}),(0,P.jsxs)(u,{gap:0,className:G.sections,children:[(0,P.jsxs)(u,{as:`section`,gap:3,className:G.section,"aria-label":s(`settings.language`),children:[(0,P.jsx)(u,{gap:1,children:(0,P.jsx)(m,{level:2,children:s(`settings.language`)})}),(0,P.jsx)(d,{gap:0,children:(0,P.jsxs)(L,{label:s(`settings.language`),value:n,onChange:e=>c(e),children:[(0,P.jsx)(V,{value:`system`,label:s(`settings.language.system`)}),(0,P.jsx)(V,{value:`en`,label:`English`}),(0,P.jsx)(V,{value:`ko`,label:`한국어`})]})})]}),(0,P.jsxs)(u,{as:`section`,gap:3,className:G.section,"aria-label":s(`settings.mode`),children:[(0,P.jsxs)(u,{gap:1,children:[(0,P.jsx)(m,{level:2,children:s(`settings.mode`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:s(`settings.modeHint`)})]}),(0,P.jsx)(d,{gap:0,children:(0,P.jsx)(L,{label:s(`settings.mode`),value:e,onChange:e=>D({mode:e}),children:E.map(e=>(0,P.jsx)(V,{value:e,label:K()[e]},e))})})]}),(0,P.jsxs)(u,{as:`section`,gap:3,className:G.section,"aria-label":s(`settings.palette`),children:[(0,P.jsxs)(u,{gap:1,children:[(0,P.jsx)(m,{level:2,children:s(`settings.palette`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:s(`settings.paletteHint`)})]}),(0,P.jsx)(A,{columns:{minWidth:176,repeat:`fit`,max:5},gap:3,children:C.map(e=>{let n=J(e),[r,i]=q()[e];return(0,P.jsx)(W,{label:r,isSelected:t===e,onChange:t=>{t&&D({palette:e})},children:(0,P.jsxs)(u,{gap:3,children:[(0,P.jsx)(u,{gap:0,className:G.swatches,"aria-hidden":`true`,children:Y.map(e=>(0,P.jsx)(d,{gap:2,vAlign:`center`,className:G.sample,style:{background:n.body[e]},children:(0,P.jsxs)(d,{gap:2,vAlign:`center`,className:G.sampleSurface,style:{background:n.surface[e],color:n.text[e]},children:[(0,P.jsx)(u,{gap:0,className:G.sampleDot,style:{background:n.accent[e]}}),(0,P.jsx)(u,{gap:0,className:G.sampleLine,style:{background:n.text[e]}})]})},e))}),(0,P.jsxs)(u,{gap:1,children:[(0,P.jsx)(x,{type:`label`,children:r}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:i})]})]})},e)})})]})]})]})]})}var Z=X;export{Z as component};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{K as t,l as n,n as r,q as i}from"./themeProps-CkLe5zXY.js";import{n as a}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{_t as o,an as s,bt as c,cn as l,gt as u,hn as d,mn as f,pn as p,sn as m,t as h,un as g}from"./page-header-AS8jZ1ve.js";import{a as _}from"./useMediaQuery-twbHF0pO.js";import{E as v,S as y,W as b,w as x}from"./Icon-DPaLmsmh.js";import{t as S}from"./useKeyboardHint-D5jGavym.js";import{a as C,c as w,l as T,n as E,o as D,r as O}from"./appearance-DyJA06C4.js";import{n as k,t as A}from"./Grid-DCCm_m5g.js";var j=e(i(),1),M=(0,j.createContext)(null);M.displayName=`SegmentedControlContext`;function N(){let e=(0,j.use)(M);if(e==null)throw Error(`useSegmentedControlContext must be used within SegmentedControl. Wrap your SegmentedControlItem in <SegmentedControl>.`);return e}var P=n(),F={container:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kOIVth:`x1lsbc85`,"--_segmented-control-padding":`x18jk3ff`,kmVPX3:`xpoxszi`,kWkggS:`x17x4s8c`,$$css:!0},fill:{k1xSpc:`x78zum5`,kzqmXN:`xh8yej3`,$$css:!0},disabled:{kSiTet:`xbyyjgo`,kfzvcC:`x47corl`,$$css:!0},disabledWithMessage:{kSiTet:`xbyyjgo`,$$css:!0}},I={sm:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},md:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0},lg:{"--_segmented-control-radius":`x9icjy1`,kaIpWk:`x1hapoqb`,$$css:!0}};function L({ref:e,value:n,onChange:i,label:o,size:s,layout:u=`hug`,isDisabled:d=!1,disabledMessage:f,children:p,xstyle:m,className:h,style:g,onKeyDown:b,onFocus:x,onBlur:C,...w}){let T=y(s,`md`),E=d&&!!f,D=a({placement:`above`,focusTrigger:`always`,isEnabled:E}),{listRef:O,handleKeyDown:k,handleFocus:A}=c({itemSelector:`[role="radio"]:not([aria-disabled="true"])`,hasRovingTabIndex:!0,wrap:!0,orientation:`horizontal`}),N=S({orientation:`horizontal`,isEnabled:!d}),L=(0,j.useCallback)(e=>{b?.(e),!e.defaultPrevented&&(N.onKeyDown(e),k(e))},[b,N,k]),R=(0,j.useCallback)(e=>{if(x?.(e),e.defaultPrevented||(N.onFocus(e),A(e),d)||!e.currentTarget.contains(e.relatedTarget))return;let t=e.target?.closest(`[role="radio"][data-value]`);if(!t||t.getAttribute(`aria-disabled`)===`true`)return;let r=t.dataset.value;r!=null&&r!==n&&i(r)},[x,N,A,d,i,n]),z=(0,j.useMemo)(()=>({value:n,onChange:i,size:T,layout:u,isDisabled:d,hasDisabledMessage:E}),[n,i,T,u,d,E]);return(0,P.jsxs)(M,{value:z,children:[(0,P.jsxs)(`div`,{ref:v(e,O,D.ref),...w,role:`radiogroup`,"aria-label":o,"aria-disabled":d||void 0,"aria-describedby":E?D.describedBy:void 0,onKeyDown:L,onFocus:R,onBlur:l(C,N.onBlur),..._(r(`segmented-control`,{size:T}),t(F.container,I[T],u===`fill`&&F.fill,d&&(E?F.disabledWithMessage:F.disabled),m),h,g),children:[p,N.hintElement]}),E&&D.renderTooltip(f)]})}L.displayName=`SegmentedControl`;var R={base:{kVAEAm:`x1n2onr6`,k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kOIVth:`xzye2dw`,kg3NbH:`xrrkdod`,kWkggS:`xjbqb8w`,kMzoRj:`xc342km`,ksu8eU:`xng3xce`,kMv6JI:`xjb2p0i`,kGuDYH:`xcr08ib`,kLWn49:`x1kq96og`,k63SB2:`x1e4wzip`,kMwMTN:`xv1l7n4`,kkrTdU:`x1ypdohk x16khyan`,khDVqt:`xuxw1ft`,k1ekBW:`x1vix5yk`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},hover:{kWkggS:`xoevpu5`,$$css:!0},selected:{kAXs8y:`x1kzknox`,kMwMTN:`x1tgivj0 x1k5gbb1`,k63SB2:`x2mo6ok`,kWkggS:`x10xzikg x1jzqe4`,kGVxlE:`x1i5ehqx`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kMwMTN:`xnbbluu`,$$css:!0},fill:{kUk6DE:`x98rzlu`,k7Eaqz:`xeuugli`,kjj79g:`xl56j7k`,$$css:!0},icon:{k1xSpc:`x3nfvp2`,kGNEyG:`x6s0dn4`,kjj79g:`xl56j7k`,kmuXW:`x2lah0s`,$$css:!0}},z={sm:{kZKoxP:`xzj98nu`,kaIpWk:`xc910v0`,kg3NbH:`xf314gf`,kGuDYH:`x141an7d`,$$css:!0},md:{kZKoxP:`x184gfjb`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0},lg:{kZKoxP:`x1uiybsj`,kaIpWk:`xc910v0`,kg3NbH:`xrrkdod`,$$css:!0}},B={sm:{kzqmXN:`x6jxa94`,kZKoxP:`x1v9usgg`,$$css:!0},md:{kzqmXN:`x1kky2od`,kZKoxP:`xlup9mm`,$$css:!0},lg:{kzqmXN:`x1xp8n7a`,kZKoxP:`xmix8c7`,$$css:!0}};function V({ref:e,value:n,label:i,isLabelHidden:a=!1,icon:o,isDisabled:s=!1,onClick:c,xstyle:u,...d}){let f=N(),p=f.value===n,m=s||f.isDisabled,h=p&&(f.hasDisabledMessage??!1)&&!s,g=f.size,v=f.layout===`fill`,y=l(c,()=>{!m&&!p&&f.onChange(n)}),x=o?(0,P.jsx)(`span`,{...t(R.icon,B[g]),children:o}):null;return(0,P.jsxs)(`button`,{ref:e,...d,type:`button`,role:`radio`,"aria-checked":p,"aria-disabled":m||void 0,"aria-label":a?i:void 0,"data-value":n,tabIndex:p&&!m||h?0:-1,onClick:y,..._(r(`segmented-control-item`,{size:g,selected:p?`selected`:null,disabled:m?`disabled`:null}),b.focusVisible(R.base,z[g],v&&R.fill,p&&R.selected,!p&&!m&&R.hover,m&&R.disabled,u)),children:[x,!a&&(0,P.jsx)(`span`,{className:`xb3r6kr xlyipyv xeuugli`,children:i})]})}V.displayName=`SegmentedControlItem`;var H={interactive:{"--selectable-card-ring-color":`x11rj6l1`,kVAEAm:`x1n2onr6`,kkrTdU:`x1ypdohk x16khyan`,k1ekBW:`x16mfhj0`,kIyJzY:`xuedmi6`,kAMwcw:`xlr8y92`,$$css:!0},overlay:{k5JduY:`x1s928wv`,kwXMNM:`x1j6awrg`,kv0HGH:`xarstr8`,kUfP38:`x1k48kgn`,kloYau:`x2q1x1w`,kRicXK:`x1ywzrc5`,kPNhGg:`x97pup0`,kA8PQs:`x1dlmc9c`,ks3ayO:`xyhc2n1`,kAcZsS:`x1k7wiig`,$$css:!0},hoverOnPointer:{k8t4tK:`x1912f9e`,$$css:!0},disabled:{kkrTdU:`xt0e3qv`,kSiTet:`xbyyjgo`,$$css:!0},selected:{kVAM5u:`xad5do`,"--_card-ring":`xr9ms2c`,$$css:!0},selectedBlue:{kVAM5u:`xlee4gx`,"--_card-ring":`xgwwt2v`,$$css:!0},selectedCyan:{kVAM5u:`xb1xfl`,"--_card-ring":`xcdi0x3`,$$css:!0},selectedGray:{kVAM5u:`x1w9ec3u`,"--_card-ring":`x1m1zkwp`,$$css:!0},selectedGreen:{kVAM5u:`xy90a9n`,"--_card-ring":`x1485227`,$$css:!0},selectedOrange:{kVAM5u:`xloqurj`,"--_card-ring":`x1cclxpp`,$$css:!0},selectedPink:{kVAM5u:`x1czkbn8`,"--_card-ring":`xzs6dn4`,$$css:!0},selectedPurple:{kVAM5u:`xq98wne`,"--_card-ring":`x9zgi83`,$$css:!0},selectedRed:{kVAM5u:`xjqgoec`,"--_card-ring":`xo8718j`,$$css:!0},selectedTeal:{kVAM5u:`x1r9gxr1`,"--_card-ring":`xp4e5fy`,$$css:!0},selectedYellow:{kVAM5u:`x1kpnwn1`,"--_card-ring":`x1glw7ee`,$$css:!0},selectedUnknown:{"--_card-ring":`x3zsw4j`,$$css:!0}},U=e=>{switch(e){case`default`:case`transparent`:case`muted`:return H.selected;case`blue`:return H.selectedBlue;case`cyan`:return H.selectedCyan;case`gray`:return H.selectedGray;case`green`:return H.selectedGreen;case`orange`:return H.selectedOrange;case`pink`:return H.selectedPink;case`purple`:return H.selectedPurple;case`red`:return H.selectedRed;case`teal`:return H.selectedTeal;case`yellow`:return H.selectedYellow;default:return H.selectedUnknown}};function W({label:e,isSelected:t,onChange:n,onClick:i,onMouseUp:a,isDisabled:o=!1,children:s,padding:c,variant:l=`default`,elevation:u=`none`,width:d,height:f,maxWidth:p,ref:h,xstyle:g,className:y,style:x,...S}){let C=(0,j.useRef)(null),w=(0,j.useRef)(null),T=(0,j.useCallback)(e=>{o||n(!t)},[o,t,n]),E=(0,j.useCallback)(e=>{!o&&e.key===`Enter`&&(e.preventDefault(),n(!t))},[o,t,n]),{onClick:D,onMouseUp:O}=m({containerRef:C,interactiveRef:w,onClick:T,disabled:o}),A=i?e=>{D(e),i(e)}:D,M=a?e=>{O(e),a(e)}:O;return(0,P.jsxs)(k,{ref:v(h,C),width:d,height:f,maxWidth:p,padding:c,variant:l,elevation:u,..._(r(`selectable-card`,{variant:l,selected:t?`true`:`false`}),b.focusWithin(),y,x),xstyle:[H.interactive,t&&U(l),!o&&H.overlay,!o&&H.hoverOnPointer,o&&H.disabled,g],onClick:o?void 0:A,onMouseUp:o?void 0:M,...S,children:[(0,P.jsx)(`input`,{ref:w,type:`checkbox`,checked:t,"aria-label":e,disabled:o,onChange:()=>n(!t),onKeyDown:E,className:`x10l6tqk x1i1rx1s xjm9jq1 x1717udv xkdpibf xb3r6kr xzpqnlu xuxw1ft xc342km`}),s]})}W.displayName=`SelectableCard`;var G={page:`_page_1yxii_2`,column:`_column_1yxii_3`,pageTitle:`_pageTitle_1yxii_4`,sections:`_sections_1yxii_5`,section:`_section_1yxii_5`,swatches:`_swatches_1yxii_8`,sample:`_sample_1yxii_9`,sampleSurface:`_sampleSurface_1yxii_10`,sampleDot:`_sampleDot_1yxii_11`,sampleLine:`_sampleLine_1yxii_12`},K=()=>({system:g(`settings.mode.system`),light:g(`settings.mode.light`),dark:g(`settings.mode.dark`)}),q=()=>({stone:[g(`settings.palette.stone`),g(`settings.palette.stoneHint`)],sage:[g(`settings.palette.sage`),g(`settings.palette.sageHint`)],olive:[g(`settings.palette.olive`),g(`settings.palette.oliveHint`)],slate:[g(`settings.palette.slate`),g(`settings.palette.slateHint`)],clay:[g(`settings.palette.clay`),g(`settings.palette.clayHint`)]}),J=e=>e===`stone`?w:O[e],Y=[0,1];function X(){f();let{mode:e,palette:t}=T(),n=d();return(0,P.jsxs)(o,{gap:0,className:G.page,children:[(0,P.jsx)(h,{trail:[{label:g(`settings.title`)}]}),(0,P.jsxs)(o,{gap:0,className:G.column,children:[(0,P.jsxs)(o,{gap:1,className:G.pageTitle,children:[(0,P.jsx)(s,{level:1,children:g(`settings.title`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.subtitle`)})]}),(0,P.jsxs)(o,{gap:0,className:G.sections,children:[(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.language`),children:[(0,P.jsx)(o,{gap:1,children:(0,P.jsx)(s,{level:2,children:g(`settings.language`)})}),(0,P.jsx)(u,{gap:0,children:(0,P.jsxs)(L,{label:g(`settings.language`),value:n,onChange:e=>p(e),children:[(0,P.jsx)(V,{value:`system`,label:g(`settings.language.system`)}),(0,P.jsx)(V,{value:`en`,label:`English`}),(0,P.jsx)(V,{value:`ko`,label:`한국어`})]})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.mode`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.mode`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.modeHint`)})]}),(0,P.jsx)(u,{gap:0,children:(0,P.jsx)(L,{label:g(`settings.mode`),value:e,onChange:e=>D({mode:e}),children:E.map(e=>(0,P.jsx)(V,{value:e,label:K()[e]},e))})})]}),(0,P.jsxs)(o,{as:`section`,gap:3,className:G.section,"aria-label":g(`settings.palette`),children:[(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(s,{level:2,children:g(`settings.palette`)}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:g(`settings.paletteHint`)})]}),(0,P.jsx)(A,{columns:{minWidth:176,repeat:`fit`,max:5},gap:3,children:C.map(e=>{let n=J(e),[r,i]=q()[e];return(0,P.jsx)(W,{label:r,isSelected:t===e,onChange:t=>{t&&D({palette:e})},children:(0,P.jsxs)(o,{gap:3,children:[(0,P.jsx)(o,{gap:0,className:G.swatches,"aria-hidden":`true`,children:Y.map(e=>(0,P.jsx)(u,{gap:2,vAlign:`center`,className:G.sample,style:{background:n.body[e]},children:(0,P.jsxs)(u,{gap:2,vAlign:`center`,className:G.sampleSurface,style:{background:n.surface[e],color:n.text[e]},children:[(0,P.jsx)(o,{gap:0,className:G.sampleDot,style:{background:n.accent[e]}}),(0,P.jsx)(o,{gap:0,className:G.sampleLine,style:{background:n.text[e]}})]})},e))}),(0,P.jsxs)(o,{gap:1,children:[(0,P.jsx)(x,{type:`label`,children:r}),(0,P.jsx)(x,{type:`supporting`,color:`secondary`,children:i})]})]})},e)})})]})]})]})]})}var Z=X;export{Z as component};
@@ -1 +1 @@
1
- import{G as e,H as t,K as n,U as r}from"./page-header-CVCjLFQo.js";var i=class extends r{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(t,r){let{state:i}=t,a=super.createResult(t,r),{isFetching:o,isRefetching:s,isError:c,isRefetchError:l}=a,u=i.fetchMeta?.fetchMore?.direction,d=c&&u===`forward`,f=o&&u===`forward`,p=c&&u===`backward`,m=o&&u===`backward`;return{...a,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:e(r,i.data),hasPreviousPage:n(r,i.data),isFetchNextPageError:d,isFetchingNextPage:f,isFetchPreviousPageError:p,isFetchingPreviousPage:m,isRefetchError:l&&!d&&!p,isRefetching:s&&!f&&!m}}};function a(e,n){return t(e,i,n)}export{a as t};
1
+ import{G as e,J as t,W as n,q as r}from"./page-header-AS8jZ1ve.js";var i=class extends e{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,n){let{state:i}=e,a=super.createResult(e,n),{isFetching:o,isRefetching:s,isError:c,isRefetchError:l}=a,u=i.fetchMeta?.fetchMore?.direction,d=c&&u===`forward`,f=o&&u===`forward`,p=c&&u===`backward`,m=o&&u===`backward`;return{...a,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:r(n,i.data),hasPreviousPage:t(n,i.data),isFetchNextPageError:d,isFetchingNextPage:f,isFetchPreviousPageError:p,isFetchingPreviousPage:m,isRefetchError:l&&!d&&!p,isRefetching:s&&!f&&!m}}};function a(e,t){return n(e,i,t)}export{a as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{V as t,l as n,q as r}from"./themeProps-CkLe5zXY.js";import{u as i}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{_t as a}from"./page-header-CVCjLFQo.js";import{_ as o}from"./Icon-DPaLmsmh.js";var s=e(r(),1),c=n(),l=new Set([`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`]),u={horizontal:[`left`,`right`],vertical:[`up`,`down`],both:[`left`,`right`,`up`,`down`]},d={hint:{kVAEAm:`xixxii4`,kpwlN0:`x1anvkwx`,kogj98:`x1ghz6dp`,kWkggS:`x1prclbq`,kaIpWk:`xh6dtrn`,kGVxlE:`x1i5ehqx`,kLKAdn:`xfsso4q`,kGO01o:`xy143xn`,kZCmMZ:`x12gdq22`,kwRFfy:`x1djylfy`,kGuDYH:`x141an7d`,kLWn49:`x1ltkj2j`,kMwMTN:`xv1l7n4`,khDVqt:`xuxw1ft`,kSiTet:`xg01cxk xofkqq2`,k1ekBW:`xsm4mo9`,kIyJzY:`xx6bhzk`,kzIqYQ:`xd00j3c`,kfzvcC:`x47corl`,$$css:!0}};function f(e={}){let{orientation:n=`horizontal`,dismissAfterMs:r=3e3,isEnabled:f=!0}=e,p=o(),m=(0,s.useRef)(null),h=(0,s.useRef)(!1),g=(0,s.useRef)(!1),_=(0,s.useRef)(()=>{}),v=(0,s.useCallback)(()=>{m.current&&=(clearTimeout(m.current),null)},[]),y=(0,s.useCallback)(()=>{g.current=!0},[]),b=(0,s.useCallback)(()=>{g.current=!1,v(),_.current(null)},[v]),x=i({mode:`context`,onShow:y,onHide:b});_.current=x.ref;let S=(0,s.useCallback)(()=>{h.current=!0,v(),x.hide(),g.current=!1,_.current(null)},[v,x]),C=(0,s.useCallback)(e=>{!h.current&&f&&(_.current(e),x.show(),v(),m.current=setTimeout(()=>{S()},r))},[v,S,r,f,x]);(0,s.useEffect)(()=>()=>{v(),_.current(null)},[v]);let w=(0,s.useCallback)(e=>{if(h.current||!f)return;let t=e.target;if(!t.matches(`:focus-visible`))return;let n=e.currentTarget;e.relatedTarget instanceof Node&&n.contains(e.relatedTarget)||C(t)},[C,f]),T=(0,s.useCallback)(e=>{if(!g.current)return;let t=e.currentTarget;if(e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)){!h.current&&e.relatedTarget instanceof HTMLElement&&_.current(e.relatedTarget);return}S()},[S]),E=(0,s.useCallback)(e=>{g.current&&l.has(e.key)&&S()},[S]),D=(0,c.jsx)(`span`,{className:`x3nfvp2 x6s0dn4 xzye2dw`,children:u[n].map(e=>(0,c.jsx)(a,{keys:e},e))});return{hintElement:x.render((0,c.jsxs)(`span`,{"aria-hidden":`true`,children:[D,(0,c.jsx)(`span`,{className:`x11g1kdw`,children:p(`@astryx.keyboardHint.toNavigate`)})]}),{placement:`below`,alignment:`start`,xstyle:d.hint,style:{marginBlockStart:t[`--spacing-2`]}}),onFocus:w,onBlur:T,onKeyDown:E}}export{f as t};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{V as t,l as n,q as r}from"./themeProps-CkLe5zXY.js";import{u as i}from"./useIsomorphicLayoutEffect-BiEJxDg_.js";import{yt as a}from"./page-header-AS8jZ1ve.js";import{_ as o}from"./Icon-DPaLmsmh.js";var s=e(r(),1),c=n(),l=new Set([`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`]),u={horizontal:[`left`,`right`],vertical:[`up`,`down`],both:[`left`,`right`,`up`,`down`]},d={hint:{kVAEAm:`xixxii4`,kpwlN0:`x1anvkwx`,kogj98:`x1ghz6dp`,kWkggS:`x1prclbq`,kaIpWk:`xh6dtrn`,kGVxlE:`x1i5ehqx`,kLKAdn:`xfsso4q`,kGO01o:`xy143xn`,kZCmMZ:`x12gdq22`,kwRFfy:`x1djylfy`,kGuDYH:`x141an7d`,kLWn49:`x1ltkj2j`,kMwMTN:`xv1l7n4`,khDVqt:`xuxw1ft`,kSiTet:`xg01cxk xofkqq2`,k1ekBW:`xsm4mo9`,kIyJzY:`xx6bhzk`,kzIqYQ:`xd00j3c`,kfzvcC:`x47corl`,$$css:!0}};function f(e={}){let{orientation:n=`horizontal`,dismissAfterMs:r=3e3,isEnabled:f=!0}=e,p=o(),m=(0,s.useRef)(null),h=(0,s.useRef)(!1),g=(0,s.useRef)(!1),_=(0,s.useRef)(()=>{}),v=(0,s.useCallback)(()=>{m.current&&=(clearTimeout(m.current),null)},[]),y=(0,s.useCallback)(()=>{g.current=!0},[]),b=(0,s.useCallback)(()=>{g.current=!1,v(),_.current(null)},[v]),x=i({mode:`context`,onShow:y,onHide:b});_.current=x.ref;let S=(0,s.useCallback)(()=>{h.current=!0,v(),x.hide(),g.current=!1,_.current(null)},[v,x]),C=(0,s.useCallback)(e=>{!h.current&&f&&(_.current(e),x.show(),v(),m.current=setTimeout(()=>{S()},r))},[v,S,r,f,x]);(0,s.useEffect)(()=>()=>{v(),_.current(null)},[v]);let w=(0,s.useCallback)(e=>{if(h.current||!f)return;let t=e.target;if(!t.matches(`:focus-visible`))return;let n=e.currentTarget;e.relatedTarget instanceof Node&&n.contains(e.relatedTarget)||C(t)},[C,f]),T=(0,s.useCallback)(e=>{if(!g.current)return;let t=e.currentTarget;if(e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)){!h.current&&e.relatedTarget instanceof HTMLElement&&_.current(e.relatedTarget);return}S()},[S]),E=(0,s.useCallback)(e=>{g.current&&l.has(e.key)&&S()},[S]),D=(0,c.jsx)(`span`,{className:`x3nfvp2 x6s0dn4 xzye2dw`,children:u[n].map(e=>(0,c.jsx)(a,{keys:e},e))});return{hintElement:x.render((0,c.jsxs)(`span`,{"aria-hidden":`true`,children:[D,(0,c.jsx)(`span`,{className:`x11g1kdw`,children:p(`@astryx.keyboardHint.toNavigate`)})]}),{placement:`below`,alignment:`start`,xstyle:d.hint,style:{marginBlockStart:t[`--spacing-2`]}}),onFocus:w,onBlur:T,onKeyDown:E}}export{f as t};
@@ -14,7 +14,7 @@
14
14
  crossorigin
15
15
  />
16
16
  <title>Gitifact</title>
17
- <script type="module" crossorigin src="/assets/index-BeeP8ZFW.js"></script>
17
+ <script type="module" crossorigin src="/assets/index-IML0_BCy.js"></script>
18
18
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/themeProps-CkLe5zXY.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/useIsomorphicLayoutEffect-BiEJxDg_.js">
@@ -23,46 +23,46 @@
23
23
  <link rel="modulepreload" crossorigin href="/assets/Icon-DPaLmsmh.js">
24
24
  <link rel="modulepreload" crossorigin href="/assets/useScrollLock-D-Y-zHSV.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/container.stylex-rwI38dw9.js">
26
- <link rel="modulepreload" crossorigin href="/assets/page-header-CVCjLFQo.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/page-header-AS8jZ1ve.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/IconButton-Br-4XhQr.js">
28
28
  <link rel="modulepreload" crossorigin href="/assets/useDevWarning-Dudfg3qF.js">
29
- <link rel="modulepreload" crossorigin href="/assets/Table-XuC9zK9w.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/Table-DjTkmoR7.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/Tooltip-MoU3alsv.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/useClipboard-Cqx6Upy7.js">
32
- <link rel="modulepreload" crossorigin href="/assets/Markdown-ev4hMr67.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/Markdown-B1P3lpA0.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/appearance-DyJA06C4.js">
34
- <link rel="modulepreload" crossorigin href="/assets/document-DPtVyR5y.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/document-kGFspd5u.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/HoverCard-Bpt8LVFT.js">
36
- <link rel="modulepreload" crossorigin href="/assets/Token-BV_4bSkY.js">
37
- <link rel="modulepreload" crossorigin href="/assets/HgiRefresh-CAJ0Xdvi.js">
38
- <link rel="modulepreload" crossorigin href="/assets/document-Q3lvgyX8.js">
36
+ <link rel="modulepreload" crossorigin href="/assets/Token-D337a1e3.js">
37
+ <link rel="modulepreload" crossorigin href="/assets/HgiRefresh-BSPkIVFZ.js">
38
+ <link rel="modulepreload" crossorigin href="/assets/document-7jVYmB_Z.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/Section-Z2PuhE6c.js">
40
- <link rel="modulepreload" crossorigin href="/assets/Selector-CGOdL2eo.js">
41
- <link rel="modulepreload" crossorigin href="/assets/lazyRouteComponent-D4lq6X5s.js">
42
- <link rel="modulepreload" crossorigin href="/assets/useKeyboardHint-DN1hAi8g.js">
43
- <link rel="modulepreload" crossorigin href="/assets/Tab-BwJj0rUr.js">
44
- <link rel="modulepreload" crossorigin href="/assets/useInfiniteQuery-03AIcFvA.js">
45
- <link rel="modulepreload" crossorigin href="/assets/load-more-CymfxLt7.js">
46
- <link rel="modulepreload" crossorigin href="/assets/contributor-Bs3RWHQv.js">
47
- <link rel="modulepreload" crossorigin href="/assets/activity-timeline-Dmc-97N6.js">
48
- <link rel="modulepreload" crossorigin href="/assets/commit-BcdbBdP4.js">
40
+ <link rel="modulepreload" crossorigin href="/assets/Selector-BG3Gd_OR.js">
41
+ <link rel="modulepreload" crossorigin href="/assets/lazyRouteComponent-tJOK5sxC.js">
42
+ <link rel="modulepreload" crossorigin href="/assets/useKeyboardHint-D5jGavym.js">
43
+ <link rel="modulepreload" crossorigin href="/assets/Tab-RKLZrCiK.js">
44
+ <link rel="modulepreload" crossorigin href="/assets/useInfiniteQuery-C0rB-9Ci.js">
45
+ <link rel="modulepreload" crossorigin href="/assets/load-more-DVsjzCxE.js">
46
+ <link rel="modulepreload" crossorigin href="/assets/contributor-D1TZSDq9.js">
47
+ <link rel="modulepreload" crossorigin href="/assets/activity-timeline-Bl6a55GR.js">
48
+ <link rel="modulepreload" crossorigin href="/assets/commit-Cj7mcn9u.js">
49
49
  <link rel="modulepreload" crossorigin href="/assets/Grid-DCCm_m5g.js">
50
50
  <link rel="modulepreload" crossorigin href="/assets/MetadataListItem-BEwPg27H.js">
51
- <link rel="modulepreload" crossorigin href="/assets/features-CmvypKgf.js">
52
- <link rel="modulepreload" crossorigin href="/assets/search-CSSuO-jR.js">
53
- <link rel="modulepreload" crossorigin href="/assets/contributors-B_bVSY4J.js">
54
- <link rel="modulepreload" crossorigin href="/assets/instructions-D3-EfbZG.js">
51
+ <link rel="modulepreload" crossorigin href="/assets/features-CBeEOrok.js">
52
+ <link rel="modulepreload" crossorigin href="/assets/search-CbtiuqNx.js">
53
+ <link rel="modulepreload" crossorigin href="/assets/contributors-lkpVuCXS.js">
54
+ <link rel="modulepreload" crossorigin href="/assets/instructions-Qhbd8_KG.js">
55
55
  <link rel="stylesheet" crossorigin href="/assets/page-header-DTEyUWBS.css">
56
56
  <link rel="stylesheet" crossorigin href="/assets/document-Drgtj94X.css">
57
- <link rel="stylesheet" crossorigin href="/assets/Token-Bqkc8eyB.css">
57
+ <link rel="stylesheet" crossorigin href="/assets/Token-CKcN25HT.css">
58
58
  <link rel="stylesheet" crossorigin href="/assets/document-Cmx0e6kz.css">
59
59
  <link rel="stylesheet" crossorigin href="/assets/contributor-2mkEa2Wo.css">
60
60
  <link rel="stylesheet" crossorigin href="/assets/activity-timeline-BEeyw2GA.css">
61
61
  <link rel="stylesheet" crossorigin href="/assets/commit-DVyOH45R.css">
62
- <link rel="stylesheet" crossorigin href="/assets/features-DUHxz0_L.css">
62
+ <link rel="stylesheet" crossorigin href="/assets/features-FKxsPKab.css">
63
63
  <link rel="stylesheet" crossorigin href="/assets/contributors-CPdOQKMF.css">
64
64
  <link rel="stylesheet" crossorigin href="/assets/instructions-2OUMP-vh.css">
65
- <link rel="stylesheet" crossorigin href="/assets/index-D1JeDnJc.css">
65
+ <link rel="stylesheet" crossorigin href="/assets/index-CswY1wJ4.css">
66
66
  </head>
67
67
  <body>
68
68
  <div id="root"></div>
@@ -1,3 +1,18 @@
1
+ ## 0.8.5 - 2026-09-27
2
+ ### Added
3
+ - The browser has a history page for one document (`/records/docs/<document ID>`). It shows every commit that changed the document, newest first, each record with its title and the start of its decision, and opens the context and alternatives in place. Links such as "Change history of this requirement →" on features, instructions and records lead there.
4
+ - A commit address with only the start of its hash, such as `/records/commits/<7 or more characters>`, opens that commit's page.
5
+ - `check` and `changes list` warn with `DESIGN_OVERVIEW_LARGE` when a design `overview.md` has seven or more sections, so splitting it is considered. The warning does not block a commit.
6
+ - `changes list` and `changes commit` show `REQUIREMENT_SCOPE_FORMAT` and `REQUIREMENT_CRITERIA_FORMAT` warnings, one per line, when a requirement changed in this work leaves the guide's shape. `check` does not give them, so existing requirements are brought into shape when they are revised.
7
+ ### Changed
8
+ - The records list has new filters: target (a feature or an instruction) instead of feature, document kind (feature overview, requirement, design, instruction) instead of specification type, and "changes without a record" instead of change type. The list shows the commits that hold a matching change; a card keeps the records that explain those changes and counts the commit's other records and each decision's other documents. A card's record and document counts are the whole commit's.
9
+ - The records list's search and `records list --q` look at the same fields as the search box: a record's title, ID and sections, a document's ID and title, and the start of a commit hash (7 or more characters). `records list --q` no longer searches commit messages.
10
+ - The records list shows up to three documents changed without a record and leaves the rest to the commit page.
11
+ - The requirement format is set: the user story, then `### Scope and constraints` (optional, `-` items only), then `### Acceptance criteria` (numbered items only). A scope item is one rule that is either true or false; a quality target for one feature carries a number, and system-wide targets go in one common feature. Screen layout, APIs and storage details belong in the design (`guide show spec`). The `specs new requirement` skeleton follows this order.
12
+ - Revising in `guide show design` now asks to check the splitting and diagram criteria against the whole document, and to ask the user before adding to one that is already past the point of splitting.
13
+ - Moving between browser screens covers the card with an opaque, unblurred cover until the next screen is drawn whole, then fades only the cover. Choosing a document beside a list on record and commit pages works the same way, and hovering the list reads it ahead. A requirement or design section a link opens on is no longer hatched.
14
+ - The browser server answers with its last read of the checkout while the repository has not changed.
15
+
1
16
  ## 0.8.4 - 2026-09-27
2
17
  ### Changed
3
18
  - Agents no longer leave installing or updating Gitifact to the user. They show the exact install command, ask whether to run it, and install it themselves once allowed. In Claude Code's auto mode, replying "yes" to a question that names the command is enough. If the tool still blocks it, the agent points to that tool's approval prompt or permission setting. Run `update` to refresh the instruction block.
@@ -69,3 +69,5 @@ When shaping a new feature, write requirements and design together by default. I
69
69
  Before revising, read the feature's design files and the related requirements, and change only the files affected. Rewrite the sentences that changed instead of appending “previously we …” sentences. How it changed goes into a record, and Git keeps the old text. When a decision changes, change the rule in the body and write a new record. When a requirement changes, review the designs that point to it ("Referenced by" in `gitifact specs show <R-ID>`); when only the design changes, do not force changes to requirements.
70
70
 
71
71
  When splitting a large file into axes or merging files, only move sentences; do not edit content in the same commit. After moving, check that every sentence of the old file is present in the new files. Keep IDs when moving files, and make sure the `requirements` of a deleted file moved to the remaining files. A commit that only moves sentences needs no record.
72
+
73
+ When revising an existing design, check the splitting, diagram and Alert criteria against the whole document before adding to it. A file with no axis files or pictures yet is no reason to add one more section in the same shape. When it is already past the point of splitting, ask the user before adding whether to split it first in a commit that only moves sentences. `check` and `changes list` warn with `DESIGN_OVERVIEW_LARGE` when `overview.md` has seven or more `##` sections. The warning does not block a commit.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Requirement format
3
- description: Feature and requirement files, frontmatter, user stories and acceptance criteria, creating, editing and moving
3
+ description: Feature and requirement files, frontmatter, user stories, scope and constraints and acceptance criteria, where quality targets go, creating, editing and moving
4
4
  ---
5
5
 
6
6
  A feature is one folder, `.gitifact/spec/<feature>/`. The feature introduction is `index.md`, each requirement is its own `requirements/<slug>.md`, and the design is the files under `design/` (`gitifact guide show design`). Why a document changed is kept in records (`.gitifact/records/`, `gitifact guide show records`).
@@ -38,13 +38,18 @@ order: 10
38
38
 
39
39
  As a post author, I want to save a title and body so that I can return to my writing later.
40
40
 
41
+ ### Scope and constraints
42
+
43
+ - A title takes up to 100 characters.
44
+ - Uploading attachments is not part of this requirement.
45
+
41
46
  ### Acceptance criteria
42
47
 
43
48
  1. Condition: The user requests a save with an empty title.
44
49
  Expected: The system asks for a title and does not save the post.
45
50
  ```
46
51
 
47
- These IDs and sentences illustrate the structure and are not valid input.
52
+ These IDs and sentences illustrate the structure and are not valid input. The body is the user story, `### Scope and constraints` (left out when there is none), then `### Acceptance criteria`.
48
53
 
49
54
  - **`id`:** issued by the CLI. Features use `S-`, requirements `R-`, followed by ten lowercase base32 characters. It stays the same when the file moves or its title changes.
50
55
  - **`title` and `description`:** required, one line each. Do not repeat the title as a `#` heading in the body. Write the description so that the list (`specs list`) tells what the document is without opening it.
@@ -84,15 +89,35 @@ Do not duplicate a document under a new ID when moving or renaming it, and do no
84
89
 
85
90
  ## Grouping features
86
91
 
87
- Group requirements into cohesive features that mean something to users. Do not reproduce code modules or DDD layers. Before creating a feature, check whether an existing one is a suitable home. Use the feature name as its title without a suffix such as “requirements.” Slugs and folder names use lowercase letters, digits and hyphens.
92
+ Group requirements into cohesive features that mean something to users. Do not reproduce code modules or DDD layers. Before creating a feature, check whether an existing one is a suitable home. A common feature that gathers system-wide quality targets (see "Scope and constraints" below) is the exception. Use the feature name as its title without a suffix such as “requirements.” Slugs and folder names use lowercase letters, digits and hyphens.
88
93
 
89
94
  ## User stories and acceptance criteria
90
95
 
91
96
  Start each requirement with a user story: one or two sentences explaining who wants what and why. The default pattern is “As a [role], I want [goal] so that [reason],” expressed naturally in the project's language. Use an actual user or operator of the product. Do not copy the post author in this example, or a Gitifact user, into an unrelated product.
92
97
 
93
- Follow the story with an acceptance-criteria heading (`###`) and numbered condition/expected pairs, in the project's language. Do not substitute paths, IDs or storage conventions for user goals. Put additional agreed constraints in a scope-and-constraints section and implementation details in the design. Base roles, goals and reasons on the conversation and verified context. Do not invent motives to fill the template; ask only for information needed to settle the meaning.
98
+ The acceptance-criteria section (`###`) holds numbered condition/expected pairs only, in the project's language, with no paragraphs added outside them. Do not substitute paths, IDs or storage conventions for user goals. Base roles, goals and reasons on the conversation and verified context. Do not invent motives to fill the template; ask only for information needed to settle the meaning.
99
+
100
+ Apply this to new requirements and those being revised for the current request. Preserve existing IDs, agreed constraints and the meaning of acceptance criteria. Do not rewrite unrelated requirements in bulk. When done, check that the story states a role, goal and reason, and that its criteria determine success or failure. `changes list` and `changes commit` warn with `REQUIREMENT_SCOPE_FORMAT` or `REQUIREMENT_CRITERIA_FORMAT` when a requirement changed in this work leaves this order and shape. The warnings do not block a commit, and `check` does not give them. The CLI does not validate what sentences mean or what the user intends.
101
+
102
+ ## Scope and constraints
103
+
104
+ `### Scope and constraints` is optional. It comes after the user story and before the acceptance criteria, as `-` items only. Each item is one independent rule that is either true or false.
105
+
106
+ - Put business rules (input limits, retention, the result of sending the same request twice) and what is not provided yet ("… is not part of this requirement") here.
107
+ - A rule whose result can be checked in a given situation becomes an acceptance criterion instead. Do not write the same rule in both places.
108
+ - A quality target for this feature alone (performance, availability, security, accessibility, compatibility) is one item with a number. Example: "- One page of the list shows within 1 second for 95% of requests." Do not write targets without an agreed number ("fast", "stable").
109
+
110
+ System-wide quality targets (response time of every query, supported browsers, session expiry) are not repeated per requirement; gather them in one common feature. For example, `.gitifact/spec/quality/` holds one target per requirement, with what can be judged written as acceptance criteria. Do not put them in project instructions: instructions describe how to work, and what the product promises belongs in the specs.
111
+
112
+ ## What stays out of a requirement
113
+
114
+ A requirement says what to build, as results the user can check. Keep the following in the design (ui, interface, data). In a requirement, every design or screen change would also change the requirement and add records.
115
+
116
+ - Screen layout, components, the columns a table shows, items per page, the shape of addresses
117
+ - API paths, field names, storage structure
118
+ - The libraries used, and details settled only after implementation
94
119
 
95
- Apply this to new requirements and those being revised for the current request. Preserve existing IDs, agreed constraints and the meaning of acceptance criteria. Do not rewrite unrelated requirements in bulk. When done, check that the story states a role, goal and reason, and that its criteria determine success or failure. The CLI does not enforce particular sentences or validate user intent.
120
+ Example: instead of "each row shows the applicant, period and status columns", write "the user can tell applications apart by applicant, period and status".
96
121
 
97
122
  Follow `gitifact guide show writing` for prose. Its style rules do not replace the user-story pattern and the condition/expected format above. Write project content in the project's language; the language of these instructions does not change it.
98
123
 
@@ -1,3 +1,18 @@
1
+ ## 0.8.5 - 2026-09-27
2
+ ### Added
3
+ - 브라우저에 문서 이력 페이지(`/records/docs/<문서 ID>`)가 생겼습니다. 한 문서를 바꾼 커밋을 최신순으로 보이고, 결정기록은 제목과 결정 첫머리를 보인 뒤 그 자리에서 맥락·대안을 펼칩니다. 기능·지침·기록 상세의 "이 요구사항의 변경 이력 →" 같은 링크가 이 페이지로 옵니다.
4
+ - `/records/commits/<7자 이상>`처럼 해시 앞부분만 적은 커밋 주소도 그 커밋 페이지로 엽니다.
5
+ - 설계 `overview.md`의 절이 7개 이상이면 `check`와 `changes list`가 `DESIGN_OVERVIEW_LARGE` 경고로 나눌지 검토하게 합니다. 커밋은 막지 않습니다.
6
+ - `changes list`와 `changes commit`이 이번에 바뀐 요구사항이 가이드의 형식을 벗어나면 `REQUIREMENT_SCOPE_FORMAT`·`REQUIREMENT_CRITERIA_FORMAT` 경고를 줄마다 보입니다. `check`는 이 경고를 내지 않아, 기존 요구사항은 고칠 때 하나씩 맞추면 됩니다.
7
+ ### Changed
8
+ - 결정기록 목록의 필터를 바꿨습니다. 기능 대신 대상(기능이나 지침), 명세 종류 대신 문서 종류(기능 개요·요구사항·설계·지침), 변경 종류 대신 "결정기록 없는 변경"으로 거릅니다. 목록은 맞는 변경이 있는 커밋을 보이고, 카드에는 그 변경을 설명하는 결정기록만 둔 채 커밋의 다른 기록과 결정의 다른 문서는 수로 잇습니다. 카드의 기록·문서 수는 커밋 전체입니다.
9
+ - 결정기록 목록의 검색어와 `records list --q`가 검색창과 같은 필드를 찾습니다. 결정기록의 제목·ID·본문, 문서의 ID·제목, 7자 이상의 커밋 해시 앞부분입니다. `records list --q`는 이제 커밋 메시지를 찾지 않습니다.
10
+ - 결정기록 목록에서 결정기록 없이 바뀐 문서도 3개까지 보이고 나머지는 커밋 페이지로 잇습니다.
11
+ - 요구사항 형식을 정했습니다. 본문은 사용자 스토리, `### 범위와 제약`(선택, `-` 목록), `### 수용 조건`(번호 항목만) 순서입니다. 범위와 제약의 한 항목은 참·거짓을 가릴 규칙 한 문장이고, 기능 하나의 품질 목표는 수치로, 시스템 전체 목표는 공통 기능 한 곳에 둡니다. 화면 배치·API·저장 구조 같은 세부는 설계에 둡니다(`guide show spec`). `specs new requirement`의 뼈대도 이 순서입니다.
12
+ - `guide show design`의 개정 절이 기존 설계를 고칠 때 나누기·그림 기준을 문서 전체에 다시 대조하고, 이미 클 때는 먼저 나눌지 사용자에게 묻게 합니다.
13
+ - 브라우저의 페이지 이동은 블러 없는 불투명 덮개로 본문을 가린 채 다음 화면을 다 그린 뒤, 덮개만 서서히 걷습니다. 기록·커밋 페이지에서 목록 옆 문서를 고를 때도 같은 방식으로 바뀌고, 목록에 마우스를 올리면 미리 불러옵니다. 링크로 들어온 요구사항·설계 절에는 빗금을 깔지 않습니다.
14
+ - 브라우저 서버는 저장소가 바뀌지 않았으면 체크아웃을 다시 읽지 않고 마지막 답을 씁니다.
15
+
1
16
  ## 0.8.4 - 2026-09-27
2
17
  ### Changed
3
18
  - 에이전트가 Gitifact 설치와 업데이트를 사용자에게 넘기지 않습니다. 설치 명령을 그대로 보여 주며 실행해도 되는지 묻고, 허용하면 직접 설치합니다. Claude Code 자동 모드에서도 명령이 담긴 질문에 "네"라고만 답하면 진행됩니다. 도구가 그래도 막으면 에이전트가 그 도구의 승인 창이나 권한 설정을 안내합니다. `update`로 지침 블록을 갱신하세요.
@@ -69,3 +69,5 @@ sources:
69
69
  개정 전에 그 기능의 설계 파일들과 관련 요구사항을 읽고 영향을 받는 파일만 고친다. 바뀐 문장은 고쳐 쓰고 '전에는 …했다'는 문장을 덧붙이지 않는다. 바뀐 경위는 결정기록에 쓰고 과거 원문은 Git이 보존한다. 결정이 바뀌면 본문의 규칙을 고치고 새 결정기록을 쓴다. 요구사항을 바꾸면 그것을 가리키는 설계도 검토하고(`gitifact specs show <R-ID>`의 "가리키는 문서"), 설계만 바뀌면 요구사항을 억지로 고치지 않는다.
70
70
 
71
71
  한 파일이 커져 축을 나누거나 합칠 때는 문장을 옮기기만 하고 같은 커밋에서 내용을 고치지 않는다. 옮긴 뒤 옛 파일의 문장이 새 파일들에 빠짐없이 있는지 대조한다. 파일을 옮겨도 ID는 그대로 두고, 지운 파일의 `requirements`가 남은 파일로 옮겨졌는지 확인한다. 옮기기만 한 커밋에는 결정기록을 쓰지 않아도 된다.
72
+
73
+ 기존 설계를 고칠 때는 덧붙이기 전에 파일 나누기와 다이어그램·Alert 기준을 그 문서 전체에 다시 대조한다. 기존 문서에 축 분리나 그림이 없다고 같은 모양으로 한 절 더하지 않는다. 이미 나눌 기준을 넘었으면, 덧붙이기 전에 옮기기만 하는 커밋으로 먼저 나눌지 사용자에게 묻는다. `overview.md`의 절(`##`)이 7개 이상이면 `check`와 `changes list`가 `DESIGN_OVERVIEW_LARGE` 경고로 알린다. 경고는 커밋을 막지 않는다.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: 요구사항 형식
3
- description: 기능과 요구사항 파일의 구조, 프론트매터, 사용자 스토리와 수용 조건, 만들기·고치기·옮기기
3
+ description: 기능과 요구사항 파일의 구조, 프론트매터, 사용자 스토리·범위와 제약·수용 조건, 품질 목표의 자리, 만들기·고치기·옮기기
4
4
  ---
5
5
 
6
6
  기능 하나는 `.gitifact/spec/<기능>/` 폴더 하나다. 기능 소개는 `index.md`, 요구사항은 `requirements/<slug>.md`에 하나씩, 설계는 `design/` 아래 파일들(`gitifact guide show design`)이다. 문서가 왜 바뀌었는지는 결정기록(`.gitifact/records/`)이 남긴다(`gitifact guide show records`).
@@ -38,13 +38,18 @@ order: 10
38
38
 
39
39
  게시물 작성자로서, 작성한 글을 나중에 다시 확인하기 위해 제목과 내용을 저장하고 싶다.
40
40
 
41
+ ### 범위와 제약
42
+
43
+ - 제목은 100자까지 받는다.
44
+ - 첨부 파일 올리기는 이 요구사항에 들지 않는다.
45
+
41
46
  ### 수용 조건
42
47
 
43
48
  1. 조건: 사용자가 제목을 비운 채 저장을 요청합니다.
44
49
  기대 동작: 시스템은 제목 입력 안내를 표시하고 저장을 중단합니다.
45
50
  ```
46
51
 
47
- 위 ID와 문장은 구조 설명이며 유효한 입력이 아니다.
52
+ 위 ID와 문장은 구조 설명이며 유효한 입력이 아니다. 본문은 사용자 스토리, `### 범위와 제약`(없으면 뺀다), `### 수용 조건` 순서다.
48
53
 
49
54
  - **`id`:** CLI가 발급한 값이다. 기능은 `S-`, 요구사항은 `R-`, 뒤는 소문자 base32 10자다. 파일을 옮기거나 제목을 바꿔도 그대로 둔다.
50
55
  - **`title`·`description`:** 필수이며 한 줄이다. 제목은 본문에 `#`로 다시 쓰지 않는다. 설명은 목록(`specs list`)에서 본문을 열지 않고도 무엇인지 알 수 있게 쓴다.
@@ -84,15 +89,35 @@ order: 10
84
89
 
85
90
  ## 기능으로 묶는 기준
86
91
 
87
- 사용자에게 의미 있는 응집된 기능으로 묶는다. 코드 모듈이나 DDD 계층을 그대로 복제하지 않는다. 새 기능을 만들기 전에 기존 기능에 넣을 수 있는지 먼저 확인한다. 기능 제목은 기능 이름 그대로 쓰고 "요구사항" 같은 접미어를 붙이지 않는다. slug와 폴더 이름은 소문자·숫자·하이픈이다.
92
+ 사용자에게 의미 있는 응집된 기능으로 묶는다. 코드 모듈이나 DDD 계층을 그대로 복제하지 않는다. 새 기능을 만들기 전에 기존 기능에 넣을 수 있는지 먼저 확인한다. 시스템 전체의 품질 목표를 모은 공통 기능(아래 "범위와 제약")은 이 기준의 예외다. 기능 제목은 기능 이름 그대로 쓰고 "요구사항" 같은 접미어를 붙이지 않는다. slug와 폴더 이름은 소문자·숫자·하이픈이다.
88
93
 
89
94
  ## 사용자 스토리와 수용 조건
90
95
 
91
96
  각 요구사항의 본문은 사용자 스토리로 시작한다. 누가 어떤 목표를 이루려 하며 왜 필요한지를 한두 문장으로 표현한다. 기본 문형은 “[역할]로서, [이유]를 위해 [목표]하고 싶다.”이며 프로젝트의 언어에 맞게 자연스럽게 쓴다. 역할은 해당 제품의 실제 사용자나 운영자 등이며, 이 문서의 게시물 예시나 Gitifact 사용자를 다른 제품에 그대로 대입하지 않는다.
92
97
 
93
- 사용자 스토리 아래에는 `### 수용 조건`과 번호별 `조건: / 기대 동작:` 형식을 유지한다. 파일 경로·ID·저장 규약으로 사용자 목표를 대신하지 않는다. 별도로 필요한 확정 제약은 `### 범위와 제약`에 두고, 내부 구현 방식은 설계에 둔다. 역할·목표·이유는 대화와 확인한 맥락에 근거하며, 모르는 동기를 만들어 문형을 채우지 않는다. 의미를 결정할 정보가 부족하면 필요한 부분만 질문한다.
98
+ `### 수용 조건`에는 번호별 `조건: / 기대 동작:` 항목만 둔다. 항목 밖에 문단을 덧붙이지 않는다. 파일 경로·ID·저장 규약으로 사용자 목표를 대신하지 않는다. 역할·목표·이유는 대화와 확인한 맥락에 근거하며, 모르는 동기를 만들어 문형을 채우지 않는다. 의미를 결정할 정보가 부족하면 필요한 부분만 질문한다.
99
+
100
+ 새 요구사항과 요청받아 개정하는 요구사항에 적용한다. 기존 문서를 정리할 때 ID·확정된 제약·수용 조건의 의미를 보존하고, 이번 작업과 무관한 요구사항을 일괄 개정하지 않는다. 다 쓴 뒤에는 스토리의 역할·목표·이유가 드러나는지, 수용 조건이 그 목표의 성공·실패를 판정하는지 대조한다. `changes list`와 `changes commit`은 이번에 바뀐 요구사항이 이 순서와 모양을 벗어나면 `REQUIREMENT_SCOPE_FORMAT`·`REQUIREMENT_CRITERIA_FORMAT` 경고로 알린다. 경고는 커밋을 막지 않으며, `check`는 이 경고를 내지 않는다. CLI는 문장의 뜻이나 사용자 의도는 검증하지 않는다.
101
+
102
+ ## 범위와 제약
103
+
104
+ `### 범위와 제약`은 선택이고, 사용자 스토리 다음, 수용 조건 앞에 `-` 목록으로만 쓴다. 한 항목은 참·거짓을 가릴 수 있는 독립된 규칙 한 문장이다.
105
+
106
+ - 업무 규칙(입력 상한, 보존 기간, 같은 요청을 두 번 보냈을 때의 결과 등)과 아직 제공하지 않는 범위("…는 이 요구사항에 들지 않는다")를 둔다.
107
+ - 특정 상황에서 결과로 확인할 수 있는 규칙은 수용 조건 항목으로 올린다. 같은 규칙을 두 곳에 쓰지 않는다.
108
+ - 이 기능에만 해당하는 품질 목표(성능·가용성·보안·접근성·호환성)는 수치를 넣은 한 항목으로 쓴다. 예: "- 목록 한 쪽은 요청의 95%에서 1초 안에 보여 준다." 수치가 합의되지 않은 목표("빠르게", "안정적으로")는 쓰지 않는다.
109
+
110
+ 시스템 전체에 해당하는 품질 목표(모든 조회의 응답 시간, 지원 브라우저, 세션 만료 등)는 요구사항마다 되풀이하지 않고 공통 기능 한 곳에 모은다. 예: `.gitifact/spec/quality/`의 요구사항마다 목표 하나를 두고, 판정할 수 있는 것은 수용 조건으로 쓴다. 프로젝트 지침에는 두지 않는다. 지침은 일하는 방식이고, 제품이 지킬 약속은 명세다.
111
+
112
+ ## 요구사항에 두지 않을 것
113
+
114
+ 요구사항은 무엇을 만들지, 사용자가 확인할 수 있는 결과로 말한다. 아래는 설계(ui·interface·data)에 둔다. 요구사항에 들어가면 설계나 화면을 바꿀 때마다 요구사항과 결정기록까지 바뀐다.
115
+
116
+ - 화면 배치, 컴포넌트, 표에 보일 열, 한 쪽의 건수, 주소 모양
117
+ - API 경로, 필드 이름, 저장 구조
118
+ - 쓰는 라이브러리나 구현 뒤에야 정해지는 세부
94
119
 
95
- 새 요구사항과 요청받아 개정하는 요구사항에 적용한다. 기존 문서를 정리할 때 ID·확정된 제약·수용 조건의 의미를 보존하고, 이번 작업과 무관한 요구사항을 일괄 개정하지 않는다. 다 쓴 뒤에는 스토리의 역할·목표·이유가 드러나는지, 수용 조건이 그 목표의 성공·실패를 판정하는지 대조한다. CLI는 특정 문장이나 사용자 의도를 강제·검증하지 않는다.
120
+ 예: "행마다 신청자·기간·상태 열을 보여 준다" 대신 "사용자는 신청자·기간·상태로 신청을 구분할 수 있다".
96
121
 
97
122
  본문의 문체는 `gitifact guide show writing`을 따른다. 그 문서의 문체 규칙은 위 사용자 스토리 문형과 `조건: / 기대 동작:` 형식을 대체하지 않는다.
98
123